(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))a(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function r(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function a(n){if(n.ep)return;n.ep=!0;const i=r(n);fetch(n.href,i)}})();const od="ocp.lang",ld=["ko","en"],ud="ko",Sl={ko:{"app.title":"Ontology Crawler","app.subtitle":"프로젝트 크롤, 온톨로지 매핑, 클레임 리뷰, 추천 태그","header.refresh":"새로고침","header.lang.ko":"한","header.lang.en":"EN","sidebar.projects":"프로젝트","sidebar.config_path":"설정 파일 경로","sidebar.create_project":"프로젝트 생성","sidebar.reset_project":"현재 프로젝트 데이터 리셋","sidebar.crawl":"크롤","sidebar.source":"소스","sidebar.url_or_seed":"URL / 시드 URL","sidebar.analyzer":"분석기","sidebar.model":"모델","sidebar.base_url":"Base URL","sidebar.test_analyzer":"분석기 테스트","sidebar.discover":"링크 탐색","sidebar.crawl_url":"URL 크롤","sidebar.max_depth":"최대 깊이","sidebar.max_pages":"최대 페이지","sidebar.same_domain":"같은 도메인만","sidebar.crawl_site":"시드부터 사이트 크롤","sidebar.stop_crawl":"현재 크롤 중지","tabs.overview":"개요","tabs.graph":"그래프","tabs.ontology":"온톨로지","tabs.entities":"엔티티","tabs.claims":"클레임","tabs.debug":"디버그","tabs.research":"리서치","tabs.tags":"태그","tabs.recommend":"추천","graph.search_placeholder":"엔티티명 검색...","graph.entity_type_all":"전체 타입","graph.predicate_all":"전체 관계","graph.min_confidence":"최소 신뢰도","graph.layout":"레이아웃","graph.layout.cose":"Force","graph.layout.circle":"원형","graph.layout.concentric":"동심원","graph.layout.grid":"그리드","graph.layout.breadthfirst":"트리","graph.reload":"그래프 새로고침","graph.fit":"맞춤","graph.empty":"아직 데이터가 없습니다. 크롤이 클레임을 만들면 그래프에 노드가 나타납니다.","graph.stats.nodes":"노드","graph.stats.edges":"엣지","graph.stats.shown":"표시","overview.project":"프로젝트","overview.domain":"도메인","overview.sources":"소스","overview.entities":"엔티티","overview.sources_heading":"소스","pipeline.heading":"파이프라인","pipeline.refresh":"새로고침","pipeline.stage.crawled":"크롤됨","pipeline.stage.extracted":"추출됨","pipeline.stage.claims":"클레임","pipeline.stage.validated":"승인됨","pipeline.stage.graph":"그래프 트리플","pipeline.retained":"유지율","pipeline.entity_types_heading":"엔티티 타입 분포","pipeline.recent_pages":"최근 페이지","pipeline.recent_claims":"최근 클레임","pipeline.empty.pages":"아직 크롤된 페이지가 없습니다.","pipeline.empty.claims":"아직 생성된 클레임이 없습니다.","search.placeholder":"엔티티 · 클레임 · 페이지 검색...","search.aria_label":"전역 검색","search.group.entities":"엔티티","search.group.claims":"클레임","search.group.pages":"페이지","search.group.predicates":"술어","search.empty":"결과 없음","search.hint":"최소 1글자 이상 입력하세요","table.name":"이름","table.type":"타입","table.trust":"신뢰도","table.robots":"robots","table.rate":"속도제한","table.domain":"도메인","table.status":"상태","table.confidence":"신뢰도","table.relation":"관계","table.subject":"주체","table.object":"객체","table.support":"근거 수","table.predicate":"술어","table.tag":"태그","table.brand":"브랜드","table.product":"상품","table.count":"수","table.no_data":"데이터 없음.","table.id":"ID","table.metadata":"메타데이터","table.reason":"사유","table.gap":"갭","table.target":"대상","table.priority":"우선순위","table.description":"설명","table.score":"점수","table.reasons":"근거","ontology.refresh_registry":"레지스트리 새로고침","ontology.configured_entity_types":"설정된 엔티티 타입","ontology.configured_predicates":"설정된 술어","ontology.registry_entity_types":"레지스트리 엔티티 타입","ontology.registry_relation_types":"레지스트리 관계 타입","ontology.triples":"온톨로지 트리플","ontology.proposals":"스키마 제안","ontology.knowledge_gaps":"지식 갭","entities.all_types":"전체 타입","entities.load":"불러오기","entities.merge_source_placeholder":"병합할 엔티티 ID","entities.merge_target_placeholder":"유지할 엔티티 ID","entities.merge":"병합","claims.show_candidates":"후보 포함","claims.refresh":"클레임 새로고침","claims.save":"저장","claims.confidence_label":"신뢰도","claims.reason_label":"사유","workbench.status_filter":"상태","workbench.status.all":"전체","workbench.status.active":"활성","workbench.status.validated_claim":"승인됨","workbench.status.rejected":"거절됨","workbench.search_placeholder":"주체/술어/객체 검색...","workbench.predicate_filter":"관계","workbench.predicate_all":"전체 관계","workbench.empty":"표시할 클레임이 없습니다.","workbench.select_hint":"왼쪽 목록에서 클레임을 선택하세요.","workbench.bulk_count":"{count}개 선택됨","workbench.action.accept":"승인","workbench.action.reject":"거절","workbench.action.unreview":"리뷰 취소","workbench.action.save_confidence":"신뢰도 저장","workbench.action.accept_similar":"동일 술어+객체 일괄 승인","workbench.shortcuts":"단축키","workbench.shortcut.nav":"J/K · 이동","workbench.shortcut.accept":"A · 승인","workbench.shortcut.reject":"R · 거절","workbench.shortcut.bulk_accept":"Shift+A · 선택 일괄 승인","workbench.shortcut.bulk_reject":"Shift+R · 선택 일괄 거절","workbench.shortcut.toggle":"Space · 선택 토글","workbench.shortcut.search":"/ · 검색","workbench.shortcut.escape":"Esc · 선택 해제","workbench.detail.subject":"주체","workbench.detail.predicate":"술어","workbench.detail.object":"객체","workbench.detail.status":"상태","workbench.detail.confidence":"신뢰도","workbench.detail.evidence":"근거 텍스트","workbench.detail.source":"출처","workbench.detail.page":"페이지","workbench.detail.breakdown":"신뢰도 분해","workbench.detail.reason_placeholder":"사유 (선택)","workbench.toast.reviewed":"리뷰 적용됨","workbench.toast.bulk_done":"{count}개 적용됨","debug.refresh_logs":"추출 로그 새로고침","research.heading":"그래프 리서치","research.goal":"목표","research.seed_entity":"시드 엔티티 ID","research.max_steps":"최대 스텝","research.min_relevance":"최소 관련도","research.run":"그래프 리서치 실행","research.load_sessions":"세션 불러오기","research.graph_query":"그래프 쿼리","research.filter_placeholder":"브랜드 또는 태그 필터","research.run_query":"쿼리 실행","research.query.trend_summary":"트렌드 요약","research.query.brand_products":"브랜드 상품","research.query.products_by_tag":"태그별 상품","research.query.relation_summary":"관계 요약","research.query.entity_type_summary":"엔티티 타입 요약","tags.load":"태그 불러오기","recommend.preferred_notes":"선호 노트","recommend.avoided_notes":"기피 노트","recommend.preferred_moods":"선호 무드","recommend.season":"계절","recommend.occasion":"상황","recommend.test":"추천 테스트","inspector.title":"인스펙터","inspector.hint":"엔티티/클레임/페이지를 선택하면 상세가 표시됩니다.","inspector.project_info":"프로젝트 정보","inspector.no_selection":"선택 없음","inspector.latest_activity":"최근 활동","inspector.latest_activity.empty":"최근 크롤/추출 활동이 없습니다.","extractor.rule_based":"규칙 기반","extractor.openai":"OpenAI API","extractor.ollama":"Ollama","extractor.lm_studio":"LM Studio","toast.project_created":"프로젝트 생성됨","toast.reset_confirm":"현재 프로젝트의 크롤 데이터(페이지/엔티티/클레임)를 리셋하시겠습니까?","toast.reset_done":"리셋 완료","toast.url_copied":"URL이 입력란에 복사됨","toast.url_crawl_completed":"URL 크롤 완료","toast.crawl_failed":"크롤 실패","toast.site_crawl_started":"사이트 크롤 시작","toast.site_crawl_failed":"사이트 크롤 실패","toast.site_crawl_completed":"사이트 크롤 완료","toast.stop_requested":"중지 요청됨","toast.stop_failed":"중지 실패","toast.analyzer_connected":"분석기 연결됨","toast.analyzer_failed":"분석기 실패","toast.discovery_failed":"탐색 실패","toast.claim_updated":"클레임 업데이트됨","toast.entity_merged":"엔티티 병합됨","toast.merge_check":"엔티티 ID를 확인하세요","toast.research_completed":"리서치 완료","toast.research_failed":"리서치 실패","toast.config_path_required":"설정 파일 경로가 필요합니다","status.starting_site_crawl":"시드부터 사이트 크롤 시작 중...","status.discovering":"링크 탐색 중...","status.testing_analyzer":"분석기 테스트 중...","status.crawling_url":"URL 1건 크롤 중...","status.stopping_crawl":"사이트 크롤 중지 중","status.research_running":"그래프 리서치 실행 중...","status.no_crawl":"준비됨"},en:{"app.title":"Ontology Crawler","app.subtitle":"Project crawler, ontology mapping, claim review, recommendation tags","header.refresh":"Refresh","header.lang.ko":"한","header.lang.en":"EN","sidebar.projects":"Projects","sidebar.config_path":"Config path","sidebar.create_project":"Create project","sidebar.reset_project":"Reset current project data","sidebar.crawl":"Crawl","sidebar.source":"Source","sidebar.url_or_seed":"URL / Seed URL","sidebar.analyzer":"Analyzer","sidebar.model":"Model","sidebar.base_url":"Base URL","sidebar.test_analyzer":"Test analyzer","sidebar.discover":"Discover links","sidebar.crawl_url":"Crawl URL","sidebar.max_depth":"Max depth","sidebar.max_pages":"Max pages","sidebar.same_domain":"Same domain","sidebar.crawl_site":"Crawl site from seed","sidebar.stop_crawl":"Stop current crawl","tabs.overview":"Overview","tabs.graph":"Graph","tabs.ontology":"Ontology","tabs.entities":"Entities","tabs.claims":"Claims","tabs.debug":"Debug","tabs.research":"Research","tabs.tags":"Tags","tabs.recommend":"Recommend","graph.search_placeholder":"Search entity name...","graph.entity_type_all":"All types","graph.predicate_all":"All relations","graph.min_confidence":"Min confidence","graph.layout":"Layout","graph.layout.cose":"Force","graph.layout.circle":"Circle","graph.layout.concentric":"Concentric","graph.layout.grid":"Grid","graph.layout.breadthfirst":"Tree","graph.reload":"Reload graph","graph.fit":"Fit","graph.empty":"No data yet. As crawling produces claims, nodes will appear on the graph.","graph.stats.nodes":"nodes","graph.stats.edges":"edges","graph.stats.shown":"shown","overview.project":"Project","overview.domain":"Domain","overview.sources":"Sources","overview.entities":"Entities","overview.sources_heading":"Sources","pipeline.heading":"Pipeline","pipeline.refresh":"Refresh","pipeline.stage.crawled":"Crawled","pipeline.stage.extracted":"Extracted","pipeline.stage.claims":"Claims","pipeline.stage.validated":"Validated","pipeline.stage.graph":"Graph triples","pipeline.retained":"retained","pipeline.entity_types_heading":"Entity type breakdown","pipeline.recent_pages":"Recent pages","pipeline.recent_claims":"Recent claims","pipeline.empty.pages":"No pages crawled yet.","pipeline.empty.claims":"No claims generated yet.","search.placeholder":"Search entities, claims, pages...","search.aria_label":"Global search","search.group.entities":"Entities","search.group.claims":"Claims","search.group.pages":"Pages","search.group.predicates":"Predicates","search.empty":"No results","search.hint":"Type at least 1 character","table.name":"Name","table.type":"Type","table.trust":"Trust","table.robots":"Robots","table.rate":"Rate","table.domain":"Domain","table.status":"Status","table.confidence":"Confidence","table.relation":"Relation","table.subject":"Subject","table.object":"Object","table.support":"Support","table.predicate":"Predicate","table.tag":"Tag","table.brand":"Brand","table.product":"Product","table.count":"Count","table.no_data":"No data.","table.id":"ID","table.metadata":"Metadata","table.reason":"Reason","table.gap":"Gap","table.target":"Target","table.priority":"Priority","table.description":"Description","table.score":"Score","table.reasons":"Reasons","ontology.refresh_registry":"Refresh registry","ontology.configured_entity_types":"Configured Entity Types","ontology.configured_predicates":"Configured Predicates","ontology.registry_entity_types":"Registry Entity Types","ontology.registry_relation_types":"Registry Relation Types","ontology.triples":"Ontology Triples","ontology.proposals":"Schema Proposals","ontology.knowledge_gaps":"Knowledge Gaps","entities.all_types":"All types","entities.load":"Load","entities.merge_source_placeholder":"Entity ID to merge","entities.merge_target_placeholder":"Entity ID to keep","entities.merge":"Merge","claims.show_candidates":"Show candidates","claims.refresh":"Refresh claims","claims.save":"Save","claims.confidence_label":"confidence","claims.reason_label":"reason","workbench.status_filter":"Status","workbench.status.all":"All","workbench.status.active":"Active","workbench.status.validated_claim":"Validated","workbench.status.rejected":"Rejected","workbench.search_placeholder":"Search subject/predicate/object...","workbench.predicate_filter":"Predicate","workbench.predicate_all":"All predicates","workbench.empty":"No claims to display.","workbench.select_hint":"Select a claim from the list on the left.","workbench.bulk_count":"{count} selected","workbench.action.accept":"Accept","workbench.action.reject":"Reject","workbench.action.unreview":"Unreview","workbench.action.save_confidence":"Save confidence","workbench.action.accept_similar":"Accept all with same predicate+object","workbench.shortcuts":"Shortcuts","workbench.shortcut.nav":"J/K · navigate","workbench.shortcut.accept":"A · accept","workbench.shortcut.reject":"R · reject","workbench.shortcut.bulk_accept":"Shift+A · bulk accept","workbench.shortcut.bulk_reject":"Shift+R · bulk reject","workbench.shortcut.toggle":"Space · toggle select","workbench.shortcut.search":"/ · search","workbench.shortcut.escape":"Esc · clear selection","workbench.detail.subject":"Subject","workbench.detail.predicate":"Predicate","workbench.detail.object":"Object","workbench.detail.status":"Status","workbench.detail.confidence":"Confidence","workbench.detail.evidence":"Evidence text","workbench.detail.source":"Source","workbench.detail.page":"Page","workbench.detail.breakdown":"Confidence breakdown","workbench.detail.reason_placeholder":"reason (optional)","workbench.toast.reviewed":"Review applied","workbench.toast.bulk_done":"{count} updated","debug.refresh_logs":"Refresh extraction logs","research.heading":"Semantic Exploration","research.goal":"Goal","research.seed_entity":"Seed entity ID","research.max_steps":"Max steps","research.min_relevance":"Min relevance","research.run":"Run graph research","research.load_sessions":"Load sessions","research.graph_query":"Graph Query","research.filter_placeholder":"brand or tag filter","research.run_query":"Run query","research.query.trend_summary":"Trend summary","research.query.brand_products":"Brand products","research.query.products_by_tag":"Products by tag","research.query.relation_summary":"Relation summary","research.query.entity_type_summary":"Entity type summary","tags.load":"Load tags","recommend.preferred_notes":"Preferred notes","recommend.avoided_notes":"Avoided notes","recommend.preferred_moods":"Preferred moods","recommend.season":"Season","recommend.occasion":"Occasion","recommend.test":"Test recommendation","inspector.title":"Inspector","inspector.hint":"Select an entity/claim/page to see details.","inspector.project_info":"Project info","inspector.no_selection":"Nothing selected","inspector.latest_activity":"Latest activity","inspector.latest_activity.empty":"No recent crawl or extraction activity.","extractor.rule_based":"Rule-based","extractor.openai":"OpenAI API","extractor.ollama":"Ollama","extractor.lm_studio":"LM Studio","toast.project_created":"Project created","toast.reset_confirm":"Reset current project crawl data (pages/entities/claims)?","toast.reset_done":"Reset completed","toast.url_copied":"URL copied to input","toast.url_crawl_completed":"URL crawl completed","toast.crawl_failed":"Crawl failed","toast.site_crawl_started":"Site crawl started","toast.site_crawl_failed":"Site crawl failed","toast.site_crawl_completed":"Site crawl completed","toast.stop_requested":"Stop requested","toast.stop_failed":"Stop failed","toast.analyzer_connected":"Analyzer connected","toast.analyzer_failed":"Analyzer failed","toast.discovery_failed":"Discovery failed","toast.claim_updated":"Claim updated","toast.entity_merged":"Entity merged","toast.merge_check":"Check entity IDs","toast.research_completed":"Research completed","toast.research_failed":"Research failed","toast.config_path_required":"Config path is required","status.starting_site_crawl":"Starting site crawl from seed...","status.discovering":"Discovering links...","status.testing_analyzer":"Testing analyzer...","status.crawling_url":"Crawling one URL...","status.stopping_crawl":"Stopping site crawl","status.research_running":"Running graph research...","status.no_crawl":"Ready"}};let Hn=Bv();const co=new Set;function Bv(){try{const e=localStorage.getItem(od);if(e&&ld.includes(e))return e}catch{}return(navigator.language||"").toLowerCase().startsWith("en")?"en":ud}function kl(){return Hn}function Dv(t){if(!(!ld.includes(t)||t===Hn)){Hn=t;try{localStorage.setItem(od,t)}catch{}document.documentElement.setAttribute("lang",t),xt(document),co.forEach(e=>{try{e(t)}catch(r){console.warn("i18n listener failed",r)}})}}function fr(t){return co.add(t),()=>co.delete(t)}function V(t,e){const r=Sl[Hn]||Sl[ud];return t in r?r[t]:e??t}function xt(t=document){t.querySelectorAll("[data-i18n]").forEach(e=>{const r=e.getAttribute("data-i18n");r&&(e.textContent=V(r))}),t.querySelectorAll("[data-i18n-placeholder]").forEach(e=>{const r=e.getAttribute("data-i18n-placeholder");r&&e.setAttribute("placeholder",V(r))}),t.querySelectorAll("[data-i18n-title]").forEach(e=>{const r=e.getAttribute("data-i18n-title");r&&e.setAttribute("title",V(r))}),t.querySelectorAll("[data-i18n-aria-label]").forEach(e=>{const r=e.getAttribute("data-i18n-aria-label");r&&e.setAttribute("aria-label",V(r))})}function Rv(t){t.innerHTML=`
| ${z(r)} | `).join("")}
|---|
| ${String(a??"")} | `).join("")}
| ${z(V("table.no_data"))} |
${z(JSON.stringify(e.metadata??{},null,2))}
${z(e.evidence_text)}
`:""}${z(JSON.stringify(e.metadata,null,2))}`:""}
${z(JSON.stringify(e.metadata,null,2))}`:""}
${$b(e.evidence_text,e)}
${z(V("pipeline.empty.claims"))}
`;return}const r=Math.max(1,...t.map(a=>a.count));e.innerHTML=t.map(a=>{const n=a.count/r*100;return`${z(V("pipeline.empty.pages"))}
`;return}e.innerHTML=t.map(r=>`${z(V("pipeline.empty.claims"))}
`;return}e.innerHTML=t.map(r=>`| ${z(V("table.no_data"))} |
| ${z(V("table.name"))} | ${z(V("table.type"))} | ${z(V("table.trust"))} | ${z(V("table.robots"))} | ${z(V("table.rate"))} |
|---|---|---|---|---|
| ${z(a.name)} | ${z(a.type)} | ${a.trust_level} | ${a.respect_robots_txt?"on":"off"} | ${a.rate_limit_per_minute}/min |
${z(JSON.stringify(a.metadata??{}))}`])),q("entityTable").querySelectorAll("[data-entity-id]").forEach(a=>{a.addEventListener("click",()=>{const n=Number(a.dataset.entityId),i=sd.find(s=>s.id===n);i&&(ue.selection={kind:"entity",data:i},ur())})})}async function aw(){if(!ue.selectedProject)return;const t=Number(q("mergeSourceId").value),e=Number(q("mergeTargetId").value);if(!t||!e||t===e){Ae(V("toast.merge_check"));return}try{const r=await Fe("/entities/merge",{method:"POST",body:JSON.stringify({project_name:ue.selectedProject,source_entity_id:t,target_entity_id:e})});if(!r.ok){Ae(r.error??V("toast.merge_check"));return}Ae(V("toast.entity_merged")),q("mergeSourceId").value="",q("mergeTargetId").value="";const a=new CustomEvent("workspace:refresh");window.dispatchEvent(a)}catch(r){Ae(r.message)}}async function zo(){if(!ue.selectedProject)return;const t=await Fe(`/projects/${encodeURIComponent(ue.selectedProject)}/extraction-logs?limit=50`);q("extractionLogTable").innerHTML=t.map(nw).join("")}function nw(t){const e=t.validation??{},r=t.page_context??{},n=(e.rejected_claims??[]).slice(0,3).map(i=>`${i.predicate??""}: ${i.reason??""}`).join(" | ");return`