本地 RAG 知识库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

2 lines
22 KiB

var ChatbotSDK=function(){"use strict";const n="[ChatbotSDK]";let e=!0;const t={info(t,r){e&&console.log(n,t,void 0!==r?r:"")},warn(t,r){e&&console.warn(n,t,void 0!==r?r:"")},error(e,t){console.error(n,e,void 0!==t?t:"")}};let r=null;function o(n){if(!r)throw new Error("API 配置未初始化");return`${r.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function i(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function s(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new a("请求超时,请稍后重试","timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new a("跨域请求被拦截,请联系管理员将当前域名加入 API 白名单","cors");throw new a("网络连接失败,请检查网络","network")}finally{clearTimeout(o)}}class a extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function c(n){switch(n){case 401:return"鉴权失败,请联系管理员";case 403:return"无访问权限,请联系管理员配置";case 404:return"请求的资源不存在";case 429:return"请求过于频繁,请稍后重试";case 500:return"服务器异常,请稍后重试";case 502:case 503:return"服务暂不可用,请稍后重试";default:return`请求失败(状态码 ${n}`}}async function l(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n),l=Date.now();t.info(`发送消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(e);if(!n.ok){const e=c(n.status);throw t.error(`请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),new a(e,`http_${n.status}`)}const o=await n.text(),i=Date.now()-l;return t.info(`AI 回复 integrateId=${r.integrateId} length=${o.length} duration=${i}ms`),o}catch(n){if(n instanceof a)throw n;throw t.error(`请求异常 integrateId=${r.integrateId}`,n),new a("请求发生未知错误","unknown")}}async function d(n,e,l,d){var u;const m=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sse?${e.toString()}`)}(n),p=Date.now();let g="";t.info(`发送流式消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(m,{},6e4);if(!n.ok){const e=c(n.status);return t.error(`流式请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),void d(new a(e,`http_${n.status}`))}const o=null===(u=n.body)||void 0===u?void 0:u.getReader();if(!o)return void d(new a("浏览器不支持流式读取","stream_unsupported"));const i=new TextDecoder("utf-8",{stream:!0});let h="";try{for(;;){const{done:n,value:t}=await o.read();if(n)break;h+=i.decode(t,{stream:!0});const r=h.split("\n");h=r.pop()||"";for(const n of r){const t=n.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const n=t.substring(5).trim();n&&(g+=n,e(n))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(g+=t,e(t))}}}if(h.trim()){const n=h.trim();if(n.startsWith("data:")){const t=n.substring(5).trim();t&&(g+=t,e(t))}else"[DONE]"!==n&&(g+=n,e(n))}}catch(n){if(!(g.length>0))throw n;e("\n\n[网络不稳定,内容可能不完整]")}finally{o.releaseLock()}const f=Date.now()-p;t.info(`流式回复完成 integrateId=${r.integrateId} length=${g.length} duration=${f}ms`),l()}catch(n){n instanceof a?d(n):(t.error(`流式请求异常 integrateId=${r.integrateId}`,n),d(new a("网络连接失败,请检查网络","network")))}}let u=null;function m(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),i=r(parseInt(t[2],16)+e),s=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function p(n){document.querySelector("style[data-csk-sdk]")||(u=document.createElement("style"),u.setAttribute("data-csk-sdk",""),u.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${m(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(u))}function g(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})}function h(){return Date.now()}function f(n,e){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===n.position?"left":"right"),t.setAttribute("title",n.title),t.setAttribute("aria-label",n.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=n.launcherIcon;const r=function(n,e){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,r),t=null},e)}}(e,300);return t.addEventListener("click",r),t.addEventListener("keydown",n=>{"Enter"!==n.key&&" "!==n.key||(n.preventDefault(),r())}),t}function x(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function k(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function w(n){n.scrollTop=n.scrollHeight}function b(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function y(n){return`csk_history_${n}`}function v(n){try{localStorage.removeItem(y(n))}catch(n){t.warn("清空会话历史失败",n)}}let I=null,C=[],E=null,_=null,$=null,D=null,L=null,A=null,N=!1;function S(n,e){I=n,E=e.messagesContainer,_=e.inputEl,$=e.sendBtn,D=e.clearBtn,L=e.showLoading,A=e.hideLoading,function(){if(!_||!$)return;$.addEventListener("click",()=>{B()}),_.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),B())}),_.addEventListener("input",()=>{F()}),D&&D.addEventListener("click",()=>{!function(){if(!I)return;if(!confirm("确定清空所有对话记录?"))return;C=[],E&&(E.innerHTML="");D&&(D.style.display="none");v(I.integrateId),t.info(`清空会话 integrateId=${I.integrateId}`)}()})}();const r=function(n){try{const e=localStorage.getItem(y(n));if(!e)return[];const r=JSON.parse(e);return r&&Array.isArray(r.messages)?(t.info(`加载历史消息 integrateId=${n} count=${r.messages.length}`),r.messages):[]}catch(n){return t.warn("加载会话历史失败",n),[]}}(n.integrateId);r.length>0&&(C=r,function(){if(!E)return;E.innerHTML="";for(const n of C)"user"===n.role?x(E,n.content,n.timestamp):k(E,n.content,n.timestamp);w(E),D&&C.length>0&&(D.style.display="inline-flex")}())}function F(){if(!$||!_)return;_.value.trim().length>0&&!N?$.removeAttribute("disabled"):$.setAttribute("disabled","true")}async function B(){if(!_||!I||N)return;const n=_.value.trim();if(""===n)return;_.value="",F(),_.style.height="auto",N=!0,F();const e=h();E&&x(E,n,e);const r={id:g(),role:"user",content:n,timestamp:e};C.push(r),D&&C.length>0&&(D.style.display="inline-flex"),E&&w(E),L&&L(),E&&w(E);try{let e;const r=h();e=I.streaming?await async function(n,e){return new Promise((t,r)=>{let o=null,i=null,s="",a=!1;d(n,n=>{if(s+=n,!a&&E){A&&A();const{wrapper:n,bubble:t}=function(n,e){const t=document.createElement("div");t.className="csk-msg csk-msg--ai";const r=document.createElement("div");r.className="csk-msg__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=b(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(E,e);i=n,o=t,a=!0}o&&(o.textContent=s),E&&w(E)},()=>{a||""!==s?t(s):l(n).then(n=>t(n)).catch(r)},n=>{s.length>0?(o&&(o.textContent=s+"\n\n[回复被中断]"),t(s)):r(n)})})}(n,r):await l(n),A&&A(),!I.streaming&&E&&k(E,e,r);const o={id:g(),role:"ai",content:e,timestamp:r};C.push(o),function(n,e){try{let r=e;r.length>200&&(r=r.slice(50),t.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${r.length}`));const o={messages:r,updatedAt:Date.now()};localStorage.setItem(y(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?t.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):t.error("保存会话历史失败",n)}}(I.integrateId,C),E&&w(E)}catch(n){A&&A();const e=n instanceof a?n.message:"发送失败,请稍后重试";if(E){const n=document.createElement("div");n.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`${e}`,n.appendChild(t),E.appendChild(n)}t.error(`发送失败 integrateId=${I.integrateId}`,n)}finally{N=!1,F()}}let M=null,q=!1,T=null,H=null,z=null,j=null,U=null,W=null,K=null,O=null,P=null;function R(){H&&H.classList.remove("csk-window--hidden")}function J(){H&&H.classList.add("csk-window--hidden")}function X(){H&&(H.classList.contains("csk-window--hidden")?(R(),setTimeout(()=>{j&&j.focus()},100)):J())}const Y={init:function(n){if(q)return void t.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const o=function(n){var e,r,o,i,s,a;if(!n.integrateId||"string"!=typeof n.integrateId||""===n.integrateId.trim())return t.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return t.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return t.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:n.integrateId.trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,roleId:n.roleId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(r=n.width)&&void 0!==r?r:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>\n <path d="M8 9h8"/><path d="M8 13h6"/>\n</svg>',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(i=n.showAdminPanel)&&void 0!==i&&i,streaming:null===(s=n.streaming)||void 0===s||s,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a};return t.info(`配置解析完成 integrateId=${c.integrateId} requestDomain=${c.requestDomain}`),c}(n);if(!o)return;var i;M=o,i=M.debug,e=i,function(n){r=n}(M),p(M),T=f(M,X),document.body.appendChild(T);const s=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const i=document.createElement("button");i.className="csk-header__btn csk-header__btn--minimize",i.setAttribute("title","最小化"),i.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"/></svg>',i.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const s=document.createElement("button");s.className="csk-header__btn csk-header__btn--close",s.setAttribute("title","关闭"),s.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',s.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(i),o.appendChild(s),t.appendChild(r),t.appendChild(o);const a=document.createElement("div");a.id="csk-messages",a.className="csk-messages";const c=document.createElement("div");c.className="csk-input-area";const l=document.createElement("textarea");l.id="csk-input",l.className="csk-input",l.setAttribute("placeholder","输入您的问题..."),l.setAttribute("rows","1"),l.setAttribute("autofocus","");const d=document.createElement("button");d.id="csk-send-btn",d.className="csk-send-btn",d.setAttribute("title","发送"),d.setAttribute("disabled","true"),d.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',c.appendChild(l),c.appendChild(d),e.appendChild(t),e.appendChild(a),e.appendChild(c);let u=null;n.showClear&&(u=document.createElement("button"),u.className="csk-clear-btn",u.textContent="清空对话",u.style.display="none",e.insertBefore(u,c));let m=null;return{window:e,messagesContainer:a,inputEl:l,sendBtn:d,clearBtn:u,showLoading:function(){if(m)return m.style.display="flex",m;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n <div class="csk-loading__dot"></div>\n <div class="csk-loading__dot"></div>\n <div class="csk-loading__dot"></div>\n ',a.appendChild(n),m=n,n},hideLoading:function(){m&&m.parentNode&&(m.parentNode.removeChild(m),m=null)}}}(M);H=s.window,z=s.messagesContainer,j=s.inputEl,U=s.sendBtn,W=s.clearBtn,K=s.showLoading,O=s.hideLoading,document.body.appendChild(H);const a=H.querySelector(".csk-header");a&&(P=function(n,e){let t=!1,r=0,o=0,i=0,s=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();i=r-a.left,s=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",l)},c=n=>{if(!t)return;const r=n.clientX-i,o=n.clientY-s,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},l=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)}}(a,H)),S(M,{messagesContainer:z,inputEl:j,sendBtn:U,clearBtn:W,showLoading:K,hideLoading:O}),q=!0,t.info(`初始化完成 integrateId=${M.integrateId} requestDomain=${M.requestDomain}`)},destroy:function(){if(!q)return;T&&T.parentNode&&(T.parentNode.removeChild(T),T=null),H&&H.parentNode&&(H.parentNode.removeChild(H),H=null),P&&(P(),P=null),u&&u.parentNode&&(u.parentNode.removeChild(u),u=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==M?void 0:M.integrateId;M=null,q=!1,z=null,j=null,U=null,W=null,K=null,O=null,t.info(`销毁实例 integrateId=${n}`)},open:R,close:J,toggle:X,clearHistory:function(){M&&(W?W.click():confirm("确定清空所有对话记录?")&&v(M.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=Y),Y}();
//# sourceMappingURL=chatbot-sdk.min.js.map