PageSourceSearch

https://k-doc.ai/_next/static/chunks/30932.a088872283dc67e4.js

js k-doc.ai collected 2026-10-05 12:19:05 UTC 55,902 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[30932],{439:(e,t,s)=>{s.d(t,{A:()=>a});let a=(0,s(90425).A)("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]])},6510:(e,t,s)=>{s.d(t,{s:()=>d});var a=s(12115),l=s(43800),r=s(15893),n=s(51346);function i(e){return"processing"===e||"completed"===e||"failed"===e?e:"idle"}function c(e){return"string"==typeof e?e:null}function d(e,t){let[s,d]=(0,a.useState)(!0),[o,x]=(0,a.useState)(!1),[m,h]=(0,a.useState)(!1),[p,g]=(0,a.useState)(null),[u,b]=(0,a.useState)("idle"),[f,j]=(0,a.useState)(null),[v,N]=(0,a.useState)(0),[_,y]=(0,a.useState)(null),[w,k]=(0,a.useState)(null),A=(0,a.useCallback)(async()=>{if(!e)return void r.vF.log("[useAiData] No hospitalId, skipping fetch");d(!0);try{r.vF.log("[useAiData] Fetching data for:",e,t);let s=await l.J.getAiData(e,{hospital_department_id:t,admin:!0});if(r.vF.log("[useAiData] API Response:",s),!s.success){let e="데이터를 불러오는데 실패했습니다";r.vF.error("[useAiData] API returned error:",s.message||e),k(e),x(!1),g(null),b("idle"),j(null),y(null);return}if(k(null),s.data){let e=s.data;g(e),b(i(e.ingestion_status)),j(c(e.last_ingested_at))}x(!0);let a=s.learning_summary??s.data?.learning_summary;r.vF.log("[useAiData] Setting learningSummary:",a),y(a||null)}catch(e){r.vF.error("[useAiData] Fetch error:",e),k("데이터를 불러오는 중 오류가 발생했습니다"),x(!1),g(null),b("idle"),j(null),y(null)}finally{d(!1)}},[e,t]);return(0,a.useEffect)(()=>{A()},[A]),(0,a.useEffect)(()=>{let t=()=>{e&&A()};return window.addEventListener("kdoc-ai-learning-completed",t),()=>window.removeEventListener("kdoc-ai-learning-completed",t)},[e,A]),(0,a.useEffect)(()=>{let s;return e&&"processing"===u&&(s=setInterval(async()=>{try{let s=await l.J.getAiData(e,{hospital_department_id:t,admin:!0});if(s.success&&s.data){let e=s.data;"processing"!==e.ingestion_status?(b(i(e.ingestion_status)),j(c(e.last_ingested_at)),s.learning_summary&&y(s.learning_summary),"completed"===e.ingestion_status&&(N(100),n.o.success("KAI 학습이 완료되었습니다!"))):N(e=>Math.min(e+5,90))}}catch(e){r.vF.error("[useAiData] Polling error",e)}},3e3)),()=>{s&&clearInterval(s)}},[e,t,u]),{loading:s,loaded:o,saving:m,aiData:p,setAiData:g,ingestStatus:u,lastIngestedAt:f,ingestionProgress:v,learningSummary:_,error:w,saveAiData:async s=>{h(!0);try{let a=await l.J.getAiData(e,{hospital_department_id:t,admin:!0}),r={...a.success?a.data:{},...s,hospitalId:e,scope_mode:t?"unit":"common",hospital_department_id:t??null};if((await l.J.saveAiData(r)).success)return n.o.success("설정이 저장되었습니다."),b("processing"),N(0),!0;return n.o.error("저장 실패"),!1}catch(e){return r.vF.error("[useAiData] Save error:",e),n.o.error("저장 중 오류가 발생했습니다."),!1}finally{h(!1)}},syncKnowledge:async()=>{h(!0);try{if(n.o.info("전체 지식 동기화를 시작합니다..."),(await l.J.syncAiKnowledge(e,{hospital_department_id:t??null,scope_mode:t?"unit":"common"})).success)return b("processing"),N(0),n.o.success("동기화 요청이 완료되었습니다."),!0;return n.o.error("동기화 실패"),!1}catch(e){return r.vF.error("[useAiData] Sync error:",e),n.o.error("동기화 중 오류 발생"),!1}finally{h(!1)}},refresh:A}}},20232:(e,t,s)=>{s.d(t,{A:()=>a});let a=(0,s(90425).A)("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]])},30932:(e,t,s)=>{s.r(t),s.d(t,{AiTrainingView:()=>es});var a=s(95155),l=s(12115),r=s(5772),n=s(45249),i=s(49619),c=s(90425);let d=(0,c.A)("sliders-vertical",[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]]);var o=s(439),x=s(86901),m=s(96909),h=s(74643),p=s(6296),g=s(20232),u=s(68822),b=s(41585),f=s(21975),j=s(53961),v=s(44071);let N=(0,c.A)("text-align-start",[["path",{d:"M21 5H3",key:"1fi0y6"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M17 19H3",key:"z6ezky"}]]);var _=s(96035),y=s(34220),w=s(68459),k=s(51914),A=s(52504),S=s(43800),C=s(59611),M=s(15893),E=s(51346),F=s(40980),J=s(6510),U=s(94514),O=s(73604),L=s(34486);let q="kai-mbti-title",I="kai-mbti-description",T="inline-flex items-center rounded-full border border-white/60 bg-white/30 px-2 py-0.5 text-xs font-medium text-[#334155]";
1function D({value:e,onChange:t}){let s=(0,L.c6)(e),l=L.m_[s],r=(0,L.iF)(s);return(0,a.jsxs)("section",{"aria-labelledby":q,"aria-describedby":I,className:(0,F.cn)(O.V.panel,"min-w-0 space-y-4"),children:[(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsxs)("h3",{id:q,className:"flex items-center gap-2 text-lg font-semibold text-[#0f172a]",children:[(0,a.jsx)(x.A,{className:"h-5 w-5 shrink-0 text-[#5446D6]","aria-hidden":"true"}),"KAI 성격 (MBTI)"]}),(0,a.jsx)("p",{id:I,className:(0,F.cn)(O.V.muted,"max-w-[72ch] break-keep"),children:"고른 성격에 맞춰 KAI가 환자와 대화하는 방식이 바뀝니다. 진료 정보\xb7가격\xb7안전 안내는 그대로예요."})]}),(0,a.jsx)("div",{role:"radiogroup","aria-labelledby":q,className:"grid grid-cols-2 gap-2 sm:gap-3 lg:grid-cols-4",children:L.rE.map((e,l)=>{let r=L.m_[e],n=e===s;return(0,a.jsxs)("button",{type:"button",role:"radio","aria-checked":n,tabIndex:n?0:-1,"data-mbti":e,onClick:()=>t(e),onKeyDown:e=>{let s;null!==(s=function(e,t,s=L.rE.length){switch(t){case"ArrowRight":case"ArrowDown":return(e+1)%s;case"ArrowLeft":case"ArrowUp":return(e-1+s)%s;case"Home":return 0;case"End":return s-1;default:return null}}(l,e.key))&&(e.preventDefault(),t(L.rE[s]),e.currentTarget.parentElement?.querySelectorAll('[role="radio"]')[s]?.focus())},className:(0,F.cn)("lg-inset lg-radius-inset relative flex min-h-[44px] min-w-0 flex-col items-start gap-1 p-3 text-left transition-colors sm:p-4","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-teal-600 focus-visible:ring-offset-2",n?"border-teal-600 ring-2 ring-teal-600/25":"hover:bg-white/50"),children:[(0,a.jsxs)("span",{className:"flex w-full min-w-0 items-center gap-2",children:[(0,a.jsx)("span",{className:"text-lg font-semibold tracking-wide text-[#0f172a]",children:e}),e===L.lt&&(0,a.jsx)("span",{className:T,children:"기본"}),n&&(0,a.jsx)("span",{"aria-hidden":"true",className:"lg-tint-flat ml-auto grid h-5 w-5 shrink-0 place-items-center rounded-full text-white",children:(0,a.jsx)(U.A,{className:"h-3 w-3"})})]}),(0,a.jsx)("span",{className:"break-keep text-[13px] font-semibold leading-5 text-[#0f172a]",children:r.alias}),(0,a.jsx)("span",{className:"break-keep text-[13px] leading-5 text-[#475569]",children:r.summary})]},e)})}),(0,a.jsxs)("div",{"aria-live":"polite",className:"lg-inset lg-radius-inset min-w-0 space-y-3 p-3 sm:p-4",children:[(0,a.jsxs)("p",{className:"flex flex-wrap items-center gap-2 text-sm font-semibold text-[#0f172a]",children:[(0,a.jsxs)("span",{children:[s," \xb7 ",l.alias]}),s===L.lt&&(0,a.jsx)("span",{className:T,children:"기본"})]}),(0,a.jsx)("ul",{"aria-label":"이 성격의 대화 특징",className:"flex flex-wrap gap-2",children:r.map(e=>(0,a.jsxs)("li",{className:"inline-flex min-w-0 max-w-full flex-wrap items-center gap-x-1.5 rounded-full border border-white/60 bg-white/30 px-3 py-1 text-[13px] leading-5",children:[(0,a.jsxs)("span",{className:"font-semibold text-[#0f172a]",children:[e," ",L.en[e].name]}),(0,a.jsx)("span",{className:"break-keep text-[#475569]",children:L.en[e].trait})]},e))}),(0,a.jsxs)("div",{className:"space-y-1.5",children:[(0,a.jsxs)("p",{className:"flex flex-wrap items-center gap-2 text-[13px] leading-5 text-[#475569]",children:[(0,a.jsx)("span",{className:T,children:"예시"}),(0,a.jsxs)("span",{className:"break-keep",children:["환자: “",L.r5,"”"]})]}),(0,a.jsxs)("p",{className:"break-keep text-sm leading-6 text-[#0f172a]",children:[(0,a.jsx)("span",{className:"font-semibold text-[#5446D6]",children:"KAI"})," ",l.example]})]})]})]})}var V=s(3473),$=s(43583),K=s(67214),R=s(45105),z=s(82573),B=s(5605),P=s(9134),H=s(4491),G=s(94240);let Q=[{id:"F1",gender:"여성",label:"밝은 여성 상담",desc:"밝고 친절하지만 서두르지 않는 상담 톤",tone:"밝음"},{id:"F2",gender:"여성",label:"차분한 여성 상담",desc:"부드럽고 차분한 호흡의 상담 톤",tone:"차분"},{id:"F3",gender:"여성",label:"친절한 여성 상담",desc:"자연스럽고 친근한 상담 톤",tone:"친절"},{id:"F4",gender:"여성",label:"또렷한 여성 상담",desc:"정보 전달이 선명하되 빠르지 않은 톤",tone:"명료"},{id:"F5",gender:"여성",label:"전문적인 여성 상담",desc:"전문적이고 안정적인 기본 권장 톤",tone:"권장"},{id:"M1",gender:"남성",label:"신뢰감 있는 남성 상담",desc:"낮고 안정적인 신뢰형 상담 톤",tone:"신뢰"},{id:"M2",gender:"남성",label:"차분한 남성 상담",desc:"가장 느리고 안정적인 상담 톤",tone:"차분"},{id:"M3",gender:"남성",label:"전문적인 남성 상담",desc:"단정하고 또박또박한 상담 톤",tone:"전문"},{id:"M4",gender:"남성",label:"또렷한 남성 상담",desc:"간결하지만 서두르지 않는 상담 톤",tone:"명료"},{id:"M5",gender:"남성",label:"안정적인 남성 상담",desc:"자연스럽고 안정적인 상담 톤",tone:"안정"}],W="상담 코디네이터입니다. 무엇을 도와드릴까요?",X=[i.A,d,o.A,x.A];function Z(e){return"string"!=typeof e?"F5":Q.some(t=>t.id===e)?e:"kdoc_default"===e||"kdoc_female_neutral"===e?"F5":"kdoc_calm"===e?"F2":"kdoc_male_warm"===e?"M1":"F5"}function Y({personaName:e,personaRole:t,ctaPercent:s,salesPercent:l,hasRisk:r}){let n=[e||t||G.v.labels.profileNotSet,`${s}% / ${l}%`,r?G.v.labels.riskReviewNeeded:G.v.labels.riskStable,G.v.labels.previewReady];return(0,a.jsxs)("div",{className:"lg-regular lg-radius-card p-5 shadow-sm",children:[(0,a.jsx)("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-xs font-black uppercase tracking-widest text-teal-600",children:G.v.labels.hospitalFriendly}),(0,a.jsx)("h2",{className:"mt-1 text-xl font-black text-slate-950",children:G.v.labels.operationalChecklist})]})}),(0,a.jsx)("div",{className:"mt-5 grid gap-3 md:grid-cols-4",children:G.v.tabs.settingsOverview.map((e,t)=>{let s=X[t]??i.A;return(0,a.jsxs)("div",{className:"lg-inset lg-radius-inset p-4",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,a.jsx)("span",{className:"grid h-9 w-9 shrink-0 place-items-center rounded-lg lg-inset text-teal-700 shadow-sm",children:(0,a.jsx)(s,{className:"h-4 w-4"})}),(0,a.jsx)("span",{className:"rounded-full lg-inset px-2 py-1 text-[10px] font-black text-slate-500 shadow-sm",children:n[t]})]}),(0,a.jsx)("h3",{className:"mt-4 text-sm font-black text-slate-950",children:e.title}),(0,a.jsx)("p",{className:"mt-1 text-xs font-semibold leading-5 text-slate-500",children:e.description})]},e.title)})})]})}function ee({selectedVoice:e,onSelectVoice:t,previewText:s=W,inline:r,hospitalDepartmentId:i=null}){let[c,d]=(0,l.useState)(null),[x,u]=(0,l.useState)(null),b=(0,l.useRef)(null),f=(0,l.useRef)(null),j=(0,l.useCallback)(()=>{b.current&&(b.current.pause(),b.current=null),f.current&&(URL.revokeObjectURL(f.current),f.current=null),u(null)},[]),v=(0,l.useCallback)(async e=>{if(j(),x!==e){d(e);try{var t,a;let l,r,n,c,d,o=await (0,A.v$)("/api/voice/tts",{method:"POST",body:JSON.stringify({text:s,language:"ko",voice:e,hospital_department_id:i})});if(!o.ok)throw Error("TTS failed");let x=(t=await o.arrayBuffer(),a=o.headers.get("content-type"),/audio\/wav|audio\/wave|audio\/x-wav/i.test(a||"")?new Blob([t],{type:"audio/wav"}):/audio\/(?:mpeg|mp3)/i.test(a||"")?new Blob([t],{type:"audio/mpeg"}):(l=new Int16Array(t),r=new ArrayBuffer(44),n=new DataView(r),c=(e,t)=>{for(let s=0;s<t.length;s++)n.setUint8(e+s,t.charCodeAt(s))},d=2*l.length,c(0,"RIFF"),n.setUint32(4,36+d,!0),c(8,"WAVE"),c(12,"fmt "),n.setUint32(16,16,!0),n.setUint16(20,1,!0),n.setUint16(22,1,!0),n.setUint32(24,24e3,!0),n.setUint32(28,48e3,!0),n.setUint16(32,2,!0),n.setUint16(34,16,!0),c(36,"data"),n.setUint32(40,d,!0),new Blob([r,l.buffer],{type:"audio/wav"}))),m=URL.createObjectURL(x);f.current=m;let h=new Audio(m);h.onended=()=>{j()},h.onerror=()=>{j()},b.current=h,await h.play(),u(e)}catch{E.o.error("미리듣기에 실패했습니다.")}finally{d(null)}}},[i,x,s,j]);(0,l.useEffect)(()=>()=>j(),[j]);let[N,_]=(0,l.useState)(!1),y=Z(e),w=Q.find(e=>e.id===y)??Q.find(e=>"F5"===e.id),k=(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(m.A,{className:(0,F.cn)("shrink-0",r?"w-4 h-4 text-cyan-500":"w-5 h-5")}),(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-700",children:"음성 스타일"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 text-[10px] font-bold text-teal-600",children:[(0,a.jsx)(o.A,{className:"w-3.5 h-3.5"}),(0,a.jsxs)("span",{children:[B.TO.length,"개 언어 자동 적용"]})]})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 gap-3",children:(0,a.jsxs)("button",{type:"button",onClick:()=>t("F5"),className:(0,F.cn)("flex items-start gap-3 rounded-xl border-2 lg-regular p-4 text-left transition-all","F5"!==y&&y?"border-white/80 hover:border-teal-200":"border-teal-500 shadow-lg shadow-teal-200/50 ring-2 ring-teal-50"),children:[(0,a.jsx)("div",{className:"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-teal-50 text-teal-600",children:(0,a.jsx)(h.A,{className:"h-4 w-4"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("span",{className:"text-sm font-black text-slate-800",children:"기본 KAI 음성"}),(0,a.jsx)(n.Ex,{className:"border-teal-200 bg-teal-50 text-[10px] font-black text-teal-700",children:"권장"})]}),(0,a.jsx)("p",{className:"mt-1 text-[11px] font-medium leading-relaxed text-slate-500",children:"환자와 음성으로 대화할 때 사용할 KAI의 목소리와 말투를 선택합니다. 선택한 음성 스타일은 기본 음성 안내와 실시간 음성 상담에 함께 적용됩니다."})]})]})}),r&&(0,a.jsxs)("button",{type:"button",onClick:()=>_(e=>!e),className:"flex w-full items-center justify-between rounded-xl lg-regular px-4 py-3 text-left shadow-sm transition hover:border-teal-200 hover:bg-teal-50/40",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"block text-xs font-black text-slate-500",children:"선택된 음성"}),(0,a.jsx)("span",{className:"mt-1 block text-sm font-black text-slate-900",children:w.label}),(0,a.jsx)("span",{className:"mt-1 block text-xs font-semibold text-slate-500",children:w.desc})]}),(0,a.jsx)("span",{className:"shrink-0 rounded-full border border-teal-100 bg-teal-50 px-3 py-1 text-[11px] font-black text-teal-700",children:N?"접기":"다른 음성 보기"})]}),(!r||N)&&(0,a.jsxs)("div",{className:"lg-regular rounded-xl p-3",children:[(0,a.jsxs)("div",{className:"mb-3 flex items-center justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-[11px] font-black text-slate-600",children:"기본 KAI 음성 선택지"}),(0,a.jsx)("p",{className:"mt-0.5 text-[10px] font-medium text-slate-400",children:"병원 담당자는 하나만 선택하면 됩니다. 미리듣기는 한국어 샘플로 재생됩니다."})]}),(0,a.jsx)(n.Ex,{className:"lg-inset border-none text-[10px] font-black text-slate-500",children:"10개"})]}),(0,a.jsx)("div",{className:(0,F.cn)("grid gap-3",r?"grid-cols-1 sm:grid-cols-2":"grid-cols-2 lg:grid-cols-3 xl:grid-cols-5"),children:Q.map(e=>{var s;let l=y===e.id||!y&&"F5"===e.id,r=c===e.id,n=x===e.id,i="여성"===(s=e.gender)?{badge:"bg-pink-100 text-pink-600 border-pink-200",accent:"pink",dot:"bg-pink-400"}:"남성"===s?{badge:"bg-sky-100 text-sky-600 border-sky-200",accent:"sky",dot:"bg-sky-4
100"}:{badge:"bg-cyan-100 text-cyan-600 border-cyan-200",accent:"violet",dot:"bg-cyan-400"};return(0,a.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>t(e.id),onKeyDown:s=>{("Enter"===s.key||" "===s.key)&&(s.preventDefault(),t(e.id))},className:(0,F.cn)("flex flex-col items-start p-3.5 rounded-xl border-2 transition-all text-left relative overflow-hidden",l?"border-teal-500 bg-white/40 shadow-lg shadow-teal-200/50 ring-2 ring-teal-50":"border-white kd-surface-muted hover:border-teal-200 hover:bg-white/80"),children:[(0,a.jsx)("div",{className:(0,F.cn)("absolute top-0 left-0 w-1 h-full rounded-l-xl",i.dot)}),(0,a.jsxs)("div",{className:"flex items-center justify-between w-full mb-1.5 pl-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,F.cn)("text-sm font-black",l?"text-teal-600":"text-slate-800"),children:e.label}),(0,a.jsx)("span",{className:(0,F.cn)("text-[9px] font-bold px-1.5 py-0.5 rounded-md border",i.badge),children:e.tone})]}),l&&(0,a.jsx)("div",{className:"w-1.5 h-1.5 rounded-full bg-teal-500 animate-ping"})]}),(0,a.jsx)("span",{className:"text-[10px] text-slate-400 font-medium leading-tight mb-2.5 pl-2",children:e.desc}),(0,a.jsx)("button",{type:"button",onClick:t=>{t.stopPropagation(),n?j():v(e.id)},className:(0,F.cn)("flex items-center gap-1.5 text-[10px] font-bold px-2.5 py-1.5 rounded-lg transition-all ml-2",n?"bg-teal-100 text-teal-600":"bg-slate-100 text-slate-500 hover:bg-teal-50 hover:text-teal-500"),children:r?(0,a.jsx)(p.A,{className:"w-3 h-3 animate-spin"}):n?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(h.A,{className:"w-3 h-3 animate-pulse"})," 재생 중"]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(g.A,{className:"w-3 h-3"})," 미리듣기"]})})]},e.id)})})]})]});return r?(0,a.jsx)("div",{className:"space-y-3 pt-3 border-t border-slate-100",children:k}):(0,a.jsx)("div",{className:(0,F.cn)(O.V.panel,"space-y-5"),children:k})}let et=(0,K.Wm)("kdoc-default");function es({hospitalId:e,actionTrigger:t,onDirtyChange:s}){let c,d,{scope:m,availableDepartments:h,catalogByCode:g}=(0,P.IG)(),U=(0,P.sQ)(m),L=U?h.find(e=>e.id===U)??null:null,q=(L?(0,H.$o)(L.display_name_override_i18n,"ko")||(0,H.$o)(g[L.department_code]?.names_i18n,"ko")||L.department_code:null)??"통합",I=!!U,{loading:T,loaded:B,error:G,saving:Q,aiData:X,setAiData:ea,saveAiData:el,refresh:er,learningSummary:en}=(0,J.s)(e,U),[ei,ec]=(0,l.useState)(null),[ed,eo]=(0,l.useState)("ko"),[ex,em]=(0,l.useState)(!1),[eh,ep]=(0,l.useState)(0),[eg,eu]=(0,l.useState)(null),[eb,ef]=(0,l.useState)(!1),[ej,ev]=(0,l.useState)(!1),[eN,e_]=(0,l.useState)({threshold:.45,auto_greeting:!0,greeting_message:"",max_history_length:10,reservation_intensity:.5,sales_intensity:.5,response_length:.5,price_event_exposure_mode:"asked_only",preferred_phrases:"",forbidden_phrases:"",quick_cta:[],cta_banner_enabled:!0,cta_banner_text:"지금 불편한 상태만 알려주세요. 바로 상담 가능합니다",tts_voice:"F5",translations:{}}),ey="지금 불편한 상태만 알려주세요. 바로 상담 가능합니다",[ew,ek]=(0,l.useState)(null),[eA,eS]=(0,l.useState)({name:"",role:"",tone:"",avatar_url:"",translations:{}}),[eC,eM]=(0,l.useState)(null),[eE,eF]=(0,l.useState)(!1),[eJ,eU]=(0,l.useState)(!0),eO=[.2,.45,.7,.85],eL=["아주 짧게","짧게","보통","자세히"],eq=e=>{let t=eO.map(t=>Math.abs(t-e));return t.indexOf(Math.min(...t))},eI=[{id:"level1",label:"안전 정보형",desc:"근거 중심 응대",example:"환자 질문에 먼저 답하고, 근거가 부족한 내용은 확인 안내로 정리합니다.",preset:{threshold:.85,max_history_length:5,reservation_intensity:0,sales_intensity:0,response_length:.45}},{id:"level2",label:"친절 상담형",desc:"부드러운 상담 중심",example:"충분히 설명한 후, 사용자가 더 궁금해할 때만 예약을 조심스럽게 제안합니다.",preset:{threshold:.65,max_history_length:10,reservation_intensity:.3,sales_intensity:.4,response_length:.85}},{id:"level3",label:"표준 균형형",desc:"친절과 정보의 균형",example:"설명과 예약 유도의 균형을 맞추며 보편적인 상황에 적합합니다.",preset:{threshold:.45,max_history_length:10,reservation_intensity:.5,sales_intensity:.6,response_length:.7}},{id:"level4",label:"전환 보조형",desc:"예약 연결 강화",example:"질문에 답변한 뒤, 관련성이 명확할 때만 예약이나 진행 이벤트를 짧게 안내합니다.",preset:{threshold:.35,max_history_length:12,reservation_intensity:.8,sales_intensity:.9,response_length:.45},riskLevel:"high"},{id:"level5",label:"강한 전환형",desc:"예약 안내 높음",example:"관련 질문에서 예약 연결을 더 적극적으로 돕습니다. 등록 자료와 의료광고 금지 표현 제한은 유지됩니다.",preset:{threshold:.15,max_history_length:15,reservation_intensity:1,sales_intensity:1,response_length:.2},riskLevel:"extreme"}],eT=(c=eI.find(e=>e.preset.max_history_length===eN.max_history_length&&.01>Math.abs(e.preset.reservation_intensity-eN.reservation_intensity)&&.01>Math.abs(e.preset.sales_intensity-eN.sales_intensity)&&.01>Math.abs(e.preset.response_length-eN.response_length)))?c.id:"custom";(0,l.useEffect)(()=>
1{if(X){let e=X.extra_settings?.quick_cta,t={max_history_length:X.extra_settings?.max_history_length??10,auto_greeting:X.extra_settings?.auto_greeting??!0,greeting_message:X.extra_settings?.greeting_message??"",reservation_intensity:X.extra_settings?.reservation_intensity??.5,sales_intensity:X.extra_settings?.sales_intensity??.5,response_length:X.extra_settings?.response_length??.5,threshold:X.extra_settings?.threshold??.45,price_event_exposure_mode:X.extra_settings?.price_event_exposure_mode??"asked_only",preferred_phrases:X.extra_settings?.preferred_phrases??"",forbidden_phrases:X.extra_settings?.forbidden_phrases??"",translations:X.extra_settings?.translations??{},quick_cta:Array.isArray(e)&&e.length>0?e.filter(e=>"string"==typeof e).slice(0,5):[],cta_banner_enabled:X.extra_settings?.cta_banner_enabled!==!1,cta_banner_text:"string"==typeof X.extra_settings?.cta_banner_text&&X.extra_settings.cta_banner_text.trim()?X.extra_settings.cta_banner_text.trim():ey,tts_voice:Z(X.extra_settings?.tts_voice)},s=eO[eq(t.response_length)];e_({...t,response_length:s}),ek(JSON.parse(JSON.stringify(t))),X.persona&&X.persona.name&&(eS(X.persona),eM(JSON.parse(JSON.stringify(X.persona))),eF(!1)),eU(!X.extra_settings?.greeting_message)}},[X]),(0,l.useEffect)(()=>{if(!ew||!eC)return;let e=JSON.stringify(eN)!==JSON.stringify(ew),t=JSON.stringify(eA)!==JSON.stringify(eC);s&&s(e||t)},[eN,eA,ew,eC,s]),(0,l.useEffect)(()=>{e&&S.J.loadHospitalInfo(void 0,e).then(e=>{e.success&&ec(e.data??null)})},[e]),(0,l.useEffect)(()=>{if(!e)return;let t=!1;return(async()=>{try{let{count:s}=await C.supabase.from("hospital_departments").select("id",{count:"exact",head:!0}).eq("hospital_id",e);t||ep(s??0)}catch{t||ep(0)}})(),()=>{t=!0}},[e]);let eD={},eV=(0,l.useMemo)(()=>{let e=eA.name?.trim(),t=eA.role?.trim();return e&&t?`${e} ${t}입니다. 무엇을 도와드릴까요?`:e?`${e}입니다. 무엇을 도와드릴까요?`:t?`${t}입니다. 무엇을 도와드릴까요?`:W},[eA.name,eA.role]),e$=(0,l.useMemo)(()=>(0,K.R8)(eA.avatar_url)&&X?.resolved_persona_avatar_url||(0,K.XT)(eA.avatar_url,eA.name||"kdoc-default"),[eA.avatar_url,eA.name,X]);(0,l.useEffect)(()=>{if("initialize"!==(0,$.kV)({hospitalName:ei?.name,loading:T,loaded:B,error:G,aiData:X,alreadyInitialized:eE})||!ei?.name)return;let e=(0,$.wt)(ei.name),t={name:e.name,role:e.role,tone:e.tone,avatar_url:e.avatarUrl,translations:e.translations};eS(t),eM(JSON.parse(JSON.stringify(t))),eF(!0),el({persona:t}).then(e=>{e&&er()})},[ei,X,T,B,G,eE,er,el]),(0,l.useEffect)(()=>{let e=()=>{M.vF.log("[AiTrainingView] Learning completed, refreshing stats..."),er()};return window.addEventListener("kdoc-ai-learning-completed",e),()=>window.removeEventListener("kdoc-ai-learning-completed",e)},[er]),(0,l.useEffect)(()=>{t&&"save"===t.type&&eB()},[t]),(0,l.useEffect)(()=>{let e=`안녕하세요! {{이름}} {{역할}}입니다. 무엇을 도와드릴까요? 😊`,t=`안녕하세요! {{병원명}} {{역할}} {{이름}} 입니다. 무엇을 도와드릴까요? 😊`;if(eN.greeting_message===e){e_(e=>({...e,greeting_message:t})),eU(!0);return}eJ&&eA.name&&eA.role&&ei?.name&&e_(e=>({...e,greeting_message:t}))},[eJ,eA.name,eA.role,ei?.name,eN.greeting_message]);let eK=async()=>{em(!0);try{let t=await (0,A.v$)("/api/admin/ai/suggest-cta",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({hospitalId:e,hospital_department_id:U})}),s=await t.json();if(!s.success)return void E.o.error(s.message||"자동 추천 실패");let a=s.data.questions??[];e_(e=>({...e,quick_cta:a})),E.o.success(`${a.length}개 질문을 추천했습니다. 저장 버튼을 눌러 적용하세요.`)}catch(e){M.vF.error("[suggest-cta]",e),E.o.error("자동 추천 중 오류가 발생했습니다.")}finally{em(!1)}},eR=(0,l.useCallback)(e=>{let t=e.riskLevel;if(t){eu({presetId:e.id,presetLabel:e.label,riskLevel:t,preset:e.preset}),ef(!1),ev(!1);return}e_(t=>({...t,...e.preset})),E.o.success(`${e.label} 모드로 전환되었습니다.`)},[]),ez=(0,l.useCallback)(()=>{eg&&eb&&("extreme"!==eg.riskLevel||ej)&&(e_(e=>({...e,...eg.preset})),E.o.warning(`${eg.presetLabel}
1 모드 적용 — 의료광고법 56\xb727 조 책임은 병원에 있습니다.`),eu(null),ef(!1),ev(!1))},[eg,eb,ej]),eB=async()=>{let e=(eN.cta_banner_text||"").trim()||ey,t=eN.quick_cta?.filter(e=>"string"==typeof e&&e.trim().length>0)??[],a=z.F.filter(e=>"ko"!==e.code).map(e=>e.code),l={ko:e},r={ko:t};try{let[s,...n]=await Promise.all([S.J.translate(e,a),...t.map(e=>S.J.translate(e,a))]);s.success&&s.data&&Object.entries(s.data).forEach(([e,t])=>{l[e]=t.trim()}),n.forEach((e,s)=>{e.success&&e.data&&Object.entries(e.data).forEach(([e,a])=>{r[e]||(r[e]=Array(t.length).fill("")),r[e][s]=a.trim()})})}catch(e){M.vF.warn("[AiTraining] CTA 자동 번역 실패 (저장은 계속 진행):",e)}let n={extra_settings:{max_history_length:eN.max_history_length,auto_greeting:eN.auto_greeting,greeting_message:eN.greeting_message,reservation_intensity:eN.reservation_intensity??.5,sales_intensity:eN.sales_intensity??.5,response_length:eN.response_length??.5,threshold:eN.threshold,price_event_exposure_mode:eN.price_event_exposure_mode,preferred_phrases:eN.preferred_phrases,forbidden_phrases:eN.forbidden_phrases,translations:eN.translations||{},quick_cta:t,quick_cta_i18n:r,cta_banner_enabled:!1!==eN.cta_banner_enabled,cta_banner_text:e,cta_banner_text_i18n:l,tts_voice:eN.tts_voice},persona:eA};await el(n)&&(ek(JSON.parse(JSON.stringify(n.extra_settings))),eM(JSON.parse(JSON.stringify(n.persona))),s&&s(!1))};return T?(0,a.jsx)("div",{className:"flex h-[400px] items-center justify-center",children:(0,a.jsxs)("div",{className:"flex flex-col items-center gap-4",children:[(0,a.jsx)(p.A,{className:"w-10 h-10 animate-spin text-teal-500"}),(0,a.jsx)("p",{className:"text-sm font-medium text-teal-400",children:"상담원 설정을 불러오는 중..."})]})}):(0,a.jsxs)("div",{className:"w-full space-y-6 animate-in fade-in duration-500",children:[(eh>=2||I)&&(0,a.jsxs)("div",{"data-ai-settings-scope":I?"department":"common",className:(0,F.cn)(O.V.panel,"flex items-start gap-3 p-4",I?"border-teal-200 bg-teal-50/40":"border-slate-200/60 bg-white/20"),children:[(0,a.jsx)(u.A,{className:(0,F.cn)("w-5 h-5 shrink-0 mt-0.5",I?"text-teal-600":"text-slate-500")}),(0,a.jsxs)("div",{className:(0,F.cn)("text-sm leading-snug",I?"text-teal-950":"text-slate-800"),children:[(0,a.jsxs)("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[(0,a.jsxs)("p",{className:"font-bold",children:["진료과 ",eh,"개 운영 중"]}),(0,a.jsx)(n.Ex,{className:(0,F.cn)("text-[10px] font-black",I?"bg-teal-600 text-white":"bg-slate-800 text-white"),children:q})]}),I?(0,a.jsxs)("p",{className:"text-teal-800/80 text-xs",children:["상담원 이름\xb7말투, 첫 인사, 답변 길이, 예약 안내, 음성 스타일은 ",(0,a.jsx)("span",{className:"font-bold",children:q})," 전용 설정으로 저장됩니다. 비어 있는 항목은 통합 설정을 사용합니다."]}):(0,a.jsx)("p",{className:"text-slate-500 text-xs",children:"통합 설정을 편집 중입니다. 진료과별 별도 설정이 없는 항목은 이 값을 사용합니다."})]})]}),!1,(0,a.jsx)(Y,{personaName:eA.name,personaRole:eA.role,ctaPercent:Math.round(100*eN.reservation_intensity),salesPercent:Math.round(100*eN.sales_intensity),hasRisk:!1}),(0,a.jsxs)("div",{className:"grid grid-cols-1 gap-6",children:[(0,a.jsxs)("div",{className:(0,F.cn)(O.V.panel,"relative overflow-hidden group/section space-y-6"),children:[(0,a.jsx)("div",{className:"absolute top-0 right-0 w-48 h-48 bg-teal-50/50 rounded-full blur-2xl -mr-24 -mt-24 transition-transform duration-500 group-hover/section:scale-110"}),(0,a.jsxs)("div",{className:"grid lg:grid-cols-5 gap-8 relative z-10",children:[(0,a.jsxs)("div",{className:"lg:col-span-3 space-y-5",children:[(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsxs)("h3",{className:"text-xl font-black text-slate-800 flex items-center gap-2",children:[(0,a.jsx)(i.A,{className:"w-6 h-6 text-teal-500"}),"KAI 기본 모습"]}),(0,a.jsxs)("p",{className:"text-gray-500 text-sm leading-relaxed max-w-xl",children:["환자에게 보이는 상담원의 ",(0,a.jsx)("span",{className:"text-teal-600 font-bold",children:"이름과 말투"}
1),"를 설정합니다."]})]}),(0,a.jsxs)("div",{className:"grid sm:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)(n.JU,{className:"text-slate-700 font-bold ml-1 text-sm flex items-center gap-2",children:["이름 ",(0,a.jsx)(u.A,{className:"w-3.5 h-3.5 text-teal-400"})]}),(0,a.jsx)(z.g,{label:"",baseKey:"name",values:eA,onChange:e=>eS(t=>({...t,...e})),placeholder:"예: 레이(Ray)",currentGlobalLang:ed,className:"h-10 rounded-xl lg-inset focus:bg-white/80 focus:border-teal-400 focus:ring-2 focus:ring-teal-100/50 transition-all font-bold text-slate-800 text-sm"})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)(n.JU,{className:"text-slate-700 font-bold ml-1 text-sm flex items-center gap-2",children:["직함/역할 ",(0,a.jsx)(u.A,{className:"w-3.5 h-3.5 text-teal-400"})]}),(0,a.jsx)(z.g,{label:"",baseKey:"role",values:eA,onChange:e=>eS(t=>({...t,...e})),placeholder:"예: 컨설턴트",currentGlobalLang:ed,className:"h-10 rounded-xl lg-inset focus:bg-white/80 focus:border-teal-400 focus:ring-2 focus:ring-teal-100/50 transition-all font-bold text-slate-800 text-sm"})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)(n.JU,{className:"text-slate-700 font-bold ml-1 text-sm flex items-center gap-2",children:["상담 말투 ",(0,a.jsx)(x.A,{className:"w-3.5 h-3.5 text-amber-500 fill-amber-500/20"})]}),(0,a.jsx)(z.g,{label:"",baseKey:"tone",values:eA,onChange:e=>eS(t=>({...t,...e})),placeholder:"예: 친절하고 다정하게 응대하되, 의료 정보에 대해서는 매우 전문적이고 명확한 태도를 유지해 주세요.",multiline:!0,currentGlobalLang:ed,className:"h-28 text-sm leading-relaxed p-0 rounded-xl"}),eD.tone&&eD.tone.length>0&&(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5 mt-1",children:eD.tone.map((e,t)=>{let s="guarantee"===e.category||"superlative"===e.category||"comparison"===e.category||"fear"===e.category;return(0,a.jsxs)("span",{className:(0,F.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-[10px] font-bold",s?"bg-rose-50 text-rose-700 border-rose-200":"bg-amber-50 text-amber-700 border-amber-200"),title:e.reason,children:[(0,a.jsx)(b.A,{className:"w-3 h-3"}),'"',e.matched,'" — ',s?"확인 필요":"검토 권장"]},t)})}),(0,a.jsxs)("p",{className:"text-[10px] text-slate-500 ml-1 font-bold tracking-tight italic",children:["말투가 구체적일수록 환자가 받는 안내가 더 자연스러워집니다. 이 상담 말투는 ",(0,a.jsx)("span",{className:"text-teal-500 font-extrabold",children:"채팅 답변"}),"과 ",(0,a.jsx)("span",{className:"text-cyan-500 font-extrabold",children:"음성 안내"})," 모두에 적용됩니다."]})]}),(0,a.jsx)(ee,{selectedVoice:eN.tts_voice,onSelectVoice:e=>e_(t=>({...t,tts_voice:e})),previewText:eV,hospitalDepartmentId:U,inline:!0})]}),(0,a.jsx)("div",{className:"lg:col-span-2",children:(0,a.jsxs)("div",{className:"sticky top-20 space-y-3",children:[(0,a.jsx)(n.JU,{className:"text-slate-500 font-bold ml-1 text-xs uppercase tracking-widest",children:"실시간 미리보기"}),(0,a.jsxs)(n.Zp,{className:"p-5 bg-gradient-to-br from-white to-teal-50/30 kdoc-glass-lite border-white/80 shadow-lg rounded-xl overflow-hidden relative border ring-1 ring-black/[0.02]",children:[(0,a.jsx)("div",{className:"absolute top-0 left-0 w-full h-1.5 bg-gradient-to-r from-teal-500 via-teal-400 to-cyan-500"}),(0,a.jsxs)("div",{className:"flex flex-col items-center text-center space-y-3",children:[(0,a.jsxs)("div",{className:"w-24 h-24 rounded-xl overflow-hidden border-4 border-white kd-shadow-raised relative group/avatar cursor-pointer transition-transform hover:scale-105 active:scale-95",onClick:()=>document.getElementById("avatar-upload-training")?.click(),children:[(0,a.jsx)("input",{id:"avatar-upload-training",type:"file",accept:"image/*",className:"hidden","aria-label":"상담원 이미지 업로드",onChange:async t=>{if(t.target.files&&t.target.files[0]){let s=t.target.files[0],a=E.o.loading("이미지 업로드 중...");try{let t=await (0,A.QM)(s,`hospital/${e}/assets`);if(t.url)eS(e=>({...e,avatar_url:t.url})),E.o.success("이미지가 변경되었습니다.",{id:a});else throw Error("Upload failed")}catch(e){E.o.error("업로드 실패",{id:a})}}}}),(0,a.jsx)(r.default,{src:(0,R.AE)(e$,et),fill:!0,sizes:"96px",alt:"상담원 이미지",className:"object-cover rounded-xl"}),(0,a.jsx)("div",{className:"absolute inset-0 bg-teal-600/60 opacity-0 group-hover/avatar:opacity-100 flex items-center justify-center transition-all",children:(0,a.jsx)(f.A,{className:"w-6 h-6 text-white animate-bounce"})})]}),(0,a.jsxs)("div",{className:"space-y-0.5",children:[(0,a.jsx)("h4",{className:"text-lg font-black text-slate-900 tracking-tight",children:eA.name||"상담원"}),(0,a.jsx)(n.Ex,{variant:"secondary",className:"bg-teal-600 text-white border-none px-3 py-0.5 text-[10px] font-bold rounded-full shadow-md",children:eA.role||"상담원"})]}),(0,a.jsxs)("div",{className:"w-full bg-white/40 rounded-xl p-4 text-left border border-teal-100/50 shadow-sm relative mt-2",children:[(0,a.jsx)("div",{className:"absolute -top-2 left-6 w-4 h-4 bg-white/40 border-t border-l border-teal-100/50 rotate-45 rounded-tl"}),(0,a.jsxs)("p",{className:"text-xs text-slate-600 leading-relaxed font-medium italic",children:['"',(d=eN.greeting_message,(0,V.sQ)(d,{hospitalName:ei?.name||"우리 병원",personaName:eA.name||"",personaRole:eA.role||""})||"실제 환자에게 노출될 첫 인사입니다."),'"']}),(0,a.jsx)("div",{className:"flex justify-end mt-3",children:(0,a.jsx)(x.A,{className:"w-4 h-4 text-teal-200"})})]})]})]})]})})]})]}),(0,a.jsx)(D,{value:eA.mbti,onChange:e=>eS(t=>({...t,mbti:e}))}),(0,a.jsx)("div",{className:"grid grid-cols-1 lg:grid-cols-12 gap-6",children:(0,a.jsxs)("div",{className:"lg:col-span-12 space-y-6",children:[(0,a.jsxs)("div",{className:"p-6 bg-gradient-to-br from-teal-600/5 via-cyan-600/5 to-transparent roun
1ded-xl border kd-border-translucent shadow-lg space-y-6 relative overflow-hidden",children:[(0,a.jsx)("div",{className:"absolute top-0 left-0 w-1/2 h-full bg-gradient-to-r from-teal-500/[0.02] to-transparent pointer-events-none"}),(0,a.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-3 relative z-10",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)(j.A,{className:"w-6 h-6 text-amber-500 fill-amber-500 shrink-0"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h4",{className:"text-lg font-black text-slate-800 tracking-tight",children:"응대 방식 빠른 설정"}),(0,a.jsx)("p",{className:"text-slate-500 text-xs font-medium",children:"클릭 한 번으로 상담 톤을 적용합니다"})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-3 lg-inset px-3 py-1.5 rounded-xl shadow-sm",children:[(0,a.jsx)("span",{className:"text-[10px] text-slate-400 font-bold uppercase tracking-wider",children:"현재"}),(0,a.jsx)(n.Ex,{className:(0,F.cn)("text-[10px] px-2 py-0.5 font-black rounded-md shadow-sm","custom"===eT?"bg-amber-500 text-white hover:bg-amber-600":"bg-teal-600 text-white hover:bg-teal-700"),children:"custom"===eT?"직접 설정":eI.find(e=>e.id===eT)?.label})]})]}),(0,a.jsx)("div",{className:"grid grid-cols-2 lg:grid-cols-5 gap-3 relative z-10",children:eI.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>eR(e),className:(0,F.cn)("flex flex-col items-start p-3 rounded-xl border-2 transition-all w-full text-left relative overflow-hidden",eT===e.id?"border-teal-500 bg-white/40 shadow-lg shadow-teal-200/50 ring-2 ring-teal-50":"extreme"===e.riskLevel?"border-rose-200 bg-rose-50/30 hover:border-rose-300 hover:bg-rose-50/60":"high"===e.riskLevel?"border-amber-200 bg-amber-50/30 hover:border-amber-300 hover:bg-amber-50/60":"border-white kd-surface-muted hover:border-teal-200 hover:bg-white/80"),children:[(0,a.jsx)("span",{className:(0,F.cn)("text-xs font-black transition-colors mb-0.5",eT===e.id?"text-teal-600":"text-slate-700"),children:e.label}),(0,a.jsx)("span",{className:"text-[10px] text-slate-400 font-medium leading-tight",children:e.desc}),eT===e.id&&(0,a.jsx)("div",{className:"absolute top-2 right-2 w-1 h-1 rounded-full bg-teal-500 animate-ping"})]},e.id))}),(0,a.jsxs)("div",{className:"p-3 bg-teal-900/5 border border-teal-100 rounded-xl flex items-start gap-3",children:[(0,a.jsx)(i.A,{className:"w-4 h-4 text-teal-500 shrink-0 mt-0.5"}),(0,a.jsxs)("p",{className:"text-[11px] text-teal-900/80 font-medium leading-snug",children:[(0,a.jsx)("span",{className:"font-black text-teal-950",children:"환자 응대 예시:"})," ",eI.find(e=>e.id===eT)?.example||"직접 설정한 응대 방식이 적용됩니다."]})]}),(0,a.jsxs)("div",{className:"border-t border-teal-100/50 pt-6 space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(o.A,{className:"w-5 h-5 text-teal-600 shrink-0"}),(0,a.jsx)("h3",{className:"text-base font-black text-slate-800",children:"환자 응대 정책"}),(0,a.jsx)("span",{className:"text-[10px] text-slate-500 font-medium",children:"말투\xb7길이\xb7예약 안내 기준"})]}),(0,a.jsxs)("p",{className:"text-[11px] text-teal-700/80 bg-teal-50 border border-teal-100 rounded-lg px-3 py-2 flex items-center gap-2",children:[(0,a.jsx)(i.A,{className:"w-3.5 h-3.5 text-teal-500 shrink-0"}),"병원 설정은 답변 말투, 길이, 예약 안내 강도, 가격\xb7이벤트 노출 방식, 선호\xb7금지 표현에만 반영됩니다. 등록되지 않은 가격\xb7이벤트\xb7의료진\xb7예약 정보는 추측하지 않습니다."]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)(n.JU,{className:"text-sm font-black text-slate-800 flex items-center gap-1",children:["예약 안내 강도 ",(0,a.jsx)(j.A,{className:"w-4 h-4 text-amber-500 fill-amber-500"})]}),(0,a.jsxs)("span",{className:"text-xl font-black text-amber-500 tabular-nums",children:[(100*eN.reservation_intensity).toFixed(0),"%"]})]}),(0,a.jsx)("div",{className:"h-3 w-full bg-slate-100/50 rounded-full relative p-0.5",children:(0,a.jsx)("div",{className:"absolute inset-0 flex items-center",children:(0,a.jsx)(n.Ap,{value:[100*eN.reservation_intensity],onValueChange:e=>e_(t=>({...t,reservation_intensity:e[0]/100})),max:100,min:0,step:5,className:"w-full [&>.SliderThumb]:w-6 [&>.SliderThumb]:h-6 [&>.SliderThumb]:bg-amber-500"})})}),(0,a.jsxs)("div",{className:"flex justify-between text-[9px] text-slate-400 font-bold uppercase",children:[(0,a.jsx)("span",{className:(0,F.cn)(eN.reservation_intensity<=.2&&"text-slate-500"),children:"낮음"}),(0,a.jsx)("span",{className:(0,F.cn)(eN.reservation_intensity>=.8&&"text-amber-600"),children:"높음"})]})]}),(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)(n.JU,{className:"text-sm font-black text-slate-800 flex items-center gap-1",children:["가격\xb7이벤트 노출 강도 ",(0,a.jsx)(v.A,{className:"w-4 h-4 text-teal-500"})]}),(0,a.jsxs)("span",{className:"text-xl font-black text-teal-500 tabular-nums",children:[(100*eN.sales_intensity).toFixed(0),"%"]})]}),(0,a.jsx)("div",{className:"h-3 w-full bg-slate-100/50 rounded-full relative p-0.5",children:(0,a.jsx)("div",{className:"absolute inset-0 flex items-center",children:(0,a.jsx)(n.Ap,{value:[100*eN.sales_intensity],onValueChange:e=>e_(t=>
1({...t,sales_intensity:e[0]/100})),max:100,min:0,step:5,className:"w-full [&>.SliderThumb]:w-6 [&>.SliderThumb]:h-6 [&>.SliderThumb]:bg-teal-500"})})}),(0,a.jsxs)("div",{className:"flex justify-between text-[9px] text-slate-400 font-bold uppercase",children:[(0,a.jsx)("span",{className:(0,F.cn)(eN.sales_intensity<=.2&&"text-slate-500"),children:"정보 중심"}),(0,a.jsx)("span",{className:(0,F.cn)(eN.sales_intensity>=.8&&"text-teal-600"),children:"관련 시 노출"})]})]}),(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsxs)(n.JU,{className:"text-sm font-black text-slate-800 flex items-center gap-1",children:["답변 상세도 ",(0,a.jsx)(N,{className:"w-4 h-4 text-teal-400"})]}),(0,a.jsx)("span",{className:"text-sm font-black text-teal-600",children:eL[eq(eN.response_length??.5)]})]}),(0,a.jsx)("div",{className:"h-3 w-full bg-slate-100/50 rounded-full relative p-0.5",children:(0,a.jsx)("div",{className:"absolute inset-0 flex items-center",children:(0,a.jsx)(n.Ap,{value:[eq(eN.response_length??.5)],onValueChange:e=>{let t=Math.max(0,Math.min(3,e[0]));e_(e=>({...e,response_length:eO[t]}))},max:3,min:0,step:1,className:"w-full [&>.SliderThumb]:w-6 [&>.SliderThumb]:h-6"})})}),(0,a.jsx)("div",{className:"flex justify-between text-[9px] text-slate-400 font-bold uppercase",children:eL.map((e,t)=>(0,a.jsx)("span",{className:(0,F.cn)(eq(eN.response_length??.5)===t&&"text-teal-600"),children:e},e))})]}),(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-800",children:"가격\xb7이벤트 노출 방식"}),(0,a.jsxs)("select",{value:eN.price_event_exposure_mode,onChange:e=>e_(t=>({...t,price_event_exposure_mode:e.target.value})),className:"h-10 w-full rounded-xl lg-inset px-3 text-sm font-medium text-slate-700 outline-none focus:ring-2 focus:ring-teal-100",children:[(0,a.jsx)("option",{value:"asked_only",children:"환자가 물어볼 때만 안내"}),(0,a.jsx)("option",{value:"brief_when_relevant",children:"관련 질문이면 짧게 안내"}),(0,a.jsx)("option",{value:"proactive_after_answer",children:"답변 후 관련 이벤트만 제안"})]}),(0,a.jsx)("p",{className:"text-[11px] text-slate-500",children:"등록된 가격\xb7이벤트만 사용하며, 본문 답변을 대체하지 않습니다."})]}),(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-800",children:"선호 표현"}),(0,a.jsx)(n.TM,{value:eN.preferred_phrases,onChange:e=>e_(t=>({...t,preferred_phrases:e.target.value})),placeholder:"예: 편하게 말씀해주세요, 확인해드릴게요",className:"min-h-[92px] rounded-xl text-sm lg-inset focus:ring-teal-100"})]}),(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-2",children:[(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-800",children:"금지 표현"}),(0,a.jsx)(n.TM,{value:eN.forbidden_phrases,onChange:e=>e_(t=>({...t,forbidden_phrases:e.target.value})),placeholder:"예: 무조건, 최고, 100%, 완치, 보장",className:"min-h-[92px] rounded-xl text-sm lg-inset focus:ring-teal-100"})]})]})]})]}),(0,a.jsxs)("div",{className:(0,F.cn)(O.V.panel,"space-y-6"),children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"p-2 bg-rose-100 text-rose-600 rounded-xl",children:(0,a.jsx)(_.A,{className:"w-5 h-5"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h3",{className:"text-lg font-black text-slate-800",children:"자동 응대 및 시작 화면"}),(0,a.jsx)("p",{className:"text-slate-500 text-xs font-medium",children:"도움 버튼\xb7인사말 설계"})]})]}),(0,a.jsxs)("div",{className:"grid gap-4",children:[(0,a.jsxs)("div",{className:"p-4 lg-inset rounded-xl space-y-3",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-800 flex items-center gap-1",children:"KAI 문의 배너 (채팅 본문 위)"}),(0,a.jsx)("span",{className:(0,F.cn)("text-[10px] font-black",!1!==eN.cta_banner_enabled?"text-teal-600":"text-slate-400"),children:!1!==eN.cta_banner_enabled?"표시":"숨김"}),(0,a.jsx)(n.dO,{checked:!1!==eN.cta_banner_enabled,onCheckedChange:e=>e_(t=>({...t,cta_banner_enabled:e})),className:"scale-110 data-[state=checked]:bg-teal-500"})]}),(0,a.jsx)("p",{className:"text-xs text-slate-500",children:"병원 페이지 채팅에서 코디네이터 인사말 바로 위에 노출됩니다."}),!1!==eN.cta_banner_enabled&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.pd,{value:eN.cta_banner_text??ey,onChange:e=>e_(t=>({...t,cta_banner_text:e.target.value})),placeholder:ey,className:"h-10 rounded-xl text-sm px-3 lg-inset font-medium"}),eD.ctaBanner&&eD.ctaBanner.length>0&&(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5 mt-1",children:eD.ctaBanner.map((e,t)=>{let s="guarantee"===e.category||"superlative"===e.category||"comparison"===e.category||"fear"===e.category;return(0,a.jsxs)("span",{className:(0,F.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-[10px] font-bold",s?"bg-rose-50 text-rose-700 border-rose-200":"bg-amber-50 text-amber-700 border-amber-200"),title:e.reason,children:[(0,a.jsx)(b.A,{className:"w-3 h-3"}),'"',e.matched,'" — ',s?"확인 필요":"검토 권장"]},t)})})]})]}),(0,a.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between p-4 k
1d-surface-muted border border-white rounded-xl shadow-sm gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(n.JU,{className:"text-sm font-black text-slate-800",children:"채팅 시작 시 자동 인사"}),(0,a.jsx)("p",{className:"text-xs text-slate-500 font-medium",children:"환자가 채팅을 열 때 처음 보게 되는 인사말"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,F.cn)("text-[10px] font-black",eN.auto_greeting?"text-rose-500":"text-slate-300"),children:eN.auto_greeting?"활성":"꺼짐"}),(0,a.jsx)(n.dO,{checked:eN.auto_greeting,onCheckedChange:e=>e_(t=>({...t,auto_greeting:e})),className:"scale-110 data-[state=checked]:bg-rose-500"})]})]}),eN.auto_greeting&&(0,a.jsxs)("div",{className:"space-y-3 animate-in fade-in slide-in-from-top-2 duration-300 lg-inset p-4 rounded-xl",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)(n.JU,{className:"text-slate-700 font-black text-sm",children:"첫 인사말"}),!eJ&&(0,a.jsxs)("button",{onClick:()=>eU(!0),className:"text-[10px] text-teal-500 hover:text-teal-600 font-black flex items-center gap-1",children:[(0,a.jsx)(p.A,{className:"w-3 h-3"})," 기본 문구로"]})]}),(0,a.jsx)(n.TM,{value:eN.greeting_message,onChange:e=>{e_(t=>({...t,greeting_message:e.target.value})),eU(!1)},placeholder:"환영 인사를 입력하세요...",rows:3,className:"rounded-xl text-sm px-4 py-3 lg-inset focus:ring-rose-50 font-medium leading-relaxed resize-none"}),eD.greeting&&eD.greeting.length>0&&(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5",children:eD.greeting.map((e,t)=>{let s="guarantee"===e.category||"superlative"===e.category||"comparison"===e.category||"fear"===e.category;return(0,a.jsxs)("span",{className:(0,F.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-[10px] font-bold",s?"bg-rose-50 text-rose-700 border-rose-200":"bg-amber-50 text-amber-700 border-amber-200"),title:e.reason,children:[(0,a.jsx)(b.A,{className:"w-3 h-3"}),'"',e.matched,'" — ',s?"확인 필요":"검토 권장"]},t)})}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)("span",{className:"text-[10px] text-slate-500 font-bold",children:"자동 입력:"}),[{token:"{{병원명}}",label:"병원명",color:"emerald"},{token:"{{이름}}",label:"상담원 이름",color:"indigo"},{token:"{{역할}}",label:"상담원 역할",color:"violet"}].map(e=>(0,a.jsx)(n.Ex,{variant:"outline",className:(0,F.cn)("cursor-pointer text-[10px] px-2 py-1 font-bold border rounded-lg flex items-center gap-1","emerald"===e.color?"border-emerald-100 text-emerald-600 bg-emerald-50 hover:bg-emerald-100":"indigo"===e.color?"border-teal-100 text-teal-600 bg-teal-50 hover:bg-teal-100":"border-cyan-100 text-cyan-600 bg-cyan-50 hover:bg-cyan-100"),onClick:()=>{e_(t=>({...t,greeting_message:t.greeting_message+" "+e.token})),eU(!1)},children:e.label},e.token))]})]}),(0,a.jsxs)("div",{className:"space-y-3 pt-6 border-t kd-border-translucent",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(_.A,{className:"w-4 h-4 text-teal-500"}),(0,a.jsx)(n.JU,{className:"text-slate-700 font-black text-sm",children:"첫 화면 추천 질문"})]}),(0,a.jsxs)(n.$n,{type:"button",variant:"outline",size:"sm",onClick:eK,disabled:ex,className:"h-8 text-xs rounded-xl border-teal-200 text-teal-600 hover:bg-teal-50 hover:text-teal-700",children:[ex?(0,a.jsx)(p.A,{className:"w-3.5 h-3.5 mr-1.5 animate-spin"}):(0,a.jsx)(y.A,{className:"w-3.5 h-3.5 mr-1.5"}),"자동 추천"]})]}),(0,a.jsx)("p",{className:"text-xs text-slate-500 font-medium",children:"채팅 첫 화면에 표시될 추천 질문 버튼을 설정합니다. 최대 5개까지 추가할 수 있습니다. 비워두면 자동 생성된 질문이 표시됩니다."}),(0,a.jsxs)("div",{className:"space-y-2",children:[eN.quick_cta?.map((e,t)=>{let s=eD.quickCta?.[t]??[];return(0,a.jsxs)("div",{className:"space-y-1",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(n.pd,{value:e,onCh
1ange:e=>{let s=[...eN.quick_cta||[]];s[t]=e.target.value,e_(e=>({...e,quick_cta:s}))},placeholder:"예: 인기 시술이 뭐예요?",className:"h-10 rounded-xl text-sm px-4 lg-inset focus:ring-teal-100 font-medium"}),(eN.quick_cta?.length??0)>1&&(0,a.jsx)(n.$n,{type:"button",variant:"outline",size:"sm",onClick:()=>{let e=(eN.quick_cta||[]).filter((e,s)=>s!==t);e_(t=>({...t,quick_cta:e}))},className:"h-10 w-10 p-0 text-red-500 hover:text-red-600 hover:bg-red-50 rounded-xl",children:(0,a.jsx)(w.A,{className:"w-4 h-4"})})]}),s.length>0&&(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5",children:s.map((e,t)=>{let s="guarantee"===e.category||"superlative"===e.category||"comparison"===e.category||"fear"===e.category;return(0,a.jsxs)("span",{className:(0,F.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-[10px] font-bold",s?"bg-rose-50 text-rose-700 border-rose-200":"bg-amber-50 text-amber-700 border-amber-200"),title:e.reason,children:[(0,a.jsx)(b.A,{className:"w-3 h-3"}),'"',e.matched,'" — ',s?"확인 필요":"검토 권장"]},t)})})]},t)}),(eN.quick_cta?.length??0)<5&&(0,a.jsxs)(n.$n,{type:"button",variant:"outline",size:"sm",onClick:()=>{let e=eN.quick_cta||[];e_(t=>({...t,quick_cta:[...e,""]}))},className:"h-10 text-xs rounded-xl",children:[(0,a.jsx)(k.A,{className:"w-3.5 h-3.5 mr-1.5"}),"질문 추가"]})]})]})]})]})]})})]}),(0,a.jsx)(n.lG,{open:!!eg,onOpenChange:e=>{e||(eu(null),ef(!1),ev(!1))},children:(0,a.jsxs)(n.Cf,{className:"max-w-lg",children:[(0,a.jsxs)(n.c7,{children:[(0,a.jsxs)(n.L3,{className:"flex items-center gap-2 text-rose-700",children:[(0,a.jsx)(b.A,{className:"w-5 h-5"}),eg?.presetLabel," — 의료광고법 위반 가능"]}),(0,a.jsx)(n.rr,{className:"text-slate-600 leading-relaxed",children:"이 응대 모드는 환자에게 예약\xb7시술 상품을 적극 권유합니다."})]}),(0,a.jsxs)("div",{className:"space-y-3 text-sm text-slate-700",children:[(0,a.jsxs)("div",{className:"p-3 bg-rose-50 border border-rose-200 rounded-xl space-y-2",children:[(0,a.jsx)("p",{className:"font-bold text-rose-900",children:"법적 주의 사항"}),(0,a.jsxs)("ul",{className:"text-xs text-rose-800/90 space-y-1 list-disc ml-5",children:[(0,a.jsxs)("li",{children:[(0,a.jsx)("strong",{children:"의료법 56 조"})," (의료광고 금지 — 거짓\xb7과장 광고, 환자 유인성 표현)"]}),(0,a.jsxs)("li",{children:[(0,a.jsx)("strong",{children:"의료법 27 조 3 항"})," (환자 유인\xb7알선 금지 — 본인부담금 면제\xb7할인 등)"]}),(0,a.jsxs)("li",{children:['응답 가드가 "완치\xb7100%\xb7보장\xb7최고" 금지 표현을 자동 차단하나, ',(0,a.jsx)("strong",{children:"콘텐츠 책임은 병원에 있습니다"}),"."]})]})]}),(0,a.jsxs)("div",{className:"p-3 bg-amber-50 border border-amber-200 rounded-xl space-y-2",children:[(0,a.jsx)("p",{className:"font-bold text-amber-900",children:"기록"}),(0,a.jsx)("p",{className:"text-xs text-amber-800/90",children:"이 모드 선택은 누가 언제 바꿨는지 이전 설정과 함께 기록됩니다."})]}),(0,a.jsxs)("label",{className:"flex items-start gap-2 cursor-pointer",children:[(0,a.jsx)("input",{type:"checkbox",checked:eb,onChange:e=>ef(e.target.checked),className:"mt-0.5 w-4 h-4 accent-rose-600"}),(0,a.jsx)("span",{className:"text-xs text-slate-700 leading-relaxed",children:"의료광고법 56\xb727 조 위험을 이해했으며, 콘텐츠 책임이 병원에 있음을 확인합니다."})]}),eg?.riskLevel==="extreme"&&(0,a.jsxs)("label",{className:"flex items-start gap-2 cursor-pointer",children:[(0,a.jsx)("input",{type:"checkbox",checked:ej,onChange:e=>ev(e.target.checked),className:"mt-0.5 w-4 h-4 accent-rose-600"}),(0,a.jsx)("span",{className:"text-xs text-slate-700 leading-relaxed",children:"이 모드는 환자 유인성 표현 위반 위험이 매우 높습니다. 그럼에도 진행함을 추가 확인합니다."})]})]}),(0,a.jsxs)(n.Es,{children:[(0,a.jsx)(n.$n,{variant:"outline",onClick:()=>{eu(null),ef(!1),ev(!1)},children:"취소"}),(0,a.jsx)(n.$n,{onClick:ez,disabled:!eb||eg?.riskLevel==="extreme"&&!ej,className:"bg-rose-600 hover:bg-rose-700 text-white",children:"적용 (책임 동의)"})]})]})})]})}},74643:(e,t,s)=>{s.d(t,{A:()=>a});let a=(0,s(90425).A)("volume-2",[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]])},96909:(e,t,s)=>{s.d(t,{A:()=>a});let a=(0,s(90425).A)("mic",[["path",{d:"M12 19v3",key:"npa21l"}],["path",{d:"M19 10v2a7 7 0 0 1-14 0v-2",key:"1vc78b"}],["rect",{x:"9",y:"2",width:"6",height:"13",rx:"3",key:"s6n7sd"}]])}}]);

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.