var ChatbotSDK=function(){"use strict";const A="[ChatbotSDK]";let n=!0,e=null;function s(A){e=A||null}const t={},r={info(e,s){n&&console.log(A,e,void 0!==s?s:"")},warn(e,s){n&&console.warn(A,e,void 0!==s?s:"")},error(n,s){if(console.error(A,n,void 0!==s?s:""),e)try{const A=s instanceof Error&&s.type||"error";e({message:n,code:String(A),detail:s})}catch(A){}},time(A){t[A]=Date.now()},timeEnd(e,s){const r=t[e];if(void 0!==r){const c=Date.now()-r;if(delete t[e],n){const n=s?`${s} ${c}ms`:`${e} ${c}ms`;console.log(A,n)}return c}return 0},lifecycleInit(A,n){this.info(`初始化完成 integrateId=${A} requestDomain=${n}`)},lifecycleDestroy(A){this.info(`销毁实例 integrateId=${A}`)},lifecycleSend(A,n){this.info(`发送消息 integrateId=${A} length=${n}`),this.time(`send_${A}`)},lifecycleReply(A,n){const e=this.timeEnd(`send_${A}`,"AI 回复");this.info(`AI 回复 integrateId=${A} length=${n} duration=${e}ms`)},lifecycleError(A,n,e){this.timeEnd(`send_${A}`),this.error(`请求失败 integrateId=${A} status=${n} message=${e}`)},lifecycleClear(A){this.info(`清空会话 integrateId=${A}`)},lifecycleStreamDone(A,n){const e=this.timeEnd(`send_${A}`,"流式回复");this.info(`流式回复完成 integrateId=${A} length=${n} duration=${e}ms`)},lifecycleCategoryChange(A){this.info(`切换知识库分类 categoryId=${A}`)}};const c={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",status_online:"在线",role_selector_label:"服务角色",welcome_title:"你好,我是 AI 智能助手",welcome_desc:"有什么可以帮你的吗?在下方输入框开始提问吧~",placeholder:"输入您的问题...",send:"发送",stop:"停止生成",new_message:"新消息",copy:"复制",copied:"已复制",retry:"重新生成",retrying:"重新生成中...",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:"删除",history_search:"搜索会话...",history_group_today:"今天",history_group_yesterday:"昨天",history_group_week:"本周",history_group_earlier:"更早",feedback_up:"有帮助",feedback_down:"没帮助",teaser_text:"有什么可以帮你的吗?",new_msg_announce:"收到新消息",resize:"拖拽缩放窗口",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",status_online:"Online",role_selector_label:"Service",welcome_title:"Hi, I am your AI assistant",welcome_desc:"How can I help you? Type your question below to get started.",placeholder:"Type your question...",send:"Send",stop:"Stop generating",new_message:"New message",copy:"Copy",copied:"Copied",retry:"Regenerate",retrying:"Regenerating...",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",history_search:"Search conversations...",history_group_today:"Today",history_group_yesterday:"Yesterday",history_group_week:"This Week",history_group_earlier:"Earlier",feedback_up:"Helpful",feedback_down:"Not helpful",teaser_text:"How can I help you?",new_msg_announce:"New message received",resize:"Resize window",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 f="zh-CN";function d(A,n){let e=(c[f]||c["zh-CN"])[A]||c["zh-CN"][A]||A;if(n)for(const[A,s]of Object.entries(n))e=e.replace(`{${A}}`,String(s));return e}let g=null,l=null;function i(A){l=A}function o(){var A;return null!==(A=null!=l?l:null==g?void 0:g.integrateId)&&void 0!==A?A:""}function a(A){g&&(g.chatId=A)}function z(){return(null==g?void 0:g.chatId)||""}function M(A){if(!g)throw new Error("API 配置未初始化");return`${g.requestDomain.replace(/\/+$/,"")}${A.startsWith("/")?A:`/${A}`}`}function v(A,n,e){null!=e&&("string"==typeof e&&""===e.trim()||A.set(n,String(e)))}async function w(A,n={},e=3e4,s){const t=new AbortController,c=setTimeout(()=>t.abort(),e);s&&(s.aborted?t.abort():s.addEventListener("abort",()=>t.abort(),{once:!0}));try{const e={};n.headers&&(n.headers instanceof Headers?n.headers.forEach((A,n)=>{e[n]=A}):Array.isArray(n.headers)?n.headers.forEach(([A,n])=>{e[A]=n}):Object.assign(e,n.headers)),(null==g?void 0:g.token)&&A.includes("/ai/")&&(e.Authorization=`Bearer ${g.token}`);const s=await fetch(A,Object.assign(Object.assign({},n),{headers:e,signal:t.signal,mode:"cors",credentials:"include"}));return 401===s.status&&A.includes("/ai/")&&r.error("SDK 认证失败:Token 缺失或已过期,请重新调用 /open-api/auth/token 换取 Token"),s}catch(A){if(null==s?void 0:s.aborted)throw new k("aborted","aborted");if(A instanceof DOMException&&"AbortError"===A.name)throw new k(d("error_timeout"),"timeout");if(A instanceof TypeError&&A.message.includes("Failed to fetch"))throw new k(d("error_cors"),"cors");throw new k(d("error_network"),"network")}finally{clearTimeout(c)}}class k extends Error{constructor(A,n){super(A),this.name="CskError",this.type=n}}function u(A){switch(A){case 401:return d("error_auth");case 403:return d("error_forbidden");case 404:return d("error_not_found");case 429:return d("error_rate_limit");case 500:return d("error_server");case 502:case 503:return d("error_unavailable");default:return`${d("error_unknown")}(${A})`}}async function Z(A){const n=function(A){const n=new URLSearchParams;return n.set("message",A),n.set("chatId",g.chatId),v(n,"roleId",o()),v(n,"accountId",g.userId),M(`/ai/assistant_app/chat/sync?${n.toString()}`)}(A);r.lifecycleSend(o(),A.length);try{const A=await w(n);if(!A.ok){const n=u(A.status);throw r.lifecycleError(o(),String(A.status),n),new k(n,`http_${A.status}`)}const e=await A.text();return r.lifecycleReply(o(),e.length),e}catch(A){if(A instanceof k)throw A;throw r.lifecycleError(o(),"unknown",String(A)),new k(d("error_unknown"),"unknown")}}async function P(A,n,e,s,t,c,f){var l;const i=c?function(A,n){const e=new URLSearchParams;return e.set("message",A),e.set("chatId",g.chatId),e.set("rewriteStrategy",g.rewriteStrategy||"REWRITE"),v(e,"roleId",o()),v(e,"accountId",g.userId),v(e,"categoryId",null!=n?n:g.categoryId),M(`/ai/assistant_app/chat/rag/sse?${e.toString()}`)}(A,t):function(A,n){const e=new URLSearchParams;return e.set("message",A),e.set("chatId",g.chatId),v(e,"roleId",o()),v(e,"accountId",g.userId),v(e,"categoryId",null!=n?n:g.categoryId),M(`/ai/assistant_app/chat/sse?${e.toString()}`)}(A,t);let a="";r.lifecycleSend(o(),A.length);try{const A=await w(i,{},6e4,f);if(!A.ok){const n=u(A.status);return r.lifecycleError(o(),String(A.status),n),void s(new k(n,`http_${A.status}`))}const t=null===(l=A.body)||void 0===l?void 0:l.getReader();if(!t)return void s(new k(d("error_stream_unsupported"),"stream_unsupported"));const c=new TextDecoder("utf-8",{stream:!0});let g="";try{for(;;){const{done:A,value:e}=await t.read();if(A)break;g+=c.decode(e,{stream:!0});const s=g.split("\n");g=s.pop()||"";for(const A of s){const e=A.trim();if(e&&!e.startsWith(":"))if(e.startsWith("data:")){const A=e.substring(5).trim();A&&(a+=A,n(A))}else{if("[DONE]"===e)break;e.startsWith("event:")||e.startsWith("id:")||e.startsWith("retry:")||(a+=e,n(e))}}}if(g.trim()){const A=g.trim();if(A.startsWith("data:")){const e=A.substring(5).trim();e&&(a+=e,n(e))}else"[DONE]"!==A&&(a+=A,n(A))}}catch(A){if(null==f?void 0:f.aborted)r.info(`流式被用户中断,保留已生成内容 length=${a.length}`);else{if(!(a.length>0))throw A;n("\n\n"+d("stream_unstable"))}}finally{t.releaseLock()}r.lifecycleStreamDone(o(),a.length),e()}catch(A){if((null==f?void 0:f.aborted)||A instanceof k&&"aborted"===A.type)return void e();A instanceof k?s(A):(r.lifecycleError(o(),"unknown",String(A)),s(new k(d("error_network"),"network")))}}async function D(A,n){const e=function(A,n){const e=new URLSearchParams;return e.set("message",A),e.set("chatId",g.chatId),e.set("rewriteStrategy",g.rewriteStrategy||"REWRITE"),v(e,"roleId",o()),v(e,"accountId",g.userId),v(e,"categoryId",null!=n?n:g.categoryId),M(`/ai/assistant_app/rag/sources?${e.toString()}`)}(A,n);try{const A=await w(e);if(!A.ok)throw new k(u(A.status),`http_${A.status}`);const n=await A.json();return n.success&&Array.isArray(n.data)?(r.info(`获取引用来源 count=${n.data.length}`),n.data):[]}catch(A){return r.error("获取引用来源失败",A),[]}}async function B(A=1,n=20,e,s){const t=new URLSearchParams;t.set("page",String(A)),t.set("size",String(n)),e&&t.set("accountId",e),s&&t.set("roleId",s);const c=M(`/ai/sdk/conversation/list?${t.toString()}`);try{const A=await w(c);if(!A.ok)throw new k(u(A.status),`http_${A.status}`);const n=await A.json();return{list:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0,pages:n.pages||0}}catch(A){return r.error("加载会话列表失败",A),{list:[],total:0,pages:0}}}async function y(A){const n=new URLSearchParams;(null==g?void 0:g.userId)&&n.set("accountId",g.userId),o()&&n.set("roleId",o());const e=M(`/ai/sdk/conversation/${A}/messages?${n.toString()}`);try{const A=await w(e);if(!A.ok)throw new k(u(A.status),`http_${A.status}`);const n=await A.json();return{messages:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0}}catch(A){return r.error("加载会话消息失败",A),{messages:[],total:0}}}async function O(A){const n=new URLSearchParams;(null==g?void 0:g.userId)&&n.set("accountId",g.userId),o()&&n.set("roleId",o());const e=M(`/ai/sdk/conversation/${A}?${n.toString()}`);try{const n=await w(e,{method:"DELETE"});if(!n.ok)throw new k(u(n.status),`http_${n.status}`);const s=await n.json();return r.info(`删除会话 id=${A} success=${s.success}`),s.success||!1}catch(A){return r.error("删除会话失败",A),!1}}function x(A){const n=new URLSearchParams;return(null==g?void 0:g.userId)&&n.set("accountId",g.userId),o()&&n.set("roleId",o()),M(`/ai/sdk/conversation/${A}/export?${n.toString()}`)}async function b(A=!1){if(!g)return"";const n=o();if(!A){const A=function(A,n){try{return localStorage.getItem(m(A,n))||""}catch(A){return""}}(n,g.userId);if(A)return g.chatId=A,r.info(`从缓存恢复 chatId=${A}`),A}try{const A=await B(1,5,g.userId,n);if(A.list.length>0){const e=A.list[0],s=e.conversationId||e.chatId||"";if(s)return g.chatId=s,V(n,g.userId,s),r.info(`从后端恢复会话 chatId=${s} messageCount=${e.messageCount}`),s}}catch(A){r.warn("查询后端会话列表失败,将生成新 chatId",A)}const e=function(){const A="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${A}`}();return g.chatId=e,V(n,g.userId,e),r.info(`生成新 chatId=${e}`),e}function m(A,n){return`csk_chatId_${A}${n?"_"+n:""}`}function V(A,n,e){try{e?localStorage.setItem(m(A,n),e):localStorage.removeItem(m(A,n))}catch(A){}}let p=null;function Q(A){const n=J(A.primaryColor,-15),e=J(A.primaryColor,18),s=function(A){const n=A.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);return n?`${parseInt(n[1],16)}, ${parseInt(n[2],16)}, ${parseInt(n[3],16)}`:"79, 70, 229"}(A.primaryColor);return`\n --csk-primary: ${A.primaryColor};\n --csk-primary-hover: ${n};\n --csk-primary-light: ${e};\n --csk-primary-rgb: ${s};\n --csk-bg-user: linear-gradient(135deg, ${A.primaryColor}, ${n});\n --csk-bg-ai: #ffffff;\n --csk-text-user: #ffffff;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${A.width}px;\n --csk-window-height: ${A.height}px;\n --csk-radius: 16px;\n --csk-shadow-window: 0 12px 48px rgba(15, 23, 42, 0.18), 0 2px 8px rgba(15, 23, 42, 0.06);\n --csk-shadow-bubble: 0 1px 2px rgba(15, 23, 42, 0.06);\n --csk-border: #ECEEF2;\n --csk-bg-app: #F6F7F9;\n `}function J(A,n){const e=A.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!e)return A;const s=A=>Math.max(0,Math.min(255,A)),t=s(parseInt(e[1],16)+n),r=s(parseInt(e[2],16)+n),c=s(parseInt(e[3],16)+n);return`#${t.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}`}function C(A){document.querySelector("style[data-csk-sdk]")||(p=document.createElement("style"),p.setAttribute("data-csk-sdk",""),p.textContent=function(A){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${Q(A)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n font-size: 14px;\n line-height: 1.55;\n color: #1F2937;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-sizing: border-box;\n}\n.csk-root *, .csk-root *::before, .csk-root *::after { box-sizing: border-box; }\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 24px;\n z-index: 9998;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n /* 白色背景,简洁克制 */\n background: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #fff;\n user-select: none;\n overflow: hidden;\n /* 浅灰边框 */\n border: 2px solid #E5E7EB;\n /* 简洁柔和阴影 */\n box-shadow:\n 0 2px 8px rgba(0, 0, 0, 0.08),\n 0 4px 16px rgba(0, 0, 0, 0.06);\n transition:\n transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),\n box-shadow 0.25s ease,\n border-color 0.25s ease;\n animation:\n csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n.csk-launcher--right { right: 24px; }\n.csk-launcher--left { left: 24px; }\n\n.csk-launcher:hover {\n transform: translateY(-3px) scale(1.08);\n border-color: #D1D5DB;\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, 0.10),\n 0 8px 24px rgba(0, 0, 0, 0.08);\n}\n.csk-launcher:active { transform: scale(0.93); }\n.csk-launcher svg {\n width: 30px;\n height: 30px;\n position: relative;\n z-index: 1;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15));\n}\n.csk-launcher img {\n width: 36px;\n height: 36px;\n object-fit: contain;\n position: relative;\n z-index: 1;\n -webkit-user-drag: none;\n user-select: none;\n}\n\n@keyframes csk-launcher-in {\n 0% { opacity: 0; transform: scale(0.5) translateY(16px); }\n 60% { transform: scale(1.06) translateY(-2px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 24px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: var(--csk-window-height);\n max-height: calc(100vh - 48px);\n background: #fff;\n border-radius: var(--csk-radius);\n box-shadow: var(--csk-shadow-window);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform-origin: bottom right;\n transition: opacity 0.24s ease, transform 0.24s cubic-bezier(0.34, 1.2, 0.64, 1), visibility 0.24s;\n opacity: 1;\n transform: translateY(0) scale(1);\n visibility: visible;\n pointer-events: auto;\n}\n.csk-window--right { right: 24px; transform-origin: bottom right; }\n.csk-window--left { left: 24px; transform-origin: bottom left; }\n.csk-window--hidden {\n opacity: 0;\n transform: translateY(12px) scale(0.96);\n visibility: hidden;\n pointer-events: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n min-height: 60px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: move;\n user-select: none;\n position: relative;\n flex-shrink: 0;\n}\n.csk-header::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: 0;\n height: 24px;\n background: linear-gradient(to bottom, rgba(0,0,0,0.04), transparent);\n pointer-events: none;\n}\n.csk-header__left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.csk-header__avatar {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.22);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25);\n}\n.csk-header__avatar svg { width: 22px; height: 22px; }\n.csk-header__info {\n display: flex;\n flex-direction: column;\n min-width: 0;\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 letter-spacing: 0.2px;\n}\n.csk-header__status {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n opacity: 0.9;\n margin-top: 2px;\n}\n.csk-status-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #6EE7B7;\n box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7);\n animation: csk-status-pulse 2s infinite;\n}\n@keyframes csk-status-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7); }\n 70% { box-shadow: 0 0 0 6px rgba(110, 231, 183, 0); }\n 100% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0); }\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n}\n.csk-header__btn,\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: 8px;\n transition: background 0.15s, transform 0.15s;\n}\n.csk-header__btn:hover,\n.csk-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-header__btn:active,\n.csk-history-btn:active { transform: scale(0.92); }\n\n/* ========== 角色选择器 ========== */\n.csk-role-select-wrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n margin: 0 4px;\n}\n.csk-role-select {\n appearance: none;\n -webkit-appearance: none;\n padding: 4px 24px 4px 10px;\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.15) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='white' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 6px center;\n color: #fff;\n font-size: 12px;\n font-family: inherit;\n cursor: pointer;\n outline: none;\n transition: background 0.15s, border-color 0.15s;\n max-width: 120px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-role-select:hover {\n background-color: rgba(255, 255, 255, 0.25);\n border-color: rgba(255, 255, 255, 0.55);\n}\n.csk-role-select:focus {\n border-color: rgba(255, 255, 255, 0.7);\n box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);\n}\n.csk-role-select option {\n color: #1F2937;\n background: #fff;\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 20px 16px 12px;\n background: var(--csk-bg-app);\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar { width: 6px; }\n.csk-messages::-webkit-scrollbar-track { background: transparent; }\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D8DCE3;\n border-radius: 3px;\n}\n.csk-messages::-webkit-scrollbar-thumb:hover { background: #C2C7D0; }\n\n/* 欢迎空状态 */\n.csk-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px 32px;\n color: #6B7280;\n animation: csk-fade-in 0.3s ease;\n}\n.csk-welcome__avatar {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--csk-bg-user);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 14px;\n box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-welcome__avatar svg { width: 30px; height: 30px; }\n.csk-welcome__title {\n font-size: 15px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.csk-welcome__desc {\n font-size: 13px;\n color: #9CA3AF;\n line-height: 1.6;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n margin-bottom: 18px;\n max-width: 100%;\n word-break: break-word;\n animation: csk-msg-in 0.28s cubic-bezier(0.22, 1, 0.36, 1);\n}\n.csk-msg--user {\n flex-direction: row-reverse;\n align-items: flex-end;\n}\n.csk-msg--ai {\n flex-direction: row;\n align-items: flex-start;\n}\n.csk-msg__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg__avatar svg { width: 18px; height: 18px; }\n.csk-msg__avatar--ai {\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n}\n.csk-msg__avatar--user {\n background: var(--csk-bg-user);\n color: #fff;\n}\n.csk-msg__content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n max-width: calc(100% - 46px);\n}\n.csk-msg--user .csk-msg__content { align-items: flex-end; }\n.csk-msg--ai .csk-msg__content { align-items: flex-start; }\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 16px;\n font-size: 14px;\n line-height: 1.6;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 16px 16px 4px 16px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 16px 16px 16px 4px;\n border: 1px solid var(--csk-border);\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 5px;\n padding: 0 4px;\n}\n\n@keyframes csk-msg-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes csk-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n margin-bottom: 18px;\n animation: csk-msg-in 0.28s ease;\n}\n.csk-loading__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-loading__avatar svg { width: 18px; height: 18px; }\n.csk-loading__bubble {\n background: #fff;\n border: 1px solid var(--csk-border);\n border-radius: 16px 16px 16px 4px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.csk-loading__dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #B4B9C2;\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); opacity: 0.6; }\n 40% { transform: scale(1); opacity: 1; }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n padding: 10px 12px 14px;\n background: #fff;\n border-top: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-input-wrap {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n background: var(--csk-bg-app);\n border: 1px solid var(--csk-border);\n border-radius: 14px;\n padding: 6px 6px 6px 14px;\n transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;\n}\n.csk-input-wrap--focus {\n border-color: var(--csk-primary);\n background: #fff;\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n.csk-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 8px 0;\n font-size: 14px;\n outline: none;\n font-family: inherit;\n resize: none;\n min-height: 22px;\n max-height: 120px;\n line-height: 1.5;\n color: #1F2937;\n}\n.csk-input::placeholder { color: #9CA3AF; }\n.csk-root .csk-input:focus-visible { outline: none; }\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n min-width: 36px;\n border: none;\n border-radius: 10px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: pointer;\n transition: transform 0.18s, box-shadow 0.18s, opacity 0.18s;\n box-shadow: 0 3px 10px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-send-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 5px 14px rgba(var(--csk-primary-rgb), 0.4);\n}\n.csk-send-btn:active:not(:disabled) { transform: scale(0.92); }\n.csk-send-btn:disabled {\n background: #D1D5DB;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 0.7;\n}\n.csk-send-btn svg { width: 18px; height: 18px; }\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 999px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-clear-btn:hover {\n background: #FEF2F2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n border-top: 1px solid var(--csk-border);\n background: #FBFBFC;\n gap: 8px;\n flex-shrink: 0;\n}\n.csk-category-bar__label {\n font-size: 13px;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 6px 28px 6px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n color: #374151;\n background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239CA3AF' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") no-repeat right 9px center;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s, box-shadow 0.2s;\n max-width: 220px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid var(--csk-border);\n border-radius: 12px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n background: #FAFBFC;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F3F4F7;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover { background: #ECEEF2; }\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 5px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n font-size: 10px;\n}\n.csk-sources--collapsed .csk-sources__arrow { transform: rotate(-90deg); }\n.csk-sources__body {\n border-top: 1px solid var(--csk-border);\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body { display: none; }\n.csk-source-item {\n padding: 9px 12px;\n border-bottom: 1px solid #F0F1F4;\n transition: background 0.15s;\n}\n.csk-source-item:last-child { border-bottom: none; }\n.csk-source-item:hover { background: #fff; }\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 3px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.5;\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: 4px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p { margin: 0 0 8px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { margin-bottom: 0; }\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: 14px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\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 position: relative;\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 10px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.55;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', 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: rgba(var(--csk-primary-rgb), 0.1);\n color: var(--csk-primary);\n padding: 1px 6px;\n border-radius: 5px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', 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: 22px;\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 { margin-bottom: 4px; }\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding: 2px 12px;\n margin: 8px 0;\n color: #6B7280;\n background: rgba(var(--csk-primary-rgb), 0.05);\n border-radius: 0 6px 6px 0;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n border-bottom: 1px solid rgba(var(--csk-primary-rgb), 0.3);\n transition: border-color 0.15s;\n}\n.csk-md-link:hover { border-bottom-color: var(--csk-primary); }\n.csk-md-hr {\n border: none;\n border-top: 1px solid var(--csk-border);\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-panel {\n position: absolute;\n top: 0;\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 animation: csk-slide-in 0.24s ease;\n}\n.csk-history-panel--hidden { display: none; }\n@keyframes csk-slide-in {\n from { transform: translateX(100%); opacity: 0.4; }\n to { transform: translateX(0); opacity: 1; }\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--csk-border);\n background: var(--csk-bg-app);\n flex-shrink: 0;\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: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-history-panel__back:hover { background: #F3F4F6; }\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 10px;\n}\n.csk-history-panel__list::-webkit-scrollbar { width: 5px; }\n.csk-history-panel__list::-webkit-scrollbar-thumb { background: #E5E7EB; border-radius: 2px; }\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 11px 12px;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 5px;\n border: 1px solid transparent;\n}\n.csk-history-item:hover { background: #F3F4F6; }\n.csk-history-item--active {\n background: rgba(var(--csk-primary-rgb), 0.08);\n border-color: rgba(var(--csk-primary-rgb), 0.2);\n}\n.csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.12); }\n.csk-history-item__info { flex: 1; min-width: 0; }\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: 3px;\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 { opacity: 1; }\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: 7px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export { background: #EFF6FF; color: #2563EB; }\n.csk-history-action--export:hover { background: #DBEAFE; }\n.csk-history-action--delete { background: #FEF2F2; color: #DC2626; }\n.csk-history-action--delete:hover { background: #FEE2E2; }\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 34px;\n margin-bottom: 10px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #9CA3AF;\n font-size: 13px;\n}\n\n/* ========== 快捷问题芯片 ========== */\n.csk-quick-replies {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: center;\n margin-top: 18px;\n max-width: 320px;\n}\n.csk-quick-reply {\n border: 1px solid var(--csk-border);\n background: #fff;\n color: #374151;\n font-size: 12.5px;\n padding: 7px 13px;\n border-radius: 999px;\n cursor: pointer;\n font-family: inherit;\n line-height: 1.3;\n transition: all 0.18s ease;\n max-width: 100%;\n}\n.csk-quick-reply:hover {\n border-color: var(--csk-primary);\n color: var(--csk-primary);\n background: rgba(var(--csk-primary-rgb), 0.06);\n transform: translateY(-1px);\n}\n.csk-quick-reply:active { transform: scale(0.96); }\n\n/* ========== AI 消息操作条 ========== */\n.csk-msg__actions {\n display: flex;\n gap: 2px;\n margin-top: 5px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.csk-msg--ai:hover .csk-msg__actions { opacity: 1; }\n.csk-msg--streaming .csk-msg__actions { display: none; }\n.csk-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n.csk-action-btn:hover {\n background: #F3F4F6;\n color: #374151;\n}\n.csk-action-btn--done { color: #10B981; }\n.csk-action-btn:active { transform: scale(0.9); }\n\n/* ========== 流式打字光标 ========== */\n.csk-caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-left: 2px;\n vertical-align: text-bottom;\n background: var(--csk-primary);\n border-radius: 1px;\n animation: csk-caret-blink 1s step-end infinite;\n}\n@keyframes csk-caret-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n}\n\n/* ========== 代码块复制按钮 ========== */\n.csk-md-code-copy {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(255, 255, 255, 0.12);\n color: #CBD5E1;\n border-radius: 6px;\n cursor: pointer;\n opacity: 0;\n transition: all 0.15s ease;\n}\n.csk-md-code-block:hover .csk-md-code-copy { opacity: 1; }\n.csk-md-code-copy:hover { background: rgba(255, 255, 255, 0.22); color: #fff; }\n.csk-md-code-copy:active { transform: scale(0.9); }\n\n/* ========== 新消息提示按钮 ========== */\n.csk-newmsg {\n position: absolute;\n bottom: 82px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 5;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 7px 14px;\n border: none;\n background: var(--csk-primary);\n color: #fff;\n font-size: 12px;\n font-family: inherit;\n border-radius: 999px;\n cursor: pointer;\n box-shadow: 0 4px 14px rgba(var(--csk-primary-rgb), 0.38);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n animation: csk-msg-in 0.25s ease;\n white-space: nowrap;\n}\n.csk-newmsg:hover { transform: translateX(-50%) translateY(-1px); box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.48); }\n.csk-newmsg:active { transform: translateX(-50%) scale(0.95); }\n.csk-newmsg--hidden { display: none; }\n\n/* ========== 发送按钮停止态 ========== */\n.csk-send-btn--stop {\n background: #EF4444 !important;\n box-shadow: 0 3px 10px rgba(239, 68, 68, 0.35) !important;\n}\n.csk-send-btn--stop:hover:not(:disabled) {\n box-shadow: 0 5px 14px rgba(239, 68, 68, 0.45) !important;\n}\n\n/* ========== 窗口缩放拖拽手柄 ========== */\n.csk-resize-handle {\n position: absolute;\n right: 4px;\n bottom: 4px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n cursor: nwse-resize;\n z-index: 5;\n user-select: none;\n -webkit-user-select: none;\n /* 圆形半透明背景,与整体圆润风格一致 */\n border-radius: 50%;\n background: transparent;\n transition: background 0.2s ease;\n}\n.csk-resize-handle:hover {\n background: rgba(var(--csk-primary-rgb), 0.08);\n}\n\n/* 三斜线抓手 — 纯 CSS 绘制,用两条间距微调的线,视觉上是三条 */\n.csk-resize-grip {\n display: block;\n width: 10px;\n height: 10px;\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n #C8CCD2 38%, #C8CCD2 42%,\n transparent 42%, transparent 54%,\n #C8CCD2 54%, #C8CCD2 58%,\n transparent 58%, transparent 70%,\n #C8CCD2 70%, #C8CCD2 74%,\n transparent 74%\n );\n transition: background 0.2s ease;\n border-radius: 2px;\n}\n/* hover 时线条变为主色 */\n.csk-resize-handle:hover .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n var(--csk-primary) 38%, var(--csk-primary) 42%,\n transparent 42%, transparent 54%,\n var(--csk-primary) 54%, var(--csk-primary) 58%,\n transparent 58%, transparent 70%,\n var(--csk-primary) 70%, var(--csk-primary) 74%,\n transparent 74%\n );\n}\n\n/* 暗色模式 */\n.csk-dark .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n #5B6070 38%, #5B6070 42%,\n transparent 42%, transparent 54%,\n #5B6070 54%, #5B6070 58%,\n transparent 58%, transparent 70%,\n #5B6070 70%, #5B6070 74%,\n transparent 74%\n );\n}\n.csk-dark .csk-resize-handle:hover .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n var(--csk-primary-light) 38%, var(--csk-primary-light) 42%,\n transparent 42%, transparent 54%,\n var(--csk-primary-light) 54%, var(--csk-primary-light) 58%,\n transparent 58%, transparent 70%,\n var(--csk-primary-light) 70%, var(--csk-primary-light) 74%,\n transparent 74%\n );\n}\n\n/* 缩放拖拽中:禁用过渡动画 + 全局光标 */\n.csk-window--resizing {\n transition: none !important;\n user-select: none;\n}\n.csk-window--resizing * { cursor: nwse-resize !important; }\n\n/* ========== 暗色模式 ========== */\n.csk-root.csk-dark {\n --csk-bg-ai: #1E1E2E;\n --csk-text-ai: #E2E8F0;\n --csk-border: #3B3B52;\n --csk-bg-app: #141421;\n color: #E2E8F0;\n}\n.csk-dark .csk-window {\n background: #1A1A2E;\n box-shadow: 0 12px 48px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.csk-dark .csk-header::after { background: linear-gradient(to bottom, rgba(0,0,0,0.12), transparent); }\n.csk-dark .csk-msg__avatar--ai {\n background: var(--csk-bg-ai);\n color: var(--csk-primary);\n border-color: var(--csk-border);\n}\n.csk-dark .csk-input-area { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-input-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-input-wrap--focus { background: #1A1A2E; border-color: var(--csk-primary); }\n.csk-dark .csk-input { color: #E2E8F0; }\n.csk-dark .csk-loading__avatar { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__bubble { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__dot { background: #6B7280; }\n.csk-dark .csk-category-bar { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-category-select { background-color: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-sources { background: #1E1E2E; border-color: var(--csk-border); }\n.csk-dark .csk-sources__header { background: #25253A; }\n.csk-dark .csk-sources__header:hover { background: #2D2D48; }\n.csk-dark .csk-source-item:hover { background: var(--csk-bg-ai); }\n.csk-dark .csk-source-item__name { color: #E2E8F0; }\n.csk-dark .csk-source-item__meta { color: #6B7280; }\n.csk-dark .csk-history-panel { background: #1A1A2E; }\n.csk-dark .csk-history-panel__header { background: var(--csk-bg-app); border-bottom-color: var(--csk-border); }\n.csk-dark .csk-history-panel__back { background: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-history-panel__back:hover { background: #2D2D48; }\n.csk-dark .csk-history-item:hover { background: #25253A; }\n.csk-dark .csk-history-item__id { color: #E2E8F0; }\n.csk-dark .csk-history-item__meta { color: #6B7280; }\n.csk-dark .csk-history-item--active { background: rgba(var(--csk-primary-rgb), 0.15); }\n.csk-dark .csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.22); }\n.csk-dark .csk-action-btn:hover { background: #2D2D48; color: #E2E8F0; }\n.csk-dark .csk-clear-btn { background: var(--csk-bg-app); border-color: var(--csk-border); color: #9CA3AF; }\n.csk-dark .csk-clear-btn:hover { background: #3B1A1A; border-color: #7F1D1D; color: #FCA5A5; }\n.csk-dark .csk-md-code-block { background: #0F0F1A; }\n.csk-dark .csk-md-blockquote { background: rgba(var(--csk-primary-rgb), 0.08); }\n.csk-dark .csk-md-link { color: var(--csk-primary-light); }\n.csk-dark .csk-msg--ai .csk-msg__bubble { background: var(--csk-bg-ai); color: var(--csk-text-ai); border-color: var(--csk-border); }\n.csk-dark .csk-welcome__title { color: #E2E8F0; }\n.csk-dark .csk-welcome__desc { color: #6B7280; }\n.csk-dark .csk-quick-reply { background: var(--csk-bg-app); border-color: var(--csk-border); color: #CBD5E1; }\n.csk-dark .csk-quick-reply:hover { background: rgba(var(--csk-primary-rgb), 0.12); border-color: var(--csk-primary); color: var(--csk-primary-light); }\n.csk-dark .csk-teaser { background: #2D2D48; color: #E2E8F0; box-shadow: 0 4px 20px rgba(0,0,0,0.35); }\n.csk-dark .csk-teaser::after { border-top-color: #2D2D48; }\n.csk-dark .csk-teaser__close { color: #6B7280; }\n.csk-dark .csk-teaser__close:hover { color: #9CA3AF; }\n.csk-dark .csk-feedback-btn { background: rgba(var(--csk-primary-rgb), 0.1); color: #9CA3AF; }\n.csk-dark .csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.2); color: var(--csk-primary-light); }\n.csk-dark .csk-feedback-btn--active { background: rgba(var(--csk-primary-rgb), 0.28); color: var(--csk-primary-light); }\n.csk-dark .csk-history-panel__search-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-history-panel__search-wrap:focus-within { border-color: var(--csk-primary); }\n.csk-dark .csk-history-panel__search { color: #E2E8F0; }\n.csk-dark .csk-launcher__badge { box-shadow: 0 0 0 2px #1A1A2E; }\n.csk-dark .csk-welcome__avatar { box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.25); }\n.csk-dark .csk-header__avatar { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.1); }\n.csk-dark .csk-role-select option {\n background: #1A1A2E;\n color: #E2E8F0;\n}\n\n/* Launcher 拖拽态:微放大 + 阴影加深 */\n.csk-launcher--dragging {\n cursor: grabbing !important;\n transform: scale(1.1) !important;\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, 0.14),\n 0 12px 32px rgba(0, 0, 0, 0.18),\n 0 14px 40px rgba(236, 72, 153, 0.36),\n 0 0 56px rgba(236, 72, 153, 0.18) !important;\n}\n/* 拖拽中隐藏未读徽章 */\n.csk-launcher--dragging .csk-launcher__badge { display: none !important; }\n/* 吸附过渡动画(释放时的缓动) */\n.csk-launcher--snap {\n transition: left 0.3s ease-out, right 0.3s ease-out, bottom 0.3s ease-out !important;\n}\n\n/* ========== Launcher 未读徽章 ========== */\n.csk-launcher__badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #EF4444;\n border: 2px solid #fff;\n box-shadow: 0 0 0 2px #fff;\n animation: csk-badge-in 0.28s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n}\n.csk-launcher__badge--hidden { display: none; }\n@keyframes csk-badge-in {\n from { transform: scale(0); }\n to { transform: scale(1); }\n}\n\n/* ========== Launcher 提示气泡 ========== */\n.csk-teaser {\n position: fixed;\n bottom: 90px;\n z-index: 9997;\n max-width: 240px;\n padding: 10px 14px;\n background: #fff;\n color: #1F2937;\n font-size: 13px;\n line-height: 1.5;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(15, 23, 42, 0.15);\n animation: csk-teaser-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);\n cursor: pointer;\n user-select: none;\n}\n.csk-teaser--right { right: 24px; }\n.csk-teaser--left { left: 24px; }\n.csk-teaser::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: 28px;\n width: 12px;\n height: 12px;\n background: inherit;\n border-radius: 2px;\n transform: rotate(45deg);\n box-shadow: 2px 2px 4px rgba(15, 23, 42, 0.08);\n}\n.csk-teaser--left::after { right: auto; left: 28px; }\n.csk-teaser__close {\n position: absolute;\n top: 4px;\n right: 6px;\n background: none;\n border: none;\n font-size: 16px;\n color: #9CA3AF;\n cursor: pointer;\n padding: 2px 4px;\n line-height: 1;\n border-radius: 4px;\n}\n.csk-teaser__close:hover { color: #374151; }\n.csk-teaser--hidden { display: none; }\n@keyframes csk-teaser-in {\n from { opacity: 0; transform: translateY(8px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n/* ========== 消息反馈按钮(👍 / 👎) ========== */\n.csk-feedback-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(var(--csk-primary-rgb), 0.08);\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n}\n.csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.18); color: var(--csk-primary); }\n.csk-feedback-btn--active {\n background: rgba(var(--csk-primary-rgb), 0.28);\n color: var(--csk-primary);\n}\n.csk-feedback-btn--active.down { background: #FEF2F2; color: #EF4444; }\n.csk-feedback-btn:active { transform: scale(0.9); }\n.csk-msg--streaming .csk-feedback-btn { display: none; }\n\n/* ========== 历史会话搜索框 ========== */\n.csk-history-panel__search-wrap {\n padding: 8px 10px;\n border-bottom: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-history-panel__search-wrap:focus-within {\n border-bottom-color: var(--csk-primary);\n}\n.csk-history-panel__search {\n width: 100%;\n padding: 7px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n font-family: inherit;\n color: #1F2937;\n background: var(--csk-bg-app);\n outline: none;\n transition: border-color 0.2s;\n}\n.csk-history-panel__search:focus { border-color: var(--csk-primary); }\n.csk-history-panel__search::placeholder { color: #9CA3AF; }\n\n/* ========== a11y 焦点指示 ========== */\n.csk-root :focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n}\n.csk-root button:focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n border-radius: inherit;\n}\n/* 弹窗打开时隐藏 launcher 上的焦点环 */\n.csk-launcher:focus-visible {\n outline: none;\n border-color: rgba(255, 255, 255, 0.75);\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.06),\n 0 4px 16px rgba(0, 0, 0, 0.10),\n 0 6px 24px rgba(var(--csk-primary-rgb), 0.28),\n 0 0 48px rgba(var(--csk-primary-rgb), 0.12),\n 0 0 0 4px rgba(var(--csk-primary-rgb), 0.3);\n}\n\n/* ========== a11y aria-live 播报区(视觉隐藏) ========== */\n.csk-sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0,0,0,0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* ========== 会话分组标题 ========== */\n.csk-history-group {\n margin-bottom: 4px;\n}\n.csk-history-group__label {\n font-size: 11px;\n font-weight: 600;\n color: #9CA3AF;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 8px 12px 4px;\n user-select: none;\n}\n.csk-dark .csk-history-group__label { color: #6B7280; }\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n max-height: 100vh;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-resize-handle { display: none !important; }\n .csk-window--hidden { transform: translateY(100%); }\n /* 移动端默认位置,仅在未被 JS 拖拽覆盖时生效 */\n .csk-launcher:not([style*="bottom"]) { bottom: 20px; }\n .csk-launcher--right:not([style*="bottom"]) { right: 20px; }\n .csk-launcher--left:not([style*="bottom"]) { left: 20px; }\n}\n`}(A),document.head.appendChild(p))}function Y(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,A=>{const n=16*Math.random()|0;return("x"===A?n:3&n|8).toString(16)})}function E(A){const n={"&":"&","<":"<",">":">",'"':""","'":"'"};return A.replace(/[&<>"']/g,A=>n[A]||A)}function G(A){const n=new Date(A);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function j(){return Date.now()}const I='';function S(A,n){const e=document.createElement("div");e.id="csk-launcher",e.className="csk-launcher csk-launcher--"+("left-bottom"===A.position?"left":"right"),e.setAttribute("title",A.title),e.setAttribute("aria-label",A.title),e.setAttribute("role","button"),e.setAttribute("tabindex","0"),e.innerHTML=A.launcherIcon;const s=document.createElement("div");s.className="csk-launcher__badge csk-launcher__badge--hidden",e.appendChild(s);const t=function(A,n){let e=null;return function(...s){null!==e&&clearTimeout(e),e=setTimeout(()=>{A.apply(this,s),e=null},n)}}(n,300);return e.addEventListener("click",t),e.addEventListener("keydown",A=>{"Enter"!==A.key&&" "!==A.key||(A.preventDefault(),t())}),e}function X(){return window.innerHeight-76}function H(A,n,e){const s=document.createElement("div");s.className="csk-msg csk-msg--user";const t=document.createElement("div");t.className="csk-msg__avatar csk-msg__avatar--user",t.innerHTML='';const r=document.createElement("div");r.className="csk-msg__content";const c=document.createElement("div");c.className="csk-msg__bubble",c.textContent=n;const f=document.createElement("div");return f.className="csk-msg__time",f.textContent=G(e),r.appendChild(c),r.appendChild(f),s.appendChild(t),s.appendChild(r),A.appendChild(s),s}function q(A,n,e,s,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai",t&&(r.dataset.cskMsgId=t);const c=document.createElement("div");c.className="csk-msg__avatar csk-msg__avatar--ai",c.innerHTML=I;const f=document.createElement("div");f.className="csk-msg__content";const d=document.createElement("div");d.className="csk-msg__bubble",s?d.innerHTML=s(n):d.textContent=n;const g=document.createElement("div");return g.className="csk-msg__time",g.textContent=G(e),f.appendChild(d),f.appendChild(N(d,r)),f.appendChild(g),r.appendChild(c),r.appendChild(f),A.appendChild(r),W(d),r}const h='',T='';function N(A,n){const e=document.createElement("div");e.className="csk-msg__actions";const s=document.createElement("button");s.type="button",s.className="csk-action-btn",s.setAttribute("title",d("copy")),s.setAttribute("aria-label",d("copy")),s.innerHTML=h,s.addEventListener("click",async n=>{n.stopPropagation();const e=A.textContent||"";await L(e,s)});const t=document.createElement("button");t.type="button",t.className="csk-action-btn",t.setAttribute("title",d("retry")),t.setAttribute("aria-label",d("retry")),t.innerHTML=T,t.addEventListener("click",A=>{A.stopPropagation();const e=n.closest(".csk-window");e&&e.dispatchEvent(new CustomEvent("csk:retry",{detail:{msgId:n.dataset.cskMsgId||""}}))});const r=document.createElement("button");r.type="button",r.className="csk-feedback-btn",r.setAttribute("title",d("feedback_up")),r.setAttribute("aria-label",d("feedback_up")),r.innerHTML='',r.addEventListener("click",A=>{A.stopPropagation();const e=n.closest(".csk-window");e&&e.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"up"}}))});const c=document.createElement("button");return c.type="button",c.className="csk-feedback-btn",c.setAttribute("title",d("feedback_down")),c.setAttribute("aria-label",d("feedback_down")),c.innerHTML='',c.addEventListener("click",A=>{A.stopPropagation();const e=n.closest(".csk-window");e&&e.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"down"}}))}),e.appendChild(s),e.appendChild(t),e.appendChild(r),e.appendChild(c),e}function K(A,n){const e=A.querySelectorAll(".csk-feedback-btn");e.length<2||(e.forEach(A=>A.classList.remove("csk-feedback-btn--active","down")),"up"===n&&e[0]&&e[0].classList.add("csk-feedback-btn--active"),"down"===n&&e[1]&&e[1].classList.add("csk-feedback-btn--active","down"))}async function L(A,n){const e=n.innerHTML;try{if(navigator.clipboard&&window.isSecureContext)await navigator.clipboard.writeText(A);else{const n=document.createElement("textarea");n.value=A,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}n.innerHTML='',n.classList.add("csk-action-btn--done"),setTimeout(()=>{n.innerHTML=e,n.classList.remove("csk-action-btn--done")},1500)}catch(A){}}function W(A){A.querySelectorAll(".csk-md-code-block").forEach(A=>{if(A.querySelector(".csk-md-code-copy"))return;const n=A.querySelector("code"),e=document.createElement("button");e.type="button",e.className="csk-md-code-copy",e.setAttribute("title",d("copy")),e.setAttribute("aria-label",d("copy")),e.innerHTML=h,e.addEventListener("click",async A=>{A.stopPropagation(),await L((null==n?void 0:n.textContent)||"",e)}),A.appendChild(e)})}function U(A,n){A.classList.remove("csk-msg--streaming");const e=n.querySelector(".csk-caret");e&&e.remove(),W(n)}function R(A,n){const e=A.querySelector(".csk-sources");if(e&&e.remove(),!n||0===n.length)return;const s=document.createElement("div");s.className="csk-sources csk-sources--collapsed";const t=document.createElement("div");t.className="csk-sources__header";const r=document.createElement("span");r.className="csk-sources__title",r.textContent=`📚 ${d("source_count",{n:n.length})}`;const c=document.createElement("span");c.className="csk-sources__arrow",c.textContent="▼",t.appendChild(r),t.appendChild(c),t.addEventListener("click",()=>{s.classList.toggle("csk-sources--collapsed")});const f=document.createElement("div");f.className="csk-sources__body";for(const A of n){const n=document.createElement("div");n.className="csk-source-item";const e=document.createElement("div");if(e.className="csk-source-item__name",e.textContent=A.title||A.sourceName||"未知文档",A.snippet){const e=document.createElement("div");e.className="csk-source-item__snippet",e.textContent=A.snippet,n.appendChild(e)}const s=document.createElement("div");s.className="csk-source-item__meta";const t=[];A.sourceName&&t.push(A.sourceName),void 0!==A.chunkIndex&&t.push(`分块 #${A.chunkIndex}`),void 0!==A.score&&t.push(`相关度 ${(100*A.score).toFixed(0)}%`),s.textContent=t.join(" · "),n.appendChild(e),n.appendChild(s),f.appendChild(n)}s.appendChild(t),s.appendChild(f);const g=A.querySelector(".csk-msg__time");g&&g.parentNode?g.parentNode.insertBefore(s,g):A.appendChild(s)}function F(A,n,e,s,t,r,c){if(A.innerHTML="",0===n.length){const n=document.createElement("div");return n.className="csk-history-panel__empty",n.innerHTML=`\n
💬
\n
${d("history_empty")}
\n `,void A.appendChild(n)}const f=function(A){const n=new Date,e=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime(),s=e-864e5,t=e-864e5*(n.getDay()||7)+864e5,r={today:[],yesterday:[],week:[],earlier:[]};for(const n of A){const A=n.lastMessageTime||n.createdAt,c=A?new Date(A).getTime():0;c>=e?r.today.push(n):c>=s?r.yesterday.push(n):c>=t?r.week.push(n):r.earlier.push(n)}const c=[];return r.today.length&&c.push({label:d("history_group_today"),items:r.today}),r.yesterday.length&&c.push({label:d("history_group_yesterday"),items:r.yesterday}),r.week.length&&c.push({label:d("history_group_week"),items:r.week}),r.earlier.length&&c.push({label:d("history_group_earlier"),items:r.earlier}),c}(n);for(const n of f){if(f.length>1){const e=document.createElement("div");e.className="csk-history-group";const s=document.createElement("div");s.className="csk-history-group__label",s.textContent=n.label,e.appendChild(s),A.appendChild(e)}for(const c of n.items){const n=document.createElement("div");n.className="csk-history-item";const f=c.chatId||c.id;r&&f===r&&n.classList.add("csk-history-item--active");const g=document.createElement("div");g.className="csk-history-item__info";const l=document.createElement("div");l.className="csk-history-item__id",c.lastMessagePreview?l.textContent=c.lastMessagePreview.length>60?c.lastMessagePreview.substring(0,60)+"...":c.lastMessagePreview:l.textContent=f;const i=document.createElement("div");i.className="csk-history-item__meta";const o=[];c.roleName&&o.push(c.roleName),void 0!==c.messageCount&&o.push(`${c.messageCount} 条消息`),c.lastMessageTime?o.push(c.lastMessageTime):c.createdAt&&o.push(c.createdAt),i.textContent=o.join(" · "),g.appendChild(l),g.appendChild(i);const a=document.createElement("div");a.className="csk-history-item__actions";const z=document.createElement("button");z.className="csk-history-action csk-history-action--export",z.setAttribute("title",d("history_export")),z.innerHTML='',z.addEventListener("click",A=>{A.stopPropagation(),s(c.id)});const M=document.createElement("button");M.className="csk-history-action csk-history-action--delete",M.setAttribute("title",d("history_delete")),M.innerHTML='',M.addEventListener("click",A=>{A.stopPropagation(),t(c.id)}),a.appendChild(z),a.appendChild(M),n.appendChild(g),n.appendChild(a),n.addEventListener("click",()=>{e(f)}),A.appendChild(n)}}}function _(A){A.scrollTop=A.scrollHeight}function $(A){return`csk_history_${A}`}function AA(A,n){try{let e=n;e.length>200&&(e=e.slice(50),r.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${e.length} 条`));const s={messages:e,updatedAt:Date.now()};localStorage.setItem($(A),JSON.stringify(s))}catch(A){A instanceof Error&&"QuotaExceededError"===A.name?r.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):r.error("保存会话历史失败",A)}}function nA(A){try{localStorage.removeItem($(A))}catch(A){r.warn("清空会话历史失败",A)}}const eA="\0CODEBLOCK_",sA="\0INLINECODE_";function tA(A){if(!A||"string"!=typeof A)return"";const n=[];let e=A;e=e.replace(/```(\w*)\n([\s\S]*?)```/g,(A,e,s)=>{const t=n.length,r=E(s.trimEnd()),c=e?` class="language-${E(e)}"`:"";return n.push(`
${r}
`),`${eA}${t}\0`});const s=[];e=e.replace(/`([^`\n]+)`/g,(A,n)=>{const e=s.length;return s.push(`${E(n)}`),`${sA}${e}\0`}),e=E(e),e=rA(e,eA,n),e=rA(e,sA,s);const t=e.split("\n"),r=[];let c=!1,f="",d=!1,g=[];for(let A=0;A')){i(),o(),a(),r.push(n);continue}const e=n.match(/^(#{1,6})\s+(.+)/);if(e){i(),o(),a();const A=e[1].length;r.push(`${e[2]}`);continue}const s=n.match(/^>\s?(.*)/);if(s){i(),o(),d||(d=!0,r.push('
')),r.push(`

${l(s[1])}

`);continue}d&&a();const z=n.match(/^[\-\*]\s+(.+)/);if(z){i(),a(),c&&"ul"===f||(o(),c=!0,f="ul",r.push('":""),c=!1,f="")}function a(){d&&(r.push("
"),d=!1)}}function rA(A,n,e){return A.replace(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(A,n)=>e[parseInt(n)]||"")}let cA,fA=null,dA=[],gA=null,lA=null,iA=null,oA=null,aA=null,zA=null,MA=null,vA=null,wA=null,kA=null,uA=null,ZA=null,PA=null,DA=null,BA=!1,yA=null,OA=!0,xA=[],bA="",mA=!1;function VA(A,n){fA=A,gA=n.messagesContainer,lA=n.inputEl,iA=n.inputEl.parentElement,oA=n.sendBtn,aA=n.clearBtn,zA=n.categorySelect,MA=n.roleSelect,vA=n.historyPanel,wA=n.welcomeEl,kA=n.newMsgBtn,uA=n.searchInput,ZA=n.ariaLiveEl,PA=n.showLoading,DA=n.hideLoading,cA=A.categoryId,mA=A.enableRag,function(){if(!lA||!oA)return;oA.addEventListener("click",()=>{BA&&yA?yA.abort():SA()}),lA.addEventListener("keydown",A=>{"Enter"!==A.key||A.shiftKey||A.isComposing||(A.preventDefault(),SA())}),lA.addEventListener("input",()=>{IA(),function(){if(!lA)return;lA.style.height="auto",lA.style.height=`${Math.min(lA.scrollHeight,120)}px`}()}),lA.addEventListener("focus",()=>{iA&&iA.classList.add("csk-input-wrap--focus")}),lA.addEventListener("blur",()=>{iA&&iA.classList.remove("csk-input-wrap--focus")}),aA&&aA.addEventListener("click",()=>function(){if(!fA)return;if(!confirm(d("clear_confirm")))return;if(dA=[],gA){gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove())}aA&&(aA.style.display="none");jA(),nA(fA.integrateId);const A=function(){const A="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${A}`}();a(A),V(fA.integrateId,fA.userId,A),r.lifecycleClear(fA.integrateId),r.info(`新 chatId=${A}`)}())}(),function(){if(!gA)return;gA.addEventListener("scroll",()=>{if(!gA)return;const{scrollTop:A,scrollHeight:n,clientHeight:e}=gA;OA=n-A-e<80,OA&&JA()}),kA&&kA.addEventListener("click",()=>{gA&&_(gA),OA=!0,JA()})}(),function(){if(!uA)return;uA.addEventListener("input",()=>{bA=uA.value.trim().toLowerCase(),EA()})}(),A.showCategorySwitch&&zA&&async function(){if(!zA)return;try{const A=await async function(){const A=M("/category/tree");try{const n=await w(A);if(!n.ok)throw new k(u(n.status),`http_${n.status}`);const e=await n.json();return e.success&&Array.isArray(e.data)?(r.info(`加载分类树成功 count=${e.data.length}`),e.data):[]}catch(A){return A instanceof k?r.error(`加载分类树失败: ${A.message}`):r.error("加载分类树失败",A),[]}}();if(0===A.length)return;zA.innerHTML=``;const n=(A,e=0)=>{for(const s of A){const A=document.createElement("option");A.value=String(s.id),A.textContent=`${" ".repeat(e)}${s.name}`,void 0!==cA&&String(s.id)===String(cA)&&(A.selected=!0),zA.appendChild(A),s.children&&s.children.length>0&&n(s.children,e+1)}};n(A),r.info(`知识库分类加载成功 count=${A.length}`)}catch(A){r.error(d("category_load_error"),A)}}()}async function pA(){if(fA&&gA&&(await b(),await QA(),0===dA.length)){const A=function(A){try{const n=localStorage.getItem($(A));if(!n)return[];const e=JSON.parse(n);return e&&Array.isArray(e.messages)?(r.info(`加载历史消息 integrateId=${A} count=${e.messages.length}`),e.messages):[]}catch(A){return r.warn("加载会话历史失败",A),[]}}(fA.integrateId);A.length>0&&(dA=A,HA(),r.info(`从本地缓存恢复 ${A.length} 条消息`))}}async function QA(){if(!fA||!gA)return;const A=z();if(A)try{const n=await y(A);n.messages.length>0&&(dA=n.messages.map((A,n)=>({id:Y(),role:"USER"===A.messageType?"user":"ai",content:A.content,timestamp:new Date(A.createTime).getTime()})),HA(),r.info(`从后端加载 ${dA.length} 条历史消息`),AA(o(),dA))}catch(A){r.warn("从后端加载历史消息失败",A)}}function JA(){kA&&kA.classList.add("csk-newmsg--hidden")}function CA(){gA&&(OA?_(gA):kA&&kA.classList.remove("csk-newmsg--hidden"))}function YA(A){oA&&("stop"===A?(oA.classList.add("csk-send-btn--stop"),oA.removeAttribute("disabled"),oA.setAttribute("title",d("stop")),oA.setAttribute("aria-label",d("stop")),oA.innerHTML=''):(oA.classList.remove("csk-send-btn--stop"),oA.setAttribute("title",d("send")),oA.setAttribute("aria-label",d("send")),oA.innerHTML='',IA()))}function EA(){const A=null==vA?void 0:vA.querySelector("#csk-history-list");if(!A||!fA)return;F(A,bA?xA.filter(A=>(A.lastMessagePreview||A.chatId||A.id||"").toLowerCase().includes(bA)):xA,A=>{qA(A)},A=>{window.open(x(A),"_blank")},async A=>{if(!confirm(d("history_delete_confirm")))return;await O(A)&&(A===z()&&(dA=[],gA&&gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove()),aA&&(aA.style.display="none"),jA()),xA=xA.filter(n=>(n.chatId||n.id)!==A),EA())},z())}function GA(A,n){if(!gA)return;const e=dA.find(n=>n.id===A&&"ai"===n.role);if(!e)return;const s=e.feedback===n?void 0:n;e.feedback=s;const t=gA.querySelector(`[data-csk-msg-id="${A}"]`);if(t&&K(t,s),fA&&AA(fA.integrateId,dA),s){const n="up"===s?"THUMBS_UP":"THUMBS_DOWN";(async function(A,n){if(!g)return!1;const e=M("/feedback");try{const s=await w(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({messageId:String(A),conversationId:g.chatId,feedbackType:n})});return s.ok?(await s.json()).success||!1:(r.error(`反馈提交失败 status=${s.status}`),!1)}catch(A){return r.error("反馈提交异常",A),!1}})(String(A),n).then(n=>{n?r.info(`消息反馈已提交 msgId=${A} value=${s}`):r.warn(`消息反馈提交失败 msgId=${A}(本地状态已更新)`)})}else r.info(`消息反馈已取消 msgId=${A}`)}function jA(){if(!wA)return;const A=dA.length>0||gA&&gA.querySelector(".csk-msg");wA.style.display=A?"none":""}function IA(){if(!oA||!lA)return;lA.value.trim().length>0&&!BA?oA.removeAttribute("disabled"):oA.setAttribute("disabled","true")}async function SA(){if(!lA||!fA||BA)return;const A=lA.value.trim();if(""===A)return;lA.value="",IA(),lA.style.height="auto";const n=j(),e={id:Y(),role:"user",content:A,timestamp:n};gA&&H(gA,A,n),dA.push(e),jA(),aA&&dA.length>0&&(aA.style.display="inline-flex"),gA&&CA(),await XA(A)}async function XA(A){if(!fA||!gA)return;BA=!0,YA("stop"),fA.chatId||await b();const n=j(),e=mA;PA&&PA(),gA&&CA();const s=Y();let t="";try{fA.streaming?t=await async function(A,n,e,s){yA=new AbortController;const t=yA.signal;return new Promise((r,c)=>{let f=null,g=null,l="",i=!1;P(A,A=>{if(l+=A,!i&&gA){DA&&DA();const{wrapper:A,bubble:e}=function(A,n,e){const s=document.createElement("div");s.className="csk-msg csk-msg--ai csk-msg--streaming",e&&(s.dataset.cskMsgId=e);const t=document.createElement("div");t.className="csk-msg__avatar csk-msg__avatar--ai",t.innerHTML=I;const r=document.createElement("div");r.className="csk-msg__content";const c=document.createElement("div");c.className="csk-msg__bubble",c.innerHTML="";const f=document.createElement("div");return f.className="csk-msg__time",f.textContent=G(n),r.appendChild(c),r.appendChild(N(c,s)),r.appendChild(f),s.appendChild(t),s.appendChild(r),A.appendChild(s),{wrapper:s,bubble:c}}(gA,n,s);g=A,f=e,i=!0}f&&(f.textContent=l,function(A){if(A.querySelector(".csk-caret"))return;const n=document.createElement("span");n.className="csk-caret",n.setAttribute("aria-hidden","true"),A.appendChild(n)}(f)),gA&&CA()},()=>{if(g&&f){if(!i&&""===l)return void Z(A).then(r).catch(c);l&&(f.innerHTML=tA(l)),U(g,f)}r(l)},A=>{l.length>0?(f&&(f.innerHTML=tA(l+"\n\n"+d("stream_interrupted")),g&&U(g,f)),r(l)):c(A)},cA,e,t)})}(A,n,e,s):(t=await Z(A),DA&&DA(),gA&&q(gA,t,n,tA,s));const c={id:s,role:"ai",content:t,timestamp:n};dA.push(c),AA(fA.integrateId,dA),gA&&CA(),function(A){if(!ZA)return;const n=A.length>120?A.substring(0,120)+"...":A;ZA.textContent=d("new_msg_announce")+":"+n}(t),gA&&gA.dispatchEvent(new CustomEvent("csk:newMessage",{bubbles:!0,detail:{msg:c}})),e&&async function(A,n){try{const e=await D(A,cA);if(e.length>0){const A=e.map(A=>{var n,e;return{documentId:A.documentId||"",title:A.title||"",sourceName:A.sourceName||"",chunkIndex:null!==(n=A.chunkIndex)&&void 0!==n?n:0,score:null!==(e=A.score)&&void 0!==e?e:0,snippet:A.snippet||""}});if(n.sources=A,gA){const n=gA.querySelector(".csk-msg--ai:last-of-type");n&&R(n,A)}fA&&AA(fA.integrateId,dA)}}catch(A){r.warn("获取引用来源失败",A)}}(A,c)}catch(A){DA&&DA();const n=A instanceof k?A.message:d("error_send");if(gA){const A=document.createElement("div");A.className="csk-msg csk-msg--ai";const e=document.createElement("div");e.className="csk-msg__bubble",e.style.color="#DC2626",e.textContent=`⚠ ${n}`,A.appendChild(e),gA.appendChild(A)}r.error(`发送失败 integrateId=${fA.integrateId}`,A)}finally{BA=!1,yA=null,YA("send"),IA()}}function HA(){if(!gA)return;const A=gA.querySelector(".csk-history-panel");gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove());for(const A of dA)if("user"===A.role)H(gA,A.content,A.timestamp);else{const n=q(gA,A.content,A.timestamp,tA,A.id);A.sources&&A.sources.length>0&&R(n,A.sources),A.feedback&&K(n,A.feedback)}OA=!0,_(gA),aA&&dA.length>0&&(aA.style.display="inline-flex"),jA(),A&&!gA.contains(A)&&gA.appendChild(A)}async function qA(A){if(!fA||!gA)return;const n=xA.find(n=>(n.chatId||n.id)===A);if(n&&void 0!==n.roleId){const A=String(n.roleId),e=o();A&&A!==e&&(r.info(`会话角色不匹配,自动切换角色 ${e} -> ${A}`),i(A),MA&&(MA.value=A))}r.info(`切换到会话 conversationId=${A}`),a(A),V(o(),fA.userId,A),vA&&vA.classList.add("csk-history-panel--hidden"),dA=[];gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove());try{const n=await y(A);n.messages.length>0&&(dA=n.messages.map(A=>({id:Y(),role:"USER"===A.messageType?"user":"ai",content:A.content,timestamp:new Date(A.createTime).getTime()})),HA(),r.info(`加载会话 ${A} 的 ${dA.length} 条消息`),AA(fA.integrateId,dA))}catch(n){r.warn(`加载会话消息失败 conversationId=${A}`,n)}aA&&dA.length>0&&(aA.style.display="inline-flex"),jA()}let hA=null,TA=!1,NA=null,KA=null,LA=null,WA=null,UA=null,RA=null,FA=null,_A=null,$A=null,An=null,nn=null,en=null,sn=null,tn=null,rn=null,cn=null,fn=null,dn=null;function gn(){if(!rn||!NA)return;const A=NA.getBoundingClientRect(),n=tn?"left"===tn.side:"left-bottom"===(null==hA?void 0:hA.position);n?(rn.style.left=`${A.left}px`,rn.style.right="auto"):(rn.style.right=window.innerWidth-A.right+"px",rn.style.left="auto"),rn.style.bottom=window.innerHeight-A.top+8+"px",rn.classList.toggle("csk-teaser--left",!!n),rn.classList.toggle("csk-teaser--right",!n)}function ln(){if(!rn)return;rn.classList.add("csk-teaser--hidden"),rn.removeEventListener("click",on);const A=rn.querySelector(".csk-teaser__close");A&&A.removeEventListener("click",an)}function on(A){A.target.closest(".csk-teaser__close")||(ln(),wn())}function an(A){A.stopPropagation(),ln()}function zn(){rn&&!rn.classList.contains("csk-teaser--hidden")&&gn()}const Mn='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';function vn(A){"Escape"===A.key&&KA&&!KA.classList.contains("csk-window--hidden")&&kn(),function(A){if(!KA||KA.classList.contains("csk-window--hidden"))return;if("Tab"!==A.key)return;const n=Array.from(KA.querySelectorAll(Mn));if(0===n.length)return;const e=n[0],s=n[n.length-1];A.shiftKey?document.activeElement===e&&(A.preventDefault(),s.focus()):document.activeElement===s&&(A.preventDefault(),e.focus())}(A)}function wn(){KA&&(KA.classList.remove("csk-window--hidden"),ln(),fn&&fn.classList.add("csk-launcher__badge--hidden"),setTimeout(()=>{WA&&WA.focus()},80))}function kn(){KA&&KA.classList.add("csk-window--hidden")}function un(){KA&&(KA.classList.contains("csk-window--hidden")?wn():kn())}function Zn(A){return`csk_size_${A}`}function Pn(A){return`csk_position_${A}`}function Dn(A){return`csk_launcher_pos_${A}`}function Bn(A){KA&&(KA.classList.remove("csk-window--right","csk-window--left"),KA.classList.add(`csk-window--${A}`),rn&&(rn.classList.remove("csk-teaser--right","csk-teaser--left"),rn.classList.add(`csk-teaser--${A}`)))}const yn={init:function(A){if(TA)return void r.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const e=function(A){var n,e,s,t,c,f,d,g,l,i,o,a;if(!A.integrateId||"string"!=typeof A.integrateId&&"number"!=typeof A.integrateId||"string"==typeof A.integrateId&&""===A.integrateId.trim())return r.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;if(!A.requestDomain||"string"!=typeof A.requestDomain||""===A.requestDomain.trim())return r.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;try{new URL(A.requestDomain)}catch(n){return r.error(`requestDomain 不是合法的 URL 格式:${A.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const z=String(A.integrateId).trim(),M=A.launcherIcon||'',v=A.primaryColor||"#4F46E5",w={integrateId:z,requestDomain:A.requestDomain.replace(/\/+$/,""),userId:A.userId,categoryId:A.categoryId,showCategorySwitch:null!==(n=A.showCategorySwitch)&&void 0!==n&&n,title:A.title||"AI 智能助手",width:null!==(e=A.width)&&void 0!==e?e:380,height:Math.max(300,null!==(s=A.height)&&void 0!==s?s:520),position:"left-bottom"===A.position?"left-bottom":"right-bottom",primaryColor:v,launcherIcon:M,showClear:null===(t=A.showClear)||void 0===t||t,showAdminPanel:null!==(c=A.showAdminPanel)&&void 0!==c&&c,quickReplies:Array.isArray(A.quickReplies)?A.quickReplies.map(A=>String(A).trim()).filter(Boolean):[],theme:"dark"===A.theme?"dark":"light",showTeaser:null===(f=A.showTeaser)||void 0===f||f,teaserText:"string"==typeof A.teaserText&&A.teaserText.trim()||"",resizable:null===(d=A.resizable)||void 0===d||d,streaming:null===(g=A.streaming)||void 0===g||g,enableRag:null===(l=A.enableRag)||void 0===l||l,rewriteStrategy:A.rewriteStrategy||"REWRITE",locale:A.locale||"zh-CN",debug:null===(i=A.debug)||void 0===i||i,sound:null!==(o=A.sound)&&void 0!==o&&o,notification:null!==(a=A.notification)&&void 0!==a&&a,onError:"function"==typeof A.onError?A.onError:void 0,onReady:"function"==typeof A.onReady?A.onReady:void 0,onMessage:"function"==typeof A.onMessage?A.onMessage:void 0,token:A.token,roles:A.roles,chatId:""};return r.info(`配置解析完成 integrateId(=roleId)=${w.integrateId} userId(=accountId)=${w.userId||"(未设置)"} requestDomain=${w.requestDomain}`),w}(A);if(!e)return;var t;hA=e,function(A){if(c[A])f=A;else{const n=A.split("-")[0],e=Object.keys(c).find(A=>A.startsWith(n));e&&(f=e)}}(hA.locale),t=hA.debug,n=t,s(hA.onError),function(A){g=A}(hA),C(hA),NA=S(hA,un),document.body.appendChild(NA),fn=NA.querySelector(".csk-launcher__badge"),function(A,n){try{const e=localStorage.getItem(Dn(A));if(!e)return;const s=JSON.parse(e);if("left"!==s.side&&"right"!==s.side||"number"!=typeof s.bottom)return;const t=window.innerHeight-76,r=Math.max(16,Math.min(s.bottom,t));n.classList.remove("csk-launcher--right","csk-launcher--left"),n.classList.add(`csk-launcher--${s.side}`),n.style.bottom=`${r}px`,tn={side:s.side,bottom:r}}catch(A){}}(hA.integrateId,NA),en=function(A,n,e){let s=!1,t=0,r=0,c=!1,f=0,d=0,g=0,l=!1;function i(){const n=parseFloat(getComputedStyle(A).bottom);return isNaN(n)?24:n}function o(n,e){if(l)return;s=!0,c=!1,t=n,r=e,f=i();const o=A.style,a=getComputedStyle(A);d=o.right?parseFloat(o.right):parseFloat(a.right),g=o.left?parseFloat(o.left):parseFloat(a.left)}function a(n,e,l){if(!s)return;const i=n-t,o=e-r;if(!c){if(Math.abs(i)<5&&Math.abs(o)<5)return;c=!0,A.classList.add("csk-launcher--dragging"),A.classList.remove("csk-launcher--right","csk-launcher--left"),A.style.transition="none",!isNaN(d)&&d>=0&&isNaN(g)?(A.style.right=`${d}px`,A.style.left="auto"):!isNaN(g)&&g>=0&&(A.style.left=`${g}px`,A.style.right="auto")}if(c){l.preventDefault();const n=Math.max(16,Math.min(f-o,X()));A.style.bottom=`${n}px`}}function z(){if(!s)return;if(s=!1,!c)return;const n=parseFloat(A.style.bottom)||i(),t=Math.max(16,Math.min(n,X())),r=A.getBoundingClientRect(),f=r.left+r.width/2<=window.innerWidth/2?"left":"right";A.classList.remove("csk-launcher--dragging"),A.classList.add(`csk-launcher--${f}`,"csk-launcher--snap"),A.style.left="",A.style.right="",A.style.bottom=`${t}px`,l=!0;const d=()=>{A.removeEventListener("transitionend",d),A.classList.remove("csk-launcher--snap"),A.style.transition="",l=!1};A.addEventListener("transitionend",d),setTimeout(()=>{l&&d()},350);const g=n=>{n.stopPropagation(),A.removeEventListener("click",g,!0)};A.addEventListener("click",g,!0);const o=A.querySelector(".csk-launcher__badge");o&&(o.style.display=""),e&&e({side:f,bottom:t})}function M(A){o(A.clientX,A.clientY)}function v(A){a(A.clientX,A.clientY,A)}function w(){z()}function k(A){1===A.touches.length&&o(A.touches[0].clientX,A.touches[0].clientY)}function u(A){1===A.touches.length&&a(A.touches[0].clientX,A.touches[0].clientY,A)}function Z(){z()}return A.addEventListener("mousedown",M),document.addEventListener("mousemove",v),document.addEventListener("mouseup",w),A.addEventListener("touchstart",k,{passive:!0}),document.addEventListener("touchmove",u,{passive:!1}),document.addEventListener("touchend",Z),()=>{A.removeEventListener("mousedown",M),document.removeEventListener("mousemove",v),document.removeEventListener("mouseup",w),A.removeEventListener("touchstart",k),document.removeEventListener("touchmove",u),document.removeEventListener("touchend",Z)}}(NA,0,A=>{const n=null==tn?void 0:tn.side;tn=A,function(A,n){try{localStorage.setItem(Dn(A),JSON.stringify(n))}catch(A){}}(hA.integrateId,A),n&&n!==A.side&&function(){if(!KA)return;KA.style.left="",KA.style.top="",KA.style.right="",KA.style.bottom=""}(),Bn(A.side),rn&&!rn.classList.contains("csk-teaser--hidden")&&gn()}),tn&&Bn(tn.side);const l=function(A){const n=document.createElement("div");n.id="csk-window",n.className=`csk-root csk-window csk-window--${"left-bottom"===A.position?"left":"right"} csk-window--hidden${"dark"===A.theme?" csk-dark":""}`,n.setAttribute("role","dialog"),n.setAttribute("aria-label",A.title),n.setAttribute("aria-modal","false");const e=document.createElement("div");e.className="csk-header";const s=document.createElement("div");s.className="csk-header__left";const t=document.createElement("div");t.className="csk-header__avatar",t.innerHTML=I;const r=document.createElement("div");r.className="csk-header__info";const c=document.createElement("span");c.className="csk-header__title",c.textContent=A.title;const f=document.createElement("span");f.className="csk-header__status",f.innerHTML=`${d("status_online")}`,r.appendChild(c),r.appendChild(f),s.appendChild(t),s.appendChild(r);let g=null;const l=A.roles;if(l&&l.length>1){g=document.createElement("select"),g.className="csk-role-select",g.setAttribute("aria-label",d("role_selector_label"));for(const n of l){const e=document.createElement("option");e.value=String(n.id),e.textContent=n.name||String(n.id),String(n.id)===String(A.integrateId)&&(e.selected=!0),g.appendChild(e)}g.addEventListener("change",()=>{const A=g.value;n.dispatchEvent(new CustomEvent("csk:roleChange",{detail:{roleId:A}}))});const t=document.createElement("div");t.className="csk-role-select-wrap",t.appendChild(g),e.appendChild(s),e.appendChild(t)}else e.appendChild(s);const i=document.createElement("div");i.className="csk-header__actions";const o=document.createElement("button");o.className="csk-history-btn",o.setAttribute("title",d("history_title")),o.innerHTML='';const a=document.createElement("button");a.className="csk-header__btn csk-header__btn--minimize",a.setAttribute("title",d("minimize")),a.innerHTML='',a.addEventListener("click",()=>{n.classList.add("csk-window--hidden")});const z=document.createElement("button");z.className="csk-header__btn csk-header__btn--close",z.setAttribute("title",d("close")),z.innerHTML='',z.addEventListener("click",()=>{n.classList.add("csk-window--hidden")}),i.appendChild(o),i.appendChild(a),i.appendChild(z),e.appendChild(i);const M=document.createElement("div");M.id="csk-messages",M.className="csk-messages";const v=document.createElement("div");if(v.className="csk-welcome",v.innerHTML=`\n
${I}
\n
${d("welcome_title")}
\n
${d("welcome_desc")}
\n `,A.quickReplies.length>0){const e=document.createElement("div");e.className="csk-quick-replies";for(const s of A.quickReplies){const A=document.createElement("button");A.type="button",A.className="csk-quick-reply",A.textContent=s,A.addEventListener("click",()=>{n.dispatchEvent(new CustomEvent("csk:quickReply",{detail:{text:s}}))}),e.appendChild(A)}v.appendChild(e)}M.appendChild(v);const w=document.createElement("button");w.type="button",w.className="csk-newmsg csk-newmsg--hidden",w.innerHTML=`\n \n ${d("new_message")}\n `,n.appendChild(w);const k=document.createElement("div");k.className="csk-history-panel csk-history-panel--hidden",k.innerHTML=`\n
\n ${d("history_title")}\n \n
\n
\n \n
\n
\n `,M.appendChild(k);const u=k.querySelector("#csk-history-back");u&&u.addEventListener("click",()=>{k.classList.add("csk-history-panel--hidden")}),o.addEventListener("click",A=>{A.stopPropagation();const e=k.classList.contains("csk-history-panel--hidden");k.classList.toggle("csk-history-panel--hidden"),e&&n.dispatchEvent(new CustomEvent("csk:loadHistory"))});let Z=null;if(A.showCategorySwitch){const A=document.createElement("div");A.className="csk-category-bar";const s=document.createElement("span");s.className="csk-category-bar__label",s.textContent="📚",Z=document.createElement("select"),Z.id="csk-category-select",Z.className="csk-category-select",Z.innerHTML=``,Z.addEventListener("change",()=>{const A=Z.value;n.dispatchEvent(new CustomEvent("csk:categoryChange",{detail:{categoryId:A?Number(A):void 0}}))}),A.appendChild(s),A.appendChild(Z),n.appendChild(e),n.appendChild(M),n.appendChild(A)}else n.appendChild(e),n.appendChild(M);const P=document.createElement("div");P.className="csk-input-area";const D=document.createElement("div");D.className="csk-input-wrap";const B=document.createElement("textarea");B.id="csk-input",B.className="csk-input",B.setAttribute("placeholder",d("placeholder")),B.setAttribute("rows","1"),B.setAttribute("autofocus","");const y=document.createElement("button");y.id="csk-send-btn",y.className="csk-send-btn",y.setAttribute("title",d("send")),y.setAttribute("disabled","true"),y.innerHTML='',D.appendChild(B),D.appendChild(y),P.appendChild(D),n.appendChild(P);let O=null;A.showClear&&(O=document.createElement("button"),O.className="csk-clear-btn",O.textContent=d("clear"),O.style.display="none",n.insertBefore(O,P));let x=null;const b=document.createElement("div");b.className="csk-sr-only",b.setAttribute("aria-live","polite"),b.setAttribute("aria-atomic","true"),n.appendChild(b);const m=k.querySelector("#csk-history-search"),V=document.createElement("div");V.className=`csk-teaser csk-teaser--${"left-bottom"===A.position?"left":"right"} csk-teaser--hidden`,V.setAttribute("role","status"),V.innerHTML=`\n \n ${A.teaserText||d("teaser_text")}\n `;const p=document.createElement("div");return p.className="csk-resize-handle",p.setAttribute("aria-label",d("resize")),p.innerHTML='',n.appendChild(p),{window:n,messagesContainer:M,inputEl:B,sendBtn:y,clearBtn:O,categorySelect:Z,historyPanel:k,welcomeEl:v,newMsgBtn:w,teaserEl:V,resizeHandle:p,searchInput:m,ariaLiveEl:b,roleSelect:g,showLoading:function(){if(x)return x.style.display="flex",x;const A=document.createElement("div");return A.className="csk-loading",A.innerHTML=`\n
${I}
\n
\n
\n
\n
\n
\n `,M.appendChild(A),x=A,A},hideLoading:function(){x&&x.parentNode&&(x.parentNode.removeChild(x),x=null)}}}(hA);KA=l.window,LA=l.messagesContainer,WA=l.inputEl,UA=l.sendBtn,RA=l.clearBtn,FA=l.categorySelect,_A=l.historyPanel,$A=l.showLoading,An=l.hideLoading,document.body.appendChild(KA),rn=l.teaserEl,document.body.appendChild(rn),gn();const a=KA.querySelector(".csk-header");if(a&&(nn=function(A,n,e){let s=!1,t=0,r=0,c=0,f=0;const d=A=>{if(A.target.closest("button"))return;s=!0,t=A.clientX,r=A.clientY;const e=n.getBoundingClientRect();c=t-e.left,f=r-e.top,document.addEventListener("mousemove",g),document.addEventListener("mouseup",l)},g=A=>{if(!s)return;const e=A.clientX-c,t=A.clientY-f,r=window.innerWidth-n.offsetWidth,d=window.innerHeight-n.offsetHeight;n.style.right="auto",n.style.bottom="auto",n.style.left=`${Math.max(0,Math.min(e,r))}px`,n.style.top=`${Math.max(0,Math.min(t,d))}px`},l=()=>{if(s=!1,document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",l),e){const A=n.getBoundingClientRect();e({x:A.left,y:A.top})}};return A.addEventListener("mousedown",d),()=>{A.removeEventListener("mousedown",d),document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",l)}}(a,KA,A=>{!function(A,n){try{localStorage.setItem(Pn(A),JSON.stringify(n))}catch(A){}}(hA.integrateId,A)})),function(A,n){try{const e=localStorage.getItem(Pn(A));if(!e)return;const s=JSON.parse(e);if("number"!=typeof s.x||"number"!=typeof s.y)return;const t=window.innerWidth-n.offsetWidth,r=window.innerHeight-n.offsetHeight,c=Math.max(0,Math.min(s.x,t)),f=Math.max(0,Math.min(s.y,r));n.style.right="auto",n.style.bottom="auto",n.style.left=`${c}px`,n.style.top=`${f}px`}catch(A){}}(hA.integrateId,KA),hA.resizable){const A=l.resizeHandle;sn=function(A,n,e){let s=!1,t=0,r=0,c=0,f=0;const d=(A,e)=>{s=!0,t=A,r=e;const d=n.getBoundingClientRect();c=d.width,f=d.height,n.classList.add("csk-window--resizing"),document.addEventListener("mousemove",i),document.addEventListener("mouseup",o),document.addEventListener("touchmove",M,{passive:!1}),document.addEventListener("touchend",v)},g=(A,e,d)=>{if(!s)return;d&&d.preventDefault();const g=A-t,l=e-r,i=Math.max(300,Math.min(c+g,window.innerWidth-24)),o=Math.max(300,Math.min(f+l,window.innerHeight-24));n.style.width=`${i}px`,n.style.height=`${o}px`,n.style.setProperty("--csk-window-width",`${i}px`),n.style.setProperty("--csk-window-height",`${o}px`),n.style.bottom="",n.style.right=""},l=()=>{if(!s)return;s=!1,n.classList.remove("csk-window--resizing"),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",o),document.removeEventListener("touchmove",M),document.removeEventListener("touchend",v);const A=n.getBoundingClientRect();e&&e({width:A.width,height:A.height})};function i(A){g(A.clientX,A.clientY,A)}function o(){l()}function a(A){A.preventDefault(),A.stopPropagation(),d(A.clientX,A.clientY)}function z(A){A.preventDefault(),A.stopPropagation(),1===A.touches.length&&d(A.touches[0].clientX,A.touches[0].clientY)}function M(A){1===A.touches.length&&g(A.touches[0].clientX,A.touches[0].clientY,A)}function v(){l()}return A.addEventListener("mousedown",a),A.addEventListener("touchstart",z,{passive:!1}),()=>{A.removeEventListener("mousedown",a),A.removeEventListener("touchstart",z),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",o),document.removeEventListener("touchmove",M),document.removeEventListener("touchend",v)}}(A,KA,A=>{!function(A,n){try{localStorage.setItem(Zn(A),JSON.stringify(n))}catch(A){}}(hA.integrateId,A)}),function(A,n){try{const e=localStorage.getItem(Zn(A));if(!e)return;const s=JSON.parse(e);if("number"!=typeof s.width||"number"!=typeof s.height)return;const t=Math.max(300,Math.min(s.width,window.innerWidth-24)),r=Math.max(300,Math.min(s.height,window.innerHeight-24));n.style.width=`${t}px`,n.style.height=`${r}px`,n.style.setProperty("--csk-window-width",`${t}px`),n.style.setProperty("--csk-window-height",`${r}px`)}catch(A){}}(hA.integrateId,KA)}if(VA(hA,{messagesContainer:LA,inputEl:WA,sendBtn:UA,clearBtn:RA,categorySelect:FA,historyPanel:_A,welcomeEl:l.welcomeEl,newMsgBtn:l.newMsgBtn,searchInput:l.searchInput,ariaLiveEl:l.ariaLiveEl,roleSelect:l.roleSelect,showLoading:$A,hideLoading:An}),KA.addEventListener("csk:categoryChange",A=>{var n,e;n=A.detail.categoryId,cA=n,mA=null===(e=null==fA?void 0:fA.enableRag)||void 0===e||e,r.lifecycleCategoryChange(null!=n?n:"全部")}),KA.addEventListener("csk:loadHistory",()=>{!async function(){if(!vA||!fA)return;const A=vA.querySelector("#csk-history-list");if(A){A.innerHTML='
加载中...
';try{const n=await B(1,50,fA.userId,o());xA=n.list.map(A=>({id:A.conversationId||"",chatId:A.conversationId||"",roleId:A.roleId,roleName:A.roleName,messageCount:A.messageCount,lastMessageTime:A.lastMessageTime,lastMessagePreview:A.lastMessagePreview,createdAt:A.firstMessageTime||A.createdAt})),bA="",uA&&(uA.value=""),F(A,xA,A=>{qA(A)},A=>{window.open(x(A),"_blank")},async A=>{confirm(d("history_delete_confirm"))&&await O(A)&&(A===z()&&(dA=[],gA&&gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove()),aA&&(aA.style.display="none"),jA()),xA=xA.filter(n=>(n.chatId||n.id)!==A),EA())},z())}catch(n){r.error(d("history_load_error"),n),A.innerHTML=`
${d("history_load_error")}
`}}}()}),KA.addEventListener("csk:quickReply",A=>{var n;n=A.detail.text,!lA||BA?Promise.resolve():(lA.value=n,IA(),SA())}),KA.addEventListener("csk:retry",A=>{!async function(A){if(!fA||!gA||BA)return;const n=dA.findIndex(n=>n.id===A&&"ai"===n.role);if(n<0)return;let e="";for(let A=n-1;A>=0;A--)if("user"===dA[A].role){e=dA[A].content;break}if(!e)return;const s=dA.splice(n),t=new Set(s.map(A=>A.id));gA.querySelectorAll(".csk-msg").forEach(A=>{const n=A.dataset.cskMsgId;n&&t.has(n)&&A.remove()}),AA(fA.integrateId,dA),jA(),await XA(e)}(A.detail.msgId)}),KA.addEventListener("csk:feedback",A=>{GA(A.detail.msgId,A.detail.value)}),KA.addEventListener("csk:newMessage",A=>{var n;if(KA&&KA.classList.contains("csk-window--hidden")&&(fn&&fn.classList.remove("csk-launcher__badge--hidden"),(null==hA?void 0:hA.sound)&&function(){try{dn||(dn=new(window.AudioContext||window.webkitAudioContext));const A=dn;if("suspended"===A.state)return void A.resume();const n=A.currentTime;[0,.15].forEach((e,s)=>{const t=A.createOscillator(),r=A.createGain();t.type="sine",t.frequency.value=0===s?880:1100,r.gain.setValueAtTime(.15,n+e),r.gain.exponentialRampToValueAtTime(.001,n+e+.12),t.connect(r),r.connect(A.destination),t.start(n+e),t.stop(n+e+.12)})}catch(A){}}(),(null==hA?void 0:hA.notification)&&function(){try{if(!("Notification"in window))return;"granted"===Notification.permission?new Notification((null==hA?void 0:hA.title)||"AI 智能助手",{body:"收到新消息",icon:void 0,silent:!0}):"denied"!==Notification.permission&&Notification.requestPermission()}catch(A){}}()),(null==hA?void 0:hA.onMessage)&&(null===(n=A.detail)||void 0===n?void 0:n.msg))try{hA.onMessage(A.detail.msg)}catch(A){}}),KA.addEventListener("csk:roleChange",A=>{A.detail.roleId&&async function(A){if(!fA||!gA)return;const n=o();if(A===n)return;dA.length>0&&AA(n,dA),yA&&(yA.abort(),yA=null),BA=!1,YA("send"),dA=[],gA.querySelectorAll(".csk-msg, .csk-loading").forEach(A=>A.remove()),nA(n),V(n,fA.userId,void 0),nA(A),V(A,fA.userId,void 0),i(A),MA&&(MA.value=A);const e=await b(!0);if(r.info(`角色切换 initChatId 完成 chatId=${e} roleId=${A}`),e)try{await QA()}catch(n){r.warn(`切换角色后加载后端历史失败 roleId=${A}`,n)}aA&&0===dA.length&&(aA.style.display="none"),jA(),OA=!0,gA&&_(gA),r.info(`角色切换完成 ${n} -> ${A}`)}(String(A.detail.roleId))}),document.addEventListener("keydown",vn),window.addEventListener("resize",zn),TA=!0,r.lifecycleInit(hA.integrateId,hA.requestDomain),hA.onReady)try{hA.onReady()}catch(A){}hA.showTeaser&&(cn=setTimeout(()=>{KA&&KA.classList.contains("csk-window--hidden")&&function(){if(!rn)return;gn(),rn.classList.remove("csk-teaser--hidden"),rn.addEventListener("click",on);const A=rn.querySelector(".csk-teaser__close");A&&A.addEventListener("click",an)}()},1500)),pA().catch(A=>{r.warn("chatId 初始化失败,将在发送消息时重试",A)})},destroy:function(){if(!TA)return;cn&&(clearTimeout(cn),cn=null),ln(),rn&&rn.parentNode&&(rn.parentNode.removeChild(rn),rn=null),NA&&NA.parentNode&&(NA.parentNode.removeChild(NA),NA=null),KA&&KA.parentNode&&(KA.parentNode.removeChild(KA),KA=null),nn&&(nn(),nn=null),en&&(en(),en=null),sn&&(sn(),sn=null),tn=null,p&&p.parentNode&&(p.parentNode.removeChild(p),p=null),document.querySelectorAll("style[data-csk-sdk]").forEach(A=>A.remove()),document.removeEventListener("keydown",vn),window.removeEventListener("resize",zn),s(void 0);const A=null==hA?void 0:hA.integrateId;hA=null,TA=!1,LA=null,WA=null,UA=null,RA=null,FA=null,_A=null,$A=null,An=null,fn=null,dn=null,g=null,l=null,r.lifecycleDestroy(A||"")},open:wn,close:kn,toggle:un,clearHistory:function(){hA&&(RA?RA.click():confirm("确定清空所有对话记录?")&&nA(hA.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=yn),yn}(); //# sourceMappingURL=chatbot-sdk.min.js.map