var ChatbotSDK=function(){"use strict";const e="[ChatbotSDK]";let n=!0;const t={},r={info(t,r){n&&console.log(e,t,void 0!==r?r:"")},warn(t,r){n&&console.warn(e,t,void 0!==r?r:"")},error(n,t){console.error(e,n,void 0!==t?t:"")},time(e){t[e]=Date.now()},timeEnd(r,o){const s=t[r];if(void 0!==s){const i=Date.now()-s;if(delete t[r],n){const n=o?`${o} ${i}ms`:`${r} ${i}ms`;console.log(e,n)}return i}return 0},lifecycleInit(e,n){this.info(`初始化完成 integrateId=${e} requestDomain=${n}`)},lifecycleDestroy(e){this.info(`销毁实例 integrateId=${e}`)},lifecycleSend(e,n){this.info(`发送消息 integrateId=${e} length=${n}`),this.time(`send_${e}`)},lifecycleReply(e,n){const t=this.timeEnd(`send_${e}`,"AI 回复");this.info(`AI 回复 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleError(e,n,t){this.timeEnd(`send_${e}`),this.error(`请求失败 integrateId=${e} status=${n} message=${t}`)},lifecycleClear(e){this.info(`清空会话 integrateId=${e}`)},lifecycleStreamDone(e,n){const t=this.timeEnd(`send_${e}`,"流式回复");this.info(`流式回复完成 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleCategoryChange(e){this.info(`切换知识库分类 categoryId=${e}`)}};const o={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",placeholder:"输入您的问题...",send:"发送",loading:"正在思考...",stream_interrupted:"回复被中断",stream_unstable:"网络不稳定,内容可能不完整",category_placeholder:"选择知识库分类",category_all:"全部分类",category_load_error:"加载分类失败",source_title:"参考来源",source_count:"{n} 条参考来源",source_loading:"加载来源中...",clear:"清空对话",clear_confirm:"确定清空所有对话记录?",history_title:"历史会话",history_empty:"暂无历史会话",history_load_error:"加载会话列表失败",history_delete_confirm:"确定删除该会话?",history_export:"导出",history_delete:"删除",error_network:"网络连接失败,请检查网络",error_timeout:"请求超时,请稍后重试",error_server:"服务器异常,请稍后重试",error_cors:"跨域请求被拦截,请联系管理员将当前域名加入 API 白名单",error_auth:"鉴权失败,请联系管理员",error_forbidden:"无访问权限,请联系管理员配置",error_not_found:"请求的资源不存在",error_rate_limit:"请求过于频繁,请稍后重试",error_unavailable:"服务暂不可用,请稍后重试",error_unknown:"请求发生未知错误",error_send:"发送失败,请稍后重试",error_stream_unsupported:"浏览器不支持流式读取"},en:{title:"AI Assistant",minimize:"Minimize",close:"Close",placeholder:"Type your question...",send:"Send",loading:"Thinking...",stream_interrupted:"Response interrupted",stream_unstable:"Network unstable, content may be incomplete",category_placeholder:"Select category",category_all:"All categories",category_load_error:"Failed to load categories",source_title:"Sources",source_count:"{n} source(s)",source_loading:"Loading sources...",clear:"Clear chat",clear_confirm:"Clear all conversation history?",history_title:"History",history_empty:"No conversations yet",history_load_error:"Failed to load conversations",history_delete_confirm:"Delete this conversation?",history_export:"Export",history_delete:"Delete",error_network:"Network connection failed",error_timeout:"Request timed out, please try again",error_server:"Server error, please try again later",error_cors:"CORS request blocked. Please contact admin to whitelist your domain",error_auth:"Authentication failed, please contact admin",error_forbidden:"Access denied, please contact admin",error_not_found:"Resource not found",error_rate_limit:"Too many requests, please try again later",error_unavailable:"Service temporarily unavailable",error_unknown:"Unknown request error",error_send:"Failed to send, please try again",error_stream_unsupported:"Browser does not support streaming"}};let s="zh-CN";function i(e,n){let t=(o[s]||o["zh-CN"])[e]||o["zh-CN"][e]||e;if(n)for(const[e,r]of Object.entries(n))t=t.replace(`{${e}}`,String(r));return t}let a=null;function c(e){a&&(a.chatId=e)}function l(){return(null==a?void 0:a.chatId)||""}function d(e){if(!a)throw new Error("API 配置未初始化");return`${a.requestDomain.replace(/\/+$/,"")}${e.startsWith("/")?e:`/${e}`}`}function u(e,n,t){null!=t&&("string"==typeof t&&""===t.trim()||e.set(n,String(t)))}async function p(e,n={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(e,Object.assign(Object.assign({},n),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(e){if(e instanceof DOMException&&"AbortError"===e.name)throw new m(i("error_timeout"),"timeout");if(e instanceof TypeError&&e.message.includes("Failed to fetch"))throw new m(i("error_cors"),"cors");throw new m(i("error_network"),"network")}finally{clearTimeout(o)}}class m extends Error{constructor(e,n){super(e),this.name="CskError",this.type=n}}function h(e){switch(e){case 401:return i("error_auth");case 403:return i("error_forbidden");case 404:return i("error_not_found");case 429:return i("error_rate_limit");case 500:return i("error_server");case 502:case 503:return i("error_unavailable");default:return`${i("error_unknown")}(${e})`}}async function g(e){const n=function(e){const n=new URLSearchParams;return n.set("message",e),n.set("chatId",a.chatId),u(n,"roleId",a.integrateId),u(n,"accountId",a.userId),d(`/ai/assistant_app/chat/sync?${n.toString()}`)}(e);r.lifecycleSend(a.integrateId,e.length);try{const e=await p(n);if(!e.ok){const n=h(e.status);throw r.lifecycleError(a.integrateId,String(e.status),n),new m(n,`http_${e.status}`)}const t=await e.text();return r.lifecycleReply(a.integrateId,t.length),t}catch(e){if(e instanceof m)throw e;throw r.lifecycleError(a.integrateId,"unknown",String(e)),new m(i("error_unknown"),"unknown")}}async function k(e,n,t,o,s,c){var l;const g=c?function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),u(t,"roleId",a.integrateId),u(t,"accountId",a.userId),u(t,"categoryId",null!=n?n:a.categoryId),d(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(e,s):function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",a.chatId),u(t,"roleId",a.integrateId),u(t,"accountId",a.userId),u(t,"categoryId",null!=n?n:a.categoryId),d(`/ai/assistant_app/chat/sse?${t.toString()}`)}(e,s);let k="";r.lifecycleSend(a.integrateId,e.length);try{const e=await p(g,{},6e4);if(!e.ok){const n=h(e.status);return r.lifecycleError(a.integrateId,String(e.status),n),void o(new m(n,`http_${e.status}`))}const s=null===(l=e.body)||void 0===l?void 0:l.getReader();if(!s)return void o(new m(i("error_stream_unsupported"),"stream_unsupported"));const c=new TextDecoder("utf-8",{stream:!0});let d="";try{for(;;){const{done:e,value:t}=await s.read();if(e)break;d+=c.decode(t,{stream:!0});const r=d.split("\n");d=r.pop()||"";for(const e of r){const t=e.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const e=t.substring(5).trim();e&&(k+=e,n(e))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(k+=t,n(t))}}}if(d.trim()){const e=d.trim();if(e.startsWith("data:")){const t=e.substring(5).trim();t&&(k+=t,n(t))}else"[DONE]"!==e&&(k+=e,n(e))}}catch(e){if(!(k.length>0))throw e;n("\n\n"+i("stream_unstable"))}finally{s.releaseLock()}r.lifecycleStreamDone(a.integrateId,k.length),t()}catch(e){e instanceof m?o(e):(r.lifecycleError(a.integrateId,"unknown",String(e)),o(new m(i("error_network"),"network")))}}async function f(e,n){const t=function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),u(t,"roleId",a.integrateId),u(t,"accountId",a.userId),u(t,"categoryId",null!=n?n:a.categoryId),d(`/ai/assistant_app/rag/sources?${t.toString()}`)}(e,n);try{const e=await p(t);if(!e.ok)throw new m(h(e.status),`http_${e.status}`);const n=await e.json();return n.success&&Array.isArray(n.data)?(r.info(`获取引用来源 count=${n.data.length}`),n.data):[]}catch(e){return r.error("获取引用来源失败",e),[]}}async function y(e=1,n=20,t,o){let s=`/conversation/list?page=${e}&size=${n}`;t&&(s+=`&accountId=${encodeURIComponent(t)}`),o&&(s+=`&roleId=${encodeURIComponent(o)}`);const i=d(s);try{const e=await p(i);if(!e.ok)throw new m(h(e.status),`http_${e.status}`);const n=await e.json();return{list:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0,pages:n.pages||0}}catch(e){return r.error("加载会话列表失败",e),{list:[],total:0,pages:0}}}async function b(e){const n=d(`/conversation/${e}/messages`);try{const e=await p(n);if(!e.ok)throw new m(h(e.status),`http_${e.status}`);const t=await e.json();return{messages:t.success&&Array.isArray(t.data)?t.data:[],total:t.total||0}}catch(e){return r.error("加载会话消息失败",e),{messages:[],total:0}}}async function x(){if(!a)return"";const e=function(e,n){try{return localStorage.getItem(_(e,n))||""}catch(e){return""}}(a.integrateId,a.userId);if(e)return a.chatId=e,r.info(`从缓存恢复 chatId=${e}`),e;try{const e=await y(1,5,a.userId,a.integrateId);if(e.list.length>0){const n=e.list[0],t=n.conversationId||n.chatId||"";if(t)return a.chatId=t,w(a.integrateId,a.userId,t),r.info(`从后端恢复会话 chatId=${t} messageCount=${n.messageCount}`),t}}catch(e){r.warn("查询后端会话列表失败,将生成新 chatId",e)}const n=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();return a.chatId=n,w(a.integrateId,a.userId,n),r.info(`生成新 chatId=${n}`),n}function _(e,n){return`csk_chatId_${e}${n?"_"+n:""}`}function w(e,n,t){try{t?localStorage.setItem(_(e,n),t):localStorage.removeItem(_(e,n))}catch(e){}}let v=null;function E(e){const n=function(e,n){const t=e.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return e;const r=e=>Math.max(0,Math.min(255,e)),o=r(parseInt(t[1],16)+n),s=r(parseInt(t[2],16)+n),i=r(parseInt(t[3],16)+n);return`#${o.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}`}(e.primaryColor,-15);return`\n --csk-primary: ${e.primaryColor};\n --csk-primary-hover: ${n};\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: ${e.width}px;\n `}function I(e){document.querySelector("style[data-csk-sdk]")||(v=document.createElement("style"),v.setAttribute("data-csk-sdk",""),v.textContent=function(e){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${E(e)}\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/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n border-top: 1px solid #E5E7EB;\n background: #F9FAFB;\n gap: 8px;\n}\n.csk-category-bar__label {\n font-size: 12px;\n color: #6B7280;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 12px;\n color: #374151;\n background: #fff;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s;\n max-width: 200px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F9FAFB;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover {\n background: #F3F4F6;\n}\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n}\n.csk-sources--collapsed .csk-sources__arrow {\n transform: rotate(-90deg);\n}\n.csk-sources__body {\n border-top: 1px solid #E5E7EB;\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body {\n display: none;\n}\n.csk-source-item {\n padding: 8px 12px;\n border-bottom: 1px solid #F3F4F6;\n transition: background 0.15s;\n}\n.csk-source-item:last-child {\n border-bottom: none;\n}\n.csk-source-item:hover {\n background: #F9FAFB;\n}\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 2px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.csk-source-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p {\n margin: 0 0 8px;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child {\n margin-bottom: 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1,\n.csk-msg--ai .csk-msg__bubble .csk-md-h2,\n.csk-msg--ai .csk-msg__bubble .csk-md-h3,\n.csk-msg--ai .csk-msg__bubble .csk-md-h4,\n.csk-msg--ai .csk-msg__bubble .csk-md-h5,\n.csk-msg--ai .csk-msg__bubble .csk-md-h6 {\n margin: 12px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; }\n\n.csk-md-code-block {\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 8px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.5;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-md-code-block code {\n background: none;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n color: inherit;\n}\n.csk-md-inline-code {\n background: #E5E7EB;\n color: #DC2626;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol {\n padding-left: 20px;\n margin: 6px 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul li,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol li {\n margin-bottom: 4px;\n}\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding-left: 12px;\n margin: 8px 0;\n color: #6B7280;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n}\n.csk-md-link:hover {\n text-decoration: underline;\n}\n.csk-md-hr {\n border: none;\n border-top: 1px solid #E5E7EB;\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-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-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-history-panel {\n position: absolute;\n top: 48px;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n z-index: 10;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.csk-history-panel--hidden {\n display: none;\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n background: #F9FAFB;\n}\n.csk-history-panel__title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n}\n.csk-history-panel__back {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n.csk-history-panel__back:hover {\n background: #F3F4F6;\n}\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n.csk-history-panel__list::-webkit-scrollbar {\n width: 4px;\n}\n.csk-history-panel__list::-webkit-scrollbar-thumb {\n background: #E5E7EB;\n border-radius: 2px;\n}\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 4px;\n}\n.csk-history-item:hover {\n background: #F3F4F6;\n}\n.csk-history-item--active {\n background: #EEF2FF;\n border-left: 3px solid var(--csk-primary);\n}\n.csk-history-item--active:hover {\n background: #E0E7FF;\n}\n.csk-history-item__info {\n flex: 1;\n min-width: 0;\n}\n.csk-history-item__id {\n font-size: 13px;\n font-weight: 500;\n color: #1F2937;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-history-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n.csk-history-item__actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.csk-history-item:hover .csk-history-item__actions {\n opacity: 1;\n}\n.csk-history-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export {\n background: #EFF6FF;\n color: #2563EB;\n}\n.csk-history-action--export:hover {\n background: #DBEAFE;\n}\n.csk-history-action--delete {\n background: #FEF2F2;\n color: #DC2626;\n}\n.csk-history-action--delete:hover {\n background: #FEE2E2;\n}\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n color: #9CA3AF;\n font-size: 13px;\n}\n.csk-history-panel__loadmore {\n display: block;\n width: 100%;\n padding: 10px;\n border: none;\n background: #F9FAFB;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n transition: background 0.15s;\n}\n.csk-history-panel__loadmore:hover {\n background: #F3F4F6;\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`}(e),document.head.appendChild(v))}function C(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const n=16*Math.random()|0;return("x"===e?n:3&n|8).toString(16)})}function $(e){const n={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,e=>n[e]||e)}function S(){return Date.now()}function F(e,n){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===e.position?"left":"right"),t.setAttribute("title",e.title),t.setAttribute("aria-label",e.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=e.launcherIcon;const r=function(e,n){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{e.apply(this,r),t=null},n)}}(n,300);return t.addEventListener("click",r),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),r())}),t}function A(e,n,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=n;const s=document.createElement("div");return s.className="csk-msg__time",s.textContent=M(t),r.appendChild(o),r.appendChild(s),e.appendChild(r),r}function N(e,n,t,r){const o=document.createElement("div");o.className="csk-msg csk-msg--ai";const s=document.createElement("div");s.className="csk-msg__bubble",r?s.innerHTML=r(n):s.textContent=n;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=M(t),o.appendChild(s),o.appendChild(i),e.appendChild(o),o}function L(e,n){const t=e.querySelector(".csk-sources");if(t&&t.remove(),!n||0===n.length)return;const r=document.createElement("div");r.className="csk-sources csk-sources--collapsed";const o=document.createElement("div");o.className="csk-sources__header";const s=document.createElement("span");s.className="csk-sources__title",s.textContent=`📚 ${i("source_count",{n:n.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",o.appendChild(s),o.appendChild(a),o.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const c=document.createElement("div");c.className="csk-sources__body";for(const e of n){const n=document.createElement("div");n.className="csk-source-item";const t=document.createElement("div");if(t.className="csk-source-item__name",t.textContent=e.title||e.sourceName||"未知文档",e.snippet){const t=document.createElement("div");t.className="csk-source-item__snippet",t.textContent=e.snippet,n.appendChild(t)}const r=document.createElement("div");r.className="csk-source-item__meta";const o=[];e.sourceName&&o.push(e.sourceName),void 0!==e.chunkIndex&&o.push(`分块 #${e.chunkIndex}`),void 0!==e.score&&o.push(`相关度 ${(100*e.score).toFixed(0)}%`),r.textContent=o.join(" · "),n.appendChild(t),n.appendChild(r),c.appendChild(n)}r.appendChild(o),r.appendChild(c);const l=e.querySelector(".csk-msg__time");l?e.insertBefore(r,l):e.appendChild(r)}function D(e){e.scrollTop=e.scrollHeight}function M(e){const n=new Date(e);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function B(e){return`csk_history_${e}`}function T(e,n){try{let t=n;t.length>200&&(t=t.slice(50),r.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const o={messages:t,updatedAt:Date.now()};localStorage.setItem(B(e),JSON.stringify(o))}catch(e){e instanceof Error&&"QuotaExceededError"===e.name?r.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):r.error("保存会话历史失败",e)}}function z(e){try{localStorage.removeItem(B(e))}catch(e){r.warn("清空会话历史失败",e)}}const q="\0CODEBLOCK_",j="\0INLINECODE_";function H(e){if(!e||"string"!=typeof e)return"";const n=[];let t=e;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(e,t,r)=>{const o=n.length,s=$(r.trimEnd()),i=t?` class="language-${$(t)}"`:"";return n.push(`
${s}`),`${q}${o}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(e,n)=>{const t=r.length;return r.push(`${$(n)}`),`${j}${t}\0`}),t=$(t),t=P(t,q,n),t=P(t,j,r);const o=t.split("\n"),s=[];let i=!1,a="",c=!1,l=[];for(let e=0;e')),s.push(`"),c=!1)}}function P(e,n,t){return e.replace(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(e,n)=>t[parseInt(n)]||"")}let R,U=null,O=[],W=null,K=null,V=null,J=null,X=null,Y=null,G=null,Q=null,Z=!1,ee=!1;function ne(e,n){U=e,W=n.messagesContainer,K=n.inputEl,V=n.sendBtn,J=n.clearBtn,X=n.categorySelect,Y=n.historyPanel,G=n.showLoading,Q=n.hideLoading,R=e.categoryId,ee=!!e.categoryId||!!e.showCategorySwitch,function(){if(!K||!V)return;V.addEventListener("click",()=>oe()),K.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),oe())}),K.addEventListener("input",()=>re()),J&&J.addEventListener("click",()=>function(){if(!U)return;if(!confirm(i("clear_confirm")))return;if(O=[],W){W.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove())}J&&(J.style.display="none");z(U.integrateId);const e=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();c(e),w(U.integrateId,U.userId,e),r.lifecycleClear(U.integrateId),r.info(`新 chatId=${e}`)}())}(),e.showCategorySwitch&&X&&async function(){if(!X)return;try{const e=await async function(){const e=d("/category/tree");try{const n=await p(e);if(!n.ok)throw new m(h(n.status),`http_${n.status}`);const t=await n.json();return t.success&&Array.isArray(t.data)?(r.info(`加载分类树成功 count=${t.data.length}`),t.data):[]}catch(e){return e instanceof m?r.error(`加载分类树失败: ${e.message}`):r.error("加载分类树失败",e),[]}}();if(0===e.length)return;X.innerHTML=``;const n=(e,t=0)=>{for(const r of e){const e=document.createElement("option");e.value=String(r.id),e.textContent=`${" ".repeat(t)}${r.name}`,void 0!==R&&String(r.id)===String(R)&&(e.selected=!0),X.appendChild(e),r.children&&r.children.length>0&&n(r.children,t+1)}};n(e),r.info(`知识库分类加载成功 count=${e.length}`)}catch(e){r.error(i("category_load_error"),e)}}()}async function te(){if(U&&W&&(await x(),await async function(){if(!U||!W)return;const e=l();if(!e)return;try{const n=await b(e);n.messages.length>0&&(O=n.messages.map((e,n)=>({id:C(),role:"USER"===e.messageType?"user":"ai",content:e.content,timestamp:new Date(e.createTime).getTime()})),se(),r.info(`从后端加载 ${O.length} 条历史消息`),T(U.integrateId,O))}catch(e){r.warn("从后端加载历史消息失败",e)}}(),0===O.length)){const e=function(e){try{const n=localStorage.getItem(B(e));if(!n)return[];const t=JSON.parse(n);return t&&Array.isArray(t.messages)?(r.info(`加载历史消息 integrateId=${e} count=${t.messages.length}`),t.messages):[]}catch(e){return r.warn("加载会话历史失败",e),[]}}(U.integrateId);e.length>0&&(O=e,se(),r.info(`从本地缓存恢复 ${e.length} 条消息`))}}function re(){if(!V||!K)return;K.value.trim().length>0&&!Z?V.removeAttribute("disabled"):V.setAttribute("disabled","true")}async function oe(){if(!K||!U||Z)return;const e=K.value.trim();if(""===e)return;K.value="",re(),K.style.height="auto",Z=!0,re(),U.chatId||await x();const n=S();W&&A(W,e,n);const t={id:C(),role:"user",content:e,timestamp:n};O.push(t),J&&O.length>0&&(J.style.display="inline-flex"),W&&D(W),G&&G(),W&&D(W);try{let n;const t=S(),o=ee&&(void 0!==R||void 0!==U.categoryId);n=U.streaming?await async function(e,n,t){return new Promise((r,o)=>{let s=null,a="",c=!1;k(e,e=>{if(a+=e,!c&&W){Q&&Q();const{bubble:e}=function(e,n){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=M(n),t.appendChild(r),t.appendChild(o),e.appendChild(t),{wrapper:t,bubble:r}}(W,n);s=e,c=!0}s&&(s.textContent=a),W&&D(W)},()=>{c||""!==a?(s&&a&&(s.innerHTML=H(a)),r(a)):g(e).then(r).catch(o)},e=>{a.length>0?(s&&(s.innerHTML=H(a+"\n\n"+i("stream_interrupted"))),r(a)):o(e)},R,t)})}(e,t,o):await g(e),Q&&Q(),!U.streaming&&W&&N(W,n,t,H);const s={id:C(),role:"ai",content:n,timestamp:t};O.push(s),T(U.integrateId,O),W&&D(W),o&&async function(e,n){try{const t=await f(e,R);if(t.length>0){const e=t.map(e=>{var n,t;return{documentId:e.documentId||"",title:e.title||"",sourceName:e.sourceName||"",chunkIndex:null!==(n=e.chunkIndex)&&void 0!==n?n:0,score:null!==(t=e.score)&&void 0!==t?t:0,snippet:e.snippet||""}});if(n.sources=e,W){const n=W.querySelector(".csk-msg--ai:last-of-type");n&&L(n,e)}U&&T(U.integrateId,O)}}catch(e){r.warn("获取引用来源失败",e)}}(e,s)}catch(e){Q&&Q();const n=e instanceof m?e.message:i("error_send");if(W){const e=document.createElement("div");e.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${n}`,e.appendChild(t),W.appendChild(e)}r.error(`发送失败 integrateId=${U.integrateId}`,e)}finally{Z=!1,re()}}function se(){if(!W)return;const e=W.querySelector(".csk-history-panel");W.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove());for(const e of O)if("user"===e.role)A(W,e.content,e.timestamp);else{const n=N(W,e.content,e.timestamp,H);e.sources&&e.sources.length>0&&L(n,e.sources)}D(W),J&&O.length>0&&(J.style.display="inline-flex"),e&&!W.contains(e)&&W.appendChild(e)}async function ie(){if(!Y||!U)return;const e=Y.querySelector("#csk-history-list");if(e){e.innerHTML='${d(r[1])}
`);continue}c&&m();const h=n.match(/^[\-\*]\s+(.+)/);if(h){u(),m(),i&&"ul"===a||(p(),i=!0,a="ul",s.push('')),s.push(`
":""),i=!1,a="")}function m(){c&&(s.push("- ${d(h[1])}
`);continue}const g=n.match(/^\d+\.\s+(.+)/);g?(u(),m(),i&&"ol"===a||(p(),i=!0,a="ol",s.push('')),s.push(`
- ${d(g[1])}
`)):""!==n.trim()?/^(\*{3,}|-{3,}|_{3,})$/.test(n.trim())?(u(),p(),m(),s.push('
')):(p(),m(),l.push(d(n))):(u(),p())}return u(),p(),m(),s.join("\n");function d(e){return e=(e=(e=(e=(e=(e=e.replace(/\*\*(.+?)\*\*/g,"$1")).replace(/__(.+?)__/g,"$1")).replace(/\*(.+?)\*/g,"$1")).replace(/(?$1")).replace(/~~(.+?)~~/g,"$1")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,(e,n,t)=>`${n}`)}function u(){l.length>0&&(s.push(`${l.join("
`),l=[])}function p(){i&&(s.push("ul"===a?"
")}