var ChatbotSDK=function(){"use strict";const n="[ChatbotSDK]";let e=!0;const t={},r={info(t,r){e&&console.log(n,t,void 0!==r?r:"")},warn(t,r){e&&console.warn(n,t,void 0!==r?r:"")},error(e,t){console.error(n,e,void 0!==t?t:"")},time(n){t[n]=Date.now()},timeEnd(r,s){const o=t[r];if(void 0!==o){const i=Date.now()-o;if(delete t[r],e){const e=s?`${s} ${i}ms`:`${r} ${i}ms`;console.log(n,e)}return i}return 0},lifecycleInit(n,e){this.info(`初始化完成 integrateId=${n} requestDomain=${e}`)},lifecycleDestroy(n){this.info(`销毁实例 integrateId=${n}`)},lifecycleSend(n,e){this.info(`发送消息 integrateId=${n} length=${e}`),this.time(`send_${n}`)},lifecycleReply(n,e){const t=this.timeEnd(`send_${n}`,"AI 回复");this.info(`AI 回复 integrateId=${n} length=${e} duration=${t}ms`)},lifecycleError(n,e,t){this.timeEnd(`send_${n}`),this.error(`请求失败 integrateId=${n} status=${e} message=${t}`)},lifecycleClear(n){this.info(`清空会话 integrateId=${n}`)},lifecycleStreamDone(n,e){const t=this.timeEnd(`send_${n}`,"流式回复");this.info(`流式回复完成 integrateId=${n} length=${e} duration=${t}ms`)},lifecycleCategoryChange(n){this.info(`切换知识库分类 categoryId=${n}`)}};const s={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",status_online:"在线",welcome_title:"你好,我是 AI 智能助手",welcome_desc:"有什么可以帮你的吗?在下方输入框开始提问吧~",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",status_online:"Online",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",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 o="zh-CN";function i(n,e){let t=(s[o]||s["zh-CN"])[n]||s["zh-CN"][n]||n;if(e)for(const[n,r]of Object.entries(e))t=t.replace(`{${n}}`,String(r));return t}let a=null;function c(n){a&&(a.chatId=n)}function l(){return(null==a?void 0:a.chatId)||""}function d(n){if(!a)throw new Error("API 配置未初始化");return`${a.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function p(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function u(n,e={},t=3e4){const r=new AbortController,s=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new m(i("error_timeout"),"timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new m(i("error_cors"),"cors");throw new m(i("error_network"),"network")}finally{clearTimeout(s)}}class m extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function h(n){switch(n){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")}(${n})`}}async function g(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",a.chatId),p(e,"roleId",a.integrateId),p(e,"accountId",a.userId),d(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n);r.lifecycleSend(a.integrateId,n.length);try{const n=await u(e);if(!n.ok){const e=h(n.status);throw r.lifecycleError(a.integrateId,String(n.status),e),new m(e,`http_${n.status}`)}const t=await n.text();return r.lifecycleReply(a.integrateId,t.length),t}catch(n){if(n instanceof m)throw n;throw r.lifecycleError(a.integrateId,"unknown",String(n)),new m(i("error_unknown"),"unknown")}}async function k(n,e,t,s,o,c){var l;const g=c?function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),p(t,"roleId",a.integrateId),p(t,"accountId",a.userId),p(t,"categoryId",null!=e?e:a.categoryId),d(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(n,o):function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),p(t,"roleId",a.integrateId),p(t,"accountId",a.userId),p(t,"categoryId",null!=e?e:a.categoryId),d(`/ai/assistant_app/chat/sse?${t.toString()}`)}(n,o);let k="";r.lifecycleSend(a.integrateId,n.length);try{const n=await u(g,{},6e4);if(!n.ok){const e=h(n.status);return r.lifecycleError(a.integrateId,String(n.status),e),void s(new m(e,`http_${n.status}`))}const o=null===(l=n.body)||void 0===l?void 0:l.getReader();if(!o)return void s(new m(i("error_stream_unsupported"),"stream_unsupported"));const c=new TextDecoder("utf-8",{stream:!0});let d="";try{for(;;){const{done:n,value:t}=await o.read();if(n)break;d+=c.decode(t,{stream:!0});const r=d.split("\n");d=r.pop()||"";for(const n of r){const t=n.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const n=t.substring(5).trim();n&&(k+=n,e(n))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(k+=t,e(t))}}}if(d.trim()){const n=d.trim();if(n.startsWith("data:")){const t=n.substring(5).trim();t&&(k+=t,e(t))}else"[DONE]"!==n&&(k+=n,e(n))}}catch(n){if(!(k.length>0))throw n;e("\n\n"+i("stream_unstable"))}finally{o.releaseLock()}r.lifecycleStreamDone(a.integrateId,k.length),t()}catch(n){n instanceof m?s(n):(r.lifecycleError(a.integrateId,"unknown",String(n)),s(new m(i("error_network"),"network")))}}async function f(n,e){const t=function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),p(t,"roleId",a.integrateId),p(t,"accountId",a.userId),p(t,"categoryId",null!=e?e:a.categoryId),d(`/ai/assistant_app/rag/sources?${t.toString()}`)}(n,e);try{const n=await u(t);if(!n.ok)throw new m(h(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(n){return r.error("获取引用来源失败",n),[]}}async function b(n=1,e=20,t,s){let o=`/conversation/list?page=${n}&size=${e}`;t&&(o+=`&accountId=${encodeURIComponent(t)}`),s&&(o+=`&roleId=${encodeURIComponent(s)}`);const i=d(o);try{const n=await u(i);if(!n.ok)throw new m(h(n.status),`http_${n.status}`);const e=await n.json();return{list:e.success&&Array.isArray(e.data)?e.data:[],total:e.total||0,pages:e.pages||0}}catch(n){return r.error("加载会话列表失败",n),{list:[],total:0,pages:0}}}async function x(n){const e=d(`/conversation/${n}/messages`);try{const n=await u(e);if(!n.ok)throw new m(h(n.status),`http_${n.status}`);const t=await n.json();return{messages:t.success&&Array.isArray(t.data)?t.data:[],total:t.total||0}}catch(n){return r.error("加载会话消息失败",n),{messages:[],total:0}}}async function y(){if(!a)return"";const n=function(n,e){try{return localStorage.getItem(_(n,e))||""}catch(n){return""}}(a.integrateId,a.userId);if(n)return a.chatId=n,r.info(`从缓存恢复 chatId=${n}`),n;try{const n=await b(1,5,a.userId,a.integrateId);if(n.list.length>0){const e=n.list[0],t=e.conversationId||e.chatId||"";if(t)return a.chatId=t,w(a.integrateId,a.userId,t),r.info(`从后端恢复会话 chatId=${t} messageCount=${e.messageCount}`),t}}catch(n){r.warn("查询后端会话列表失败,将生成新 chatId",n)}const e=function(){const n="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${n}`}();return a.chatId=e,w(a.integrateId,a.userId,e),r.info(`生成新 chatId=${e}`),e}function _(n,e){return`csk_chatId_${n}${e?"_"+e:""}`}function w(n,e,t){try{t?localStorage.setItem(_(n,e),t):localStorage.removeItem(_(n,e))}catch(n){}}let v=null;function C(n){const e=I(n.primaryColor,-15),t=I(n.primaryColor,18),r=function(n){const e=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);return e?`${parseInt(e[1],16)}, ${parseInt(e[2],16)}, ${parseInt(e[3],16)}`:"79, 70, 229"}(n.primaryColor);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-primary-light: ${t};\n --csk-primary-rgb: ${r};\n --csk-bg-user: linear-gradient(135deg, ${n.primaryColor}, ${e});\n --csk-bg-ai: #ffffff;\n --csk-text-user: #ffffff;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}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 I(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),s=r(parseInt(t[1],16)+e),o=r(parseInt(t[2],16)+e),i=r(parseInt(t[3],16)+e);return`#${s.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}`}function E(n){document.querySelector("style[data-csk-sdk]")||(v=document.createElement("style"),v.setAttribute("data-csk-sdk",""),v.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${C(n)}\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: 58px;\n height: 58px;\n border-radius: 50%;\n background: var(--csk-bg-user);\n box-shadow: 0 8px 24px rgba(var(--csk-primary-rgb), 0.42), 0 2px 6px rgba(15, 23, 42, 0.12);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: transform 0.22s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.22s ease;\n border: none;\n color: #fff;\n user-select: none;\n}\n.csk-launcher--right { right: 24px; }\n.csk-launcher--left { left: 24px; }\n.csk-launcher::after {\n content: '';\n position: absolute;\n inset: -4px;\n border-radius: 50%;\n border: 2px solid rgba(var(--csk-primary-rgb), 0.35);\n opacity: 0;\n animation: csk-ping 2.6s cubic-bezier(0, 0, 0.2, 1) infinite;\n pointer-events: none;\n}\n.csk-launcher:hover {\n transform: translateY(-2px) scale(1.05);\n box-shadow: 0 12px 32px rgba(var(--csk-primary-rgb), 0.5), 0 4px 10px rgba(15, 23, 42, 0.14);\n}\n.csk-launcher:active { transform: scale(0.94); }\n.csk-launcher svg { width: 28px; height: 28px; }\n\n@keyframes csk-ping {\n 0% { transform: scale(0.92); opacity: 0.7; }\n 70%, 100% { transform: scale(1.35); opacity: 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: 600px;\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-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-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 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.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 { background: #F3F4F6; }\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-window--hidden { transform: translateY(100%); }\n .csk-launcher { bottom: 20px; }\n .csk-launcher--right { right: 20px; }\n .csk-launcher--left { left: 20px; }\n}\n`}(n),document.head.appendChild(v))}function $(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})}function S(n){const e={"&":"&","<":"<",">":">",'"':""","'":"'"};return n.replace(/[&<>"']/g,n=>e[n]||n)}function N(){return Date.now()}const A='';function L(n,e){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===n.position?"left":"right"),t.setAttribute("title",n.title),t.setAttribute("aria-label",n.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=n.launcherIcon;const r=function(n,e){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,r),t=null},e)}}(e,300);return t.addEventListener("click",r),t.addEventListener("keydown",n=>{"Enter"!==n.key&&" "!==n.key||(n.preventDefault(),r())}),t}function F(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const s=document.createElement("div");s.className="csk-msg__avatar csk-msg__avatar--user",s.innerHTML='';const o=document.createElement("div");o.className="csk-msg__content";const i=document.createElement("div");i.className="csk-msg__bubble",i.textContent=e;const a=document.createElement("div");return a.className="csk-msg__time",a.textContent=T(t),o.appendChild(i),o.appendChild(a),r.appendChild(s),r.appendChild(o),n.appendChild(r),r}function M(n,e,t,r){const s=document.createElement("div");s.className="csk-msg csk-msg--ai";const o=document.createElement("div");o.className="csk-msg__avatar csk-msg__avatar--ai",o.innerHTML=A;const i=document.createElement("div");i.className="csk-msg__content";const a=document.createElement("div");a.className="csk-msg__bubble",r?a.innerHTML=r(e):a.textContent=e;const c=document.createElement("div");return c.className="csk-msg__time",c.textContent=T(t),i.appendChild(a),i.appendChild(c),s.appendChild(o),s.appendChild(i),n.appendChild(s),s}function D(n,e){const t=n.querySelector(".csk-sources");if(t&&t.remove(),!e||0===e.length)return;const r=document.createElement("div");r.className="csk-sources csk-sources--collapsed";const s=document.createElement("div");s.className="csk-sources__header";const o=document.createElement("span");o.className="csk-sources__title",o.textContent=`📚 ${i("source_count",{n:e.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",s.appendChild(o),s.appendChild(a),s.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const c=document.createElement("div");c.className="csk-sources__body";for(const n of e){const e=document.createElement("div");e.className="csk-source-item";const t=document.createElement("div");if(t.className="csk-source-item__name",t.textContent=n.title||n.sourceName||"未知文档",n.snippet){const t=document.createElement("div");t.className="csk-source-item__snippet",t.textContent=n.snippet,e.appendChild(t)}const r=document.createElement("div");r.className="csk-source-item__meta";const s=[];n.sourceName&&s.push(n.sourceName),void 0!==n.chunkIndex&&s.push(`分块 #${n.chunkIndex}`),void 0!==n.score&&s.push(`相关度 ${(100*n.score).toFixed(0)}%`),r.textContent=s.join(" · "),e.appendChild(t),e.appendChild(r),c.appendChild(e)}r.appendChild(s),r.appendChild(c);const l=n.querySelector(".csk-msg__time");l&&l.parentNode?l.parentNode.insertBefore(r,l):n.appendChild(r)}function z(n){n.scrollTop=n.scrollHeight}function T(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function H(n){return`csk_history_${n}`}function B(n,e){try{let t=e;t.length>200&&(t=t.slice(50),r.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const s={messages:t,updatedAt:Date.now()};localStorage.setItem(H(n),JSON.stringify(s))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?r.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):r.error("保存会话历史失败",n)}}function q(n){try{localStorage.removeItem(H(n))}catch(n){r.warn("清空会话历史失败",n)}}const j="\0CODEBLOCK_",P="\0INLINECODE_";function R(n){if(!n||"string"!=typeof n)return"";const e=[];let t=n;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(n,t,r)=>{const s=e.length,o=S(r.trimEnd()),i=t?` class="language-${S(t)}"`:"";return e.push(`
${o}`),`${j}${s}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(n,e)=>{const t=r.length;return r.push(`${S(e)}`),`${P}${t}\0`}),t=S(t),t=U(t,j,e),t=U(t,P,r);const s=t.split("\n"),o=[];let i=!1,a="",c=!1,l=[];for(let n=0;n')),o.push(`"),c=!1)}}function U(n,e,t){return n.replace(new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(n,e)=>t[parseInt(e)]||"")}let O,W=null,Y=[],K=null,V=null,X=null,J=null,G=null,Q=null,Z=null,nn=null,en=null,tn=null,rn=!1,sn=!1;function on(n,e){W=n,K=e.messagesContainer,V=e.inputEl,X=e.inputEl.parentElement,J=e.sendBtn,G=e.clearBtn,Q=e.categorySelect,Z=e.historyPanel,nn=e.welcomeEl,en=e.showLoading,tn=e.hideLoading,O=n.categoryId,sn=!!n.categoryId||!!n.showCategorySwitch,function(){if(!V||!J)return;J.addEventListener("click",()=>dn()),V.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),dn())}),V.addEventListener("input",()=>{ln(),function(){if(!V)return;V.style.height="auto",V.style.height=`${Math.min(V.scrollHeight,120)}px`}()}),V.addEventListener("focus",()=>{X&&X.classList.add("csk-input-wrap--focus")}),V.addEventListener("blur",()=>{X&&X.classList.remove("csk-input-wrap--focus")}),G&&G.addEventListener("click",()=>function(){if(!W)return;if(!confirm(i("clear_confirm")))return;if(Y=[],K){K.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove())}G&&(G.style.display="none");cn(),q(W.integrateId);const n=function(){const n="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${n}`}();c(n),w(W.integrateId,W.userId,n),r.lifecycleClear(W.integrateId),r.info(`新 chatId=${n}`)}())}(),n.showCategorySwitch&&Q&&async function(){if(!Q)return;try{const n=await async function(){const n=d("/category/tree");try{const e=await u(n);if(!e.ok)throw new m(h(e.status),`http_${e.status}`);const t=await e.json();return t.success&&Array.isArray(t.data)?(r.info(`加载分类树成功 count=${t.data.length}`),t.data):[]}catch(n){return n instanceof m?r.error(`加载分类树失败: ${n.message}`):r.error("加载分类树失败",n),[]}}();if(0===n.length)return;Q.innerHTML=``;const e=(n,t=0)=>{for(const r of n){const n=document.createElement("option");n.value=String(r.id),n.textContent=`${" ".repeat(t)}${r.name}`,void 0!==O&&String(r.id)===String(O)&&(n.selected=!0),Q.appendChild(n),r.children&&r.children.length>0&&e(r.children,t+1)}};e(n),r.info(`知识库分类加载成功 count=${n.length}`)}catch(n){r.error(i("category_load_error"),n)}}()}async function an(){if(W&&K&&(await y(),await async function(){if(!W||!K)return;const n=l();if(!n)return;try{const e=await x(n);e.messages.length>0&&(Y=e.messages.map((n,e)=>({id:$(),role:"USER"===n.messageType?"user":"ai",content:n.content,timestamp:new Date(n.createTime).getTime()})),pn(),r.info(`从后端加载 ${Y.length} 条历史消息`),B(W.integrateId,Y))}catch(n){r.warn("从后端加载历史消息失败",n)}}(),0===Y.length)){const n=function(n){try{const e=localStorage.getItem(H(n));if(!e)return[];const t=JSON.parse(e);return t&&Array.isArray(t.messages)?(r.info(`加载历史消息 integrateId=${n} count=${t.messages.length}`),t.messages):[]}catch(n){return r.warn("加载会话历史失败",n),[]}}(W.integrateId);n.length>0&&(Y=n,pn(),r.info(`从本地缓存恢复 ${n.length} 条消息`))}}function cn(){if(!nn)return;const n=Y.length>0||K&&K.querySelector(".csk-msg");nn.style.display=n?"none":""}function ln(){if(!J||!V)return;V.value.trim().length>0&&!rn?J.removeAttribute("disabled"):J.setAttribute("disabled","true")}async function dn(){if(!V||!W||rn)return;const n=V.value.trim();if(""===n)return;V.value="",ln(),V.style.height="auto",rn=!0,ln(),W.chatId||await y();const e=N();K&&F(K,n,e);const t={id:$(),role:"user",content:n,timestamp:e};Y.push(t),cn(),G&&Y.length>0&&(G.style.display="inline-flex"),K&&z(K),en&&en(),K&&z(K);try{let e;const t=N(),s=sn&&(void 0!==O||void 0!==W.categoryId);e=W.streaming?await async function(n,e,t){return new Promise((r,s)=>{let o=null,a="",c=!1;k(n,n=>{if(a+=n,!c&&K){tn&&tn();const{bubble:n}=function(n,e){const t=document.createElement("div");t.className="csk-msg csk-msg--ai";const r=document.createElement("div");r.className="csk-msg__avatar csk-msg__avatar--ai",r.innerHTML=A;const s=document.createElement("div");s.className="csk-msg__content";const o=document.createElement("div");o.className="csk-msg__bubble",o.innerHTML="";const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=T(e),s.appendChild(o),s.appendChild(i),t.appendChild(r),t.appendChild(s),n.appendChild(t),{wrapper:t,bubble:o}}(K,e);o=n,c=!0}o&&(o.textContent=a),K&&z(K)},()=>{c||""!==a?(o&&a&&(o.innerHTML=R(a)),r(a)):g(n).then(r).catch(s)},n=>{a.length>0?(o&&(o.innerHTML=R(a+"\n\n"+i("stream_interrupted"))),r(a)):s(n)},O,t)})}(n,t,s):await g(n),tn&&tn(),!W.streaming&&K&&M(K,e,t,R);const o={id:$(),role:"ai",content:e,timestamp:t};Y.push(o),B(W.integrateId,Y),K&&z(K),s&&async function(n,e){try{const t=await f(n,O);if(t.length>0){const n=t.map(n=>{var e,t;return{documentId:n.documentId||"",title:n.title||"",sourceName:n.sourceName||"",chunkIndex:null!==(e=n.chunkIndex)&&void 0!==e?e:0,score:null!==(t=n.score)&&void 0!==t?t:0,snippet:n.snippet||""}});if(e.sources=n,K){const e=K.querySelector(".csk-msg--ai:last-of-type");e&&D(e,n)}W&&B(W.integrateId,Y)}}catch(n){r.warn("获取引用来源失败",n)}}(n,o)}catch(n){tn&&tn();const e=n instanceof m?n.message:i("error_send");if(K){const n=document.createElement("div");n.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${e}`,n.appendChild(t),K.appendChild(n)}r.error(`发送失败 integrateId=${W.integrateId}`,n)}finally{rn=!1,ln()}}function pn(){if(!K)return;const n=K.querySelector(".csk-history-panel");K.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove());for(const n of Y)if("user"===n.role)F(K,n.content,n.timestamp);else{const e=M(K,n.content,n.timestamp,R);n.sources&&n.sources.length>0&&D(e,n.sources)}z(K),G&&Y.length>0&&(G.style.display="inline-flex"),cn(),n&&!K.contains(n)&&K.appendChild(n)}async function un(){if(!Z||!W)return;const n=Z.querySelector("#csk-history-list");if(n){n.innerHTML='${d(r[1])}
`);continue}c&&m();const h=e.match(/^[\-\*]\s+(.+)/);if(h){p(),m(),i&&"ul"===a||(u(),i=!0,a="ul",o.push('')),o.push(`
":""),i=!1,a="")}function m(){c&&(o.push("- ${d(h[1])}
`);continue}const g=e.match(/^\d+\.\s+(.+)/);g?(p(),m(),i&&"ol"===a||(u(),i=!0,a="ol",o.push('')),o.push(`
- ${d(g[1])}
`)):""!==e.trim()?/^(\*{3,}|-{3,}|_{3,})$/.test(e.trim())?(p(),u(),m(),o.push('
')):(u(),m(),l.push(d(e))):(p(),u())}return p(),u(),m(),o.join("\n");function d(n){return n=(n=(n=(n=(n=(n=n.replace(/\*\*(.+?)\*\*/g,"$1")).replace(/__(.+?)__/g,"$1")).replace(/\*(.+?)\*/g,"$1")).replace(/(?$1")).replace(/~~(.+?)~~/g,"$1")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,(n,e,t)=>`${e}`)}function p(){l.length>0&&(o.push(`${l.join("
`),l=[])}function u(){i&&(o.push("ul"===a?"
")}