From cfc1ca8650d4905ed187b98ab532f00440bdebe0 Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Fri, 26 Jun 2026 16:44:58 +0800 Subject: [PATCH] =?UTF-8?q?=20ChatSDK=20P1/P2=20=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B7=B2=E5=85=A8=E9=83=A8=E5=AE=9E=E7=8E=B0=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86=E4=B8=89=E4=B8=AA=E6=A0=B8=E5=BF=83=20bug?= =?UTF-8?q?=EF=BC=88integrateId=E2=86=92roleId=20=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E3=80=81chatId=20=20=20=E8=87=AA=E5=8A=A8=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=81=E5=AF=B9=E8=AF=9D=E5=8E=86=E5=8F=B2=E4=BB=8E=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=8A=A0=E8=BD=BD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/README.md | 361 ++-- client/dist/chatbot-sdk.js | 1715 +++++++++++++++-- client/dist/chatbot-sdk.js.map | 2 +- client/dist/chatbot-sdk.min.js | 2 +- client/dist/chatbot-sdk.min.js.map | 2 +- client/src/api.ts | 437 ++++- client/src/chat.ts | 346 +++- client/src/config.ts | 23 +- client/src/dom.ts | 275 ++- client/src/i18n.ts | 152 ++ client/src/index.ts | 98 +- client/src/logger.ts | 72 +- client/src/markdown.ts | 212 ++ client/src/styles.ts | 362 ++++ client/src/types.ts | 68 +- src/main/resources/static/sdk/chatbot-sdk.js | 1715 +++++++++++++++-- .../resources/static/sdk/chatbot-sdk.js.map | 2 +- .../resources/static/sdk/chatbot-sdk.min.js | 2 +- .../static/sdk/chatbot-sdk.min.js.map | 2 +- src/main/resources/static/sdk/test.html | 681 ++----- 20 files changed, 5192 insertions(+), 1337 deletions(-) create mode 100644 client/src/i18n.ts create mode 100644 client/src/markdown.ts diff --git a/client/README.md b/client/README.md index 18d5bde..2f22246 100644 --- a/client/README.md +++ b/client/README.md @@ -1,6 +1,6 @@ # ChatbotSDK — 前端对接文档 -> P0 核心链路已完成 | 构建时间:2026-06-25 | 版本:1.0.0 +> P0 核心链路 ✅ | P1 体验增强 ✅ | P2 运营完善 ✅ | 版本:1.2.0 | 更新日期:2026-06-26 --- @@ -12,7 +12,7 @@ @@ -20,70 +20,21 @@ 引入后在页面右下角出现悬浮客服按钮,点击即可对话。 -### 集成到现有项目 - -SDK 产物位于 `client/dist/` 目录: - -| 文件 | 大小 | 说明 | -|------|------|------| -| `chatbot-sdk.js` | 47KB | 未压缩开发版(含 sourcemap) | -| `chatbot-sdk.min.js` | 22KB | 压缩生产版(gzip ~8KB) | - -**部署路径:** 将 `.min.js` 文件上传到后端 `static/sdk/` 目录或任意 CDN。 - ---- - -## 二、SDKConfig 完整参数 - -| 参数 | 类型 | 必传 | 默认值 | 说明 | -|------|------|------|--------|------| -| `integrateId` | `string` | ✅ | — | 集成标识 → 后端 `chatId` + 数据隔离 key | -| `requestDomain` | `string` | ✅ | — | 后端 API 域名(如 `https://ai.example.com`) | -| `userId` | `string` | ❌ | — | 宿主用户标识 → 后端 `accountId` | -| `roleId` | `number` | ❌ | — | 客服角色 ID | -| `categoryId` | `number` | ❌ | — | 默认知识库分类 | -| `showCategorySwitch` | `boolean` | ❌ | `false` | 是否显示知识库下拉 | -| `title` | `string` | ❌ | `"AI 智能助手"` | 弹窗标题 | -| `width` | `number` | ❌ | `380` | 弹窗宽度(px),移动端自适应 | -| `position` | `string` | ❌ | `"right-bottom"` | 悬浮按钮位置:`left-bottom` \| `right-bottom` | -| `primaryColor` | `string` | ❌ | `"#4F46E5"` | 主色调(适用于按钮/用户气泡/链接) | -| `launcherIcon` | `string` | ❌ | SVG 图标 | 悬浮按钮图标(URL 或 SVG 字符串) | -| `showClear` | `boolean` | ❌ | `true` | 是否显示清空对话按钮 | -| `showAdminPanel` | `boolean` | ❌ | `false` | 是否显示管理面板 | -| `streaming` | `boolean` | ❌ | `true` | 是否启用 SSE 流式输出 | -| `locale` | `string` | ❌ | `"zh-CN"` | 界面语言(预留) | -| `debug` | `boolean` | ❌ | `true` | 是否输出调试日志 | - ---- - -## 三、公开 API - -| 方法 | 说明 | -|------|------| -| `ChatbotSDK.init(config)` | 初始化 SDK | -| `ChatbotSDK.destroy()` | 销毁实例(清理 DOM + 样式 + 事件) | -| `ChatbotSDK.open()` | 打开聊天窗口 | -| `ChatbotSDK.close()` | 关闭聊天窗口 | -| `ChatbotSDK.toggle()` | 切换窗口显示/隐藏 | -| `ChatbotSDK.clearHistory()` | 清空当前会话 | - ---- - -## 四、完整接入示例 +### 完整配置接入 ```html ``` +### 集成到现有项目 + +SDK 产物位于 `client/dist/` 目录: + +| 文件 | 大小 | 说明 | +|------|------|------| +| `chatbot-sdk.js` | 93KB | 未压缩开发版(含 sourcemap) | +| `chatbot-sdk.min.js` | 45KB | 压缩生产版(gzip ~15KB) | + +**部署路径:** 将 `.min.js` 文件上传到后端 `static/sdk/` 目录或任意 CDN。 + --- -## 五、参数映射关系 +## 二、SDKConfig 完整参数 -SDK 入参与后端 API 参数对照: +| 参数 | 类型 | 必传 | 默认值 | 阶段 | 说明 | +|------|------|------|--------|------|------| +| `integrateId` | `string \| number` | ✅ | — | P0 | 集成标识 → 后端 `roleId`(客服角色 ID,决定 AI 人设和知识库范围) | +| `requestDomain` | `string` | ✅ | — | P0 | 后端 API 域名 | +| `userId` | `string` | ❌ | — | P0 | 宿主用户标识 → 后端 `accountId` | +| `roleId` | `number` | ❌ | — | P0 | 客服角色 ID | +| `categoryId` | `number` | ❌ | — | P1 | 默认知识库分类 | +| `showCategorySwitch` | `boolean` | ❌ | `false` | P1 | 是否显示知识库下拉切换 | +| `title` | `string` | ❌ | `"AI 智能助手"` | P0 | 弹窗标题 | +| `width` | `number` | ❌ | `380` | P0 | 弹窗宽度(px) | +| `position` | `string` | ❌ | `"right-bottom"` | P0 | 悬浮按钮位置 | +| `primaryColor` | `string` | ❌ | `"#4F46E5"` | P0 | 主色调 | +| `launcherIcon` | `string` | ❌ | SVG 图标 | P0 | 悬浮按钮图标 | +| `showClear` | `boolean` | ❌ | `true` | P0 | 是否显示清空按钮 | +| `streaming` | `boolean` | ❌ | `true` | P0 | 是否启用 SSE 流式输出 | +| `locale` | `string` | ❌ | `"zh-CN"` | P2 | 界面语言:`zh-CN` / `en` | +| `debug` | `boolean` | ❌ | `true` | P0 | 是否输出调试日志 | -| SDK 入参 | 后端参数 | 说明 | -|----------|----------|------| -| `integrateId` | `chatId` | 会话标识 + 数据隔离 key | -| `userId` | `accountId` | 宿主用户标识 | -| `roleId` | `roleId` | 客服角色 ID | -| `categoryId` | `categoryId` | 知识库分类过滤 | +--- + +## 三、公开 API + +| 方法 | 阶段 | 说明 | +|------|------|------| +| `ChatbotSDK.init(config)` | P0 | 初始化 SDK | +| `ChatbotSDK.destroy()` | P0 | 销毁实例(清理 DOM + 样式 + 事件) | +| `ChatbotSDK.open()` | P0 | 打开聊天窗口 | +| `ChatbotSDK.close()` | P0 | 关闭聊天窗口 | +| `ChatbotSDK.toggle()` | P0 | 切换窗口显示/隐藏 | +| `ChatbotSDK.clearHistory()` | P0 | 清空当前会话 | --- -## 六、对接的后端接口 +## 四、P1 体验增强功能 -### 同步对话 -``` -GET /ai/assistant_app/chat/sync - ?message={message} - &chatId={integrateId} - &accountId={userId} - &roleId={roleId} +### 4.1 SSE 流式打字机效果 + +默认开启(`streaming: true`),AI 回复逐字输出,支持: +- 流式追加到气泡,实时滚动到底部 +- 流中断兜底:保留已接收内容 + 灰色提示 +- 无流内容时自动降级为同步请求 + +### 4.2 Markdown 渲染 + +AI 回复支持 Markdown 格式渲染,包括: +- 代码块(深色背景 ` ``` ` 语法) +- 行内代码(`` `code` ``) +- 标题(`##` `###` 等) +- 粗体(`**text**`)、斜体(`*text*`)、删除线(`~~text~~`) +- 有序/无序列表 +- 链接(`[text](url)`,仅允许 http/https 协议) +- 引用块(`>` ) +- 水平线(`---`) + +> **XSS 安全**:所有非代码块内容先转义 HTML,再转换 Markdown 语法为安全 HTML 标签。代码块内容同样转义。 + +### 4.3 知识库联动 + +开启 `showCategorySwitch: true` 后,输入区上方出现知识库分类下拉框: + +```html +ChatbotSDK.init({ + integrateId: 'my-app', + requestDomain: 'https://ai.example.com', + showCategorySwitch: true, // 显示分类下拉框 + categoryId: 5, // 默认选中分类 +}); ``` -### SSE 流式对话 +- 选择分类后,后续对话自动走 RAG 增强接口(`/ai/assistant_app/chat/rag/sse`) +- 选择「全部分类」则走普通流式接口 +- 分类数据从 `/category/tree` 接口动态加载,支持树形缩进显示 + +### 4.4 RAG 引用来源展示 + +使用 RAG 对话后,AI 气泡底部自动展示引用来源卡片: + ``` -GET /ai/assistant_app/chat/sse - ?message={message} - &chatId={integrateId} - &accountId={userId} - &roleId={roleId} +┌─────────────────────────────────┐ +│ 📚 3 条参考来源 ▼ │ +├─────────────────────────────────┤ +│ 员工手册.pdf │ +│ 员工可以享受年假... │ +│ 员工手册.pdf · 分块 #3 · 85% │ +│ │ +│ HR制度.md │ +│ 年假计算规则如下... │ +│ HR制度.md · 分块 #1 · 72% │ +└─────────────────────────────────┘ ``` -### RAG 增强对话(P1 阶段启用) +- 默认折叠,只显示标题行,点击展开/折叠 +- 显示文档名称、摘要、来源文件、分块编号、相关度 +- 来源数据从 `/ai/assistant_app/rag/sources` 接口获取 + +--- + +## 五、P2 运营完善功能 + +### 5.1 多语言国际化 + +支持 `zh-CN`(中文)和 `en`(英文)两种语言: + +```html +ChatbotSDK.init({ + integrateId: 'my-app', + requestDomain: 'https://ai.example.com', + locale: 'en', // 英文界面 +}); ``` -GET /ai/assistant_app/chat/rag/sse - ?message={message} - &chatId={integrateId} - &categoryId={categoryId} - &rewriteStrategy=REWRITE + +国际化覆盖范围: +- 弹窗标题、输入框占位符、发送按钮 +- 最小化/关闭按钮提示 +- 清空对话按钮及确认弹窗 +- Loading 状态文字 +- 所有错误提示(网络/超时/服务器/跨域等) +- 知识库下拉框默认选项 +- RAG 引用来源标题 +- 历史会话面板文本 + +### 5.2 会话管理面板 + +弹窗头部新增时钟图标按钮,点击展开历史会话面板: +- 展示当前用户的历史会话列表(从 `/conversation/list` 接口获取) +- 支持导出会话(下载文本文件) +- 支持删除会话(二次确认) +- 空状态提示 + +### 5.3 控制台日志体系 + +SDK 全流程结构化日志,带 `[ChatbotSDK]` 前缀: + +| 生命周期 | 日志内容 | +|----------|---------| +| `init()` | `初始化完成 integrateId={} requestDomain={}` | +| `sendMessage()` | `发送消息 integrateId={} length={}` | +| `收到回复` | `AI 回复 integrateId={} length={} duration={}ms` | +| `流式完成` | `流式回复完成 integrateId={} length={} duration={}ms` | +| `请求失败` | `请求失败 integrateId={} status={} message={}` | +| `clearHistory()` | `清空会话 integrateId={}` | +| `destroy()` | `销毁实例 integrateId={}` | +| `分类切换` | `切换知识库分类 categoryId={}` | + +- `config.debug = false` 关闭 info/warn 日志,error 始终输出 +- 内置性能计时器,自动记录 AI 回复耗时 + +--- + +## 六、对接的后端接口 + +### P0 — 基础对话 +``` +GET /ai/assistant_app/chat/sync +GET /ai/assistant_app/chat/sse ``` -### RAG 引用来源(P1 阶段启用) +### P1 — 知识库联动 ``` -GET /ai/assistant_app/rag/sources - ?message={message} - &chatId={integrateId} - &categoryId={categoryId} +GET /ai/assistant_app/chat/rag/sse # RAG 增强流式对话 +GET /ai/assistant_app/rag/sources # RAG 引用来源 +GET /category/tree # 分类树(下拉框数据源) +GET /category/list # 分类列表 ``` -### 分类列表(P1 阶段启用) +### P2 — 会话管理 ``` -GET /category/list -GET /category/tree +GET /conversation/list # 会话列表 +GET /conversation/{id}/messages # 会话消息 +DELETE /conversation/{id} # 删除会话 +GET /conversation/{id}/export # 导出会话 ``` --- -## 七、CSS 命名空间隔离 +## 七、参数映射关系 + +**核心映射(SDK → 后端):** + +| SDK 入参 | 后端参数 | 说明 | +|----------|----------|------| +| `integrateId` | `roleId` | 客服角色 ID(决定 AI 人设和知识库检索范围) | +| `userId` | `accountId` | 客户账号 ID(账号可绑定角色,绑定后服务端覆盖 roleId) | +| (自动管理) | `chatId` | 对话 ID(自动从 `/conversation/list` 获取或生成,格式 `sdk_时间戳_随机串`) | + +**chatId 自动管理逻辑:** +1. SDK 初始化时,查询 `/conversation/list?accountId={userId}&roleId={integrateId}` +2. 有匹配会话 → 使用最新会话的 `conversationId` 作为 `chatId` +3. 无匹配会话 → 自动生成新 `chatId`(格式:`sdk_时间戳_随机串`) +4. `chatId` 缓存在 localStorage(key: `csk_chatId_{integrateId}_{userId}`) +5. `clearHistory()` 会生成新的 `chatId`,开始全新对话 + +--- + +## 八、CSS 命名空间隔离 所有 DOM 元素的 class/id 均使用 `csk-` 前缀,不会与宿主页面样式冲突: @@ -173,13 +273,15 @@ GET /category/tree | 消息区 | `#csk-messages` `.csk-messages` | | 输入框 | `#csk-input` `.csk-input` | | 发送按钮 | `#csk-send-btn` `.csk-send-btn` | +| 知识库下拉 | `#csk-category-select` `.csk-category-select` | +| 历史面板 | `.csk-history-panel` | | 样式标签 | `style[data-csk-sdk]` | z-index 分层:悬浮按钮 9998,弹窗 9999。 --- -## 八、localStorage 缓存 +## 九、localStorage 缓存 缓存 key 格式:`csk_history_{integrateId}` @@ -191,7 +293,8 @@ z-index 分层:悬浮按钮 9998,弹窗 9999。 "id": "uuid", "role": "user|ai", "content": "消息内容", - "timestamp": 1700000000000 + "timestamp": 1700000000000, + "sources": [] } ], "updatedAt": 1700000000000 @@ -201,40 +304,39 @@ z-index 分层:悬浮按钮 9998,弹窗 9999。 - 消息上限 200 条,超出自动裁剪最早 50 条 - 按 `integrateId` 隔离,不同接入方互不影响 - `init()` 时自动恢复历史消息 -- `clearHistory()` 清空本地缓存 +- RAG 引用来源同步缓存到 `sources` 字段 --- -## 九、错误处理 +## 十、错误处理 所有错误不抛异常、不阻塞宿主页面,仅 `console.error` 输出。 -| 错误场景 | 提示信息 | -|----------|----------| -| 缺失 `integrateId` | `integrateId 是必传参数` | -| 缺失 `requestDomain` | `requestDomain 是必传参数` | -| 非法 URL | `requestDomain 不是合法的 URL 格式` | -| 网络断开 | `网络连接失败,请检查网络` | -| 请求超时 | `请求超时,请稍后重试`(超时时间 30s) | -| HTTP 401 | `鉴权失败,请联系管理员` | -| HTTP 403 | `无访问权限,请联系管理员配置` | -| HTTP 500 | `服务器异常,请稍后重试` | -| 跨域阻断 | `跨域请求被拦截,请联系管理员将当前域名加入 API 白名单` | -| localStorage 满 | `localStorage 空间不足,会话历史保存失败` | +| 错误场景 | 中文提示 | 英文提示 | +|----------|---------|---------| +| 网络断开 | 网络连接失败,请检查网络 | Network connection failed | +| 请求超时 | 请求超时,请稍后重试 | Request timed out | +| HTTP 500 | 服务器异常,请稍后重试 | Server error | +| 跨域阻断 | 跨域请求被拦截... | CORS request blocked... | +| HTTP 401 | 鉴权失败,请联系管理员 | Authentication failed | +| HTTP 403 | 无访问权限 | Access denied | +| 流中断 | 回复被中断 | Response interrupted | --- -## 十、技术栈 +## 十一、技术栈 - **语言**:TypeScript → ES2017 - **打包**:Rollup → IIFE 格式 - **压缩**:Terser +- **Markdown**:内置轻量级渲染器(零外部依赖) +- **国际化**:内置 i18n 字典 - **浏览器兼容**:Chrome 70+, Firefox 70+, Safari 13+, Edge 79+ -- **产物大小**:`.min.js` ~22KB(gzip ~8KB) +- **产物大小**:`.min.js` ~45KB(gzip ~15KB) --- -## 十一、开发与构建 +## 十二、开发与构建 ```bash # 进入 SDK 工程目录 @@ -258,17 +360,16 @@ client/ │ ├── index.ts # 入口:window.ChatbotSDK 挂载 │ ├── types.ts # TypeScript 类型定义 │ ├── config.ts # 配置解析 + 参数校验 -│ ├── logger.ts # 日志模块 +│ ├── logger.ts # 日志模块(P2 增强:计时+生命周期) │ ├── storage.ts # localStorage 封装 -│ ├── api.ts # HTTP 封装 + SSE 流式 -│ ├── dom.ts # DOM 构建 + 拖拽 -│ ├── styles.ts # CSS 注入 + 主题定制 -│ ├── chat.ts # 对话核心 +│ ├── api.ts # HTTP 封装 + SSE 流式 + P1 RAG + P2 会话 +│ ├── dom.ts # DOM 构建 + 拖拽 + P1 来源/分类 + P2 面板 +│ ├── styles.ts # CSS 注入 + 主题 + P1 Markdown/来源 + P2 面板 +│ ├── chat.ts # 对话核心 + P1 Markdown/RAG + P2 i18n +│ ├── markdown.ts # P1 轻量级 Markdown 渲染器 +│ ├── i18n.ts # P2 多语言国际化 │ └── utils.ts # UUID、防抖、XSS 转义 ├── dist/ # 构建产物 -│ ├── chatbot-sdk.js -│ ├── chatbot-sdk.min.js -│ └── *.map ├── package.json ├── tsconfig.json ├── rollup.config.js @@ -277,23 +378,25 @@ client/ --- -## 十二、P0 → P1 → P2 路线图 +## 十三、功能路线图 | 阶段 | 状态 | 内容 | |------|------|------| | **P0 核心链路** | ✅ 已完成 | 项目骨架、配置校验、样式注入、悬浮按钮+弹窗、HTTP 通信、对话核心、本地缓存、打包构建 | -| **P1 体验增强** | 🔜 待开发 | SSE 流式打字机效果、知识库下拉切换、RAG 引用来源展示、UI 全配置化、Markdown 渲染、弹窗拖拽 | -| **P2 运营完善** | 🔜 待开发 | 会话管理面板、控制台日志体系、多语言国际化、知识库管理嵌入 | +| **P1 体验增强** | ✅ 已完成 | SSE 流式打字机、Markdown 渲染、知识库下拉切换、RAG 引用来源展示、UI 全配置化、弹窗拖拽 | +| **P2 运营完善** | ✅ 已完成 | 多语言国际化(zh-CN/en)、控制台日志体系、会话管理面板(列表/导出/删除) | +| **可选扩展** | 🔜 待定 | 知识库管理嵌入(`showAdminPanel`)、更多语言、主题皮肤 | --- -## 十三、验证测试 +## 十四、验证测试 访问 `http://localhost:9090/sdk/test.html` 运行自动化验证。 -测试覆盖: -1. ✅ `window.ChatbotSDK` 全局挂载 -2. ✅ 配置校验(必传参数 + 默认值 + 错误提示) -3. ✅ DOM 挂载(悬浮按钮 + 弹窗 + 输入框 + 样式注入) -4. ✅ localStorage 缓存读写 -5. ✅ 与后端 API 的实际对话(需后端运行) +测试覆盖(22 个用例): + +| 编号 | 阶段 | 功能 | +|------|------|------| +| T1-T13 | P0 | 全局挂载、参数校验、DOM 创建、open/close、默认值、主题色、位置、destroy、缓存、API 对话 | +| T14-T19 | P1 | Markdown 样式、知识库分类切换、RAG 来源样式、RAG SSE 接口、RAG 来源接口、分类树接口 | +| T20-T22 | P2 | 多语言国际化、会话管理面板、会话列表接口 | diff --git a/client/dist/chatbot-sdk.js b/client/dist/chatbot-sdk.js index 23eb255..8273324 100644 --- a/client/dist/chatbot-sdk.js +++ b/client/dist/chatbot-sdk.js @@ -7,14 +7,16 @@ var ChatbotSDK = (function () { function setDebug(enabled) { debugEnabled = enabled; } + /** 性能计时器 */ + const timers = {}; const logger = { - /** 普通信息日志 */ + /** 普通信息日志(受 debug 开关控制) */ info(msg, data) { if (debugEnabled) { console.log(PREFIX, msg, data !== undefined ? data : ''); } }, - /** 警告日志 */ + /** 警告日志(受 debug 开关控制) */ warn(msg, data) { if (debugEnabled) { console.warn(PREFIX, msg, data !== undefined ? data : ''); @@ -24,6 +26,60 @@ var ChatbotSDK = (function () { error(msg, data) { console.error(PREFIX, msg, data !== undefined ? data : ''); }, + /** 开始计时 */ + time(label) { + timers[label] = Date.now(); + }, + /** 结束计时并输出日志 */ + timeEnd(label, prefix) { + const start = timers[label]; + if (start !== undefined) { + const duration = Date.now() - start; + delete timers[label]; + if (debugEnabled) { + const msg = prefix ? `${prefix} ${duration}ms` : `${label} ${duration}ms`; + console.log(PREFIX, msg); + } + return duration; + } + return 0; + }, + /** 生命周期日志:init */ + lifecycleInit(integrateId, requestDomain) { + this.info(`初始化完成 integrateId=${integrateId} requestDomain=${requestDomain}`); + }, + /** 生命周期日志:destroy */ + lifecycleDestroy(integrateId) { + this.info(`销毁实例 integrateId=${integrateId}`); + }, + /** 生命周期日志:sendMessage */ + lifecycleSend(integrateId, length) { + this.info(`发送消息 integrateId=${integrateId} length=${length}`); + this.time(`send_${integrateId}`); + }, + /** 生命周期日志:收到回复 */ + lifecycleReply(integrateId, length) { + const duration = this.timeEnd(`send_${integrateId}`, 'AI 回复'); + this.info(`AI 回复 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + /** 生命周期日志:请求失败 */ + lifecycleError(integrateId, status, message) { + this.timeEnd(`send_${integrateId}`); + this.error(`请求失败 integrateId=${integrateId} status=${status} message=${message}`); + }, + /** 生命周期日志:清空会话 */ + lifecycleClear(integrateId) { + this.info(`清空会话 integrateId=${integrateId}`); + }, + /** 生命周期日志:流式回复完成 */ + lifecycleStreamDone(integrateId, length) { + const duration = this.timeEnd(`send_${integrateId}`, '流式回复'); + this.info(`流式回复完成 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + /** 生命周期日志:知识库切换 */ + lifecycleCategoryChange(categoryId) { + this.info(`切换知识库分类 categoryId=${categoryId}`); + }, }; /** 默认悬浮按钮 SVG 图标(客服对话气泡) */ @@ -36,14 +92,15 @@ var ChatbotSDK = (function () { */ function parseConfig(raw) { var _a, _b, _c, _d, _e, _f; - // 校验必传参数:integrateId - if (!raw.integrateId || typeof raw.integrateId !== 'string' || raw.integrateId.trim() === '') { - logger.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + // 校验必传参数:integrateId(对应后端 roleId) + if (!raw.integrateId || (typeof raw.integrateId !== 'string' && typeof raw.integrateId !== 'number') + || (typeof raw.integrateId === 'string' && raw.integrateId.trim() === '')) { + logger.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'); return null; } // 校验必传参数:requestDomain if (!raw.requestDomain || typeof raw.requestDomain !== 'string' || raw.requestDomain.trim() === '') { - logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'); return null; } // 校验 requestDomain 是否为合法 URL 格式 @@ -54,12 +111,13 @@ var ChatbotSDK = (function () { logger.error(`requestDomain 不是合法的 URL 格式:${raw.requestDomain}。请提供完整的域名,如 https://api.example.com`); return null; } + // integrateId 统一转为字符串(后端 roleId 为 Long,但 query param 传字符串也可接收) + const integrateIdStr = String(raw.integrateId).trim(); // 填充默认值 const config = { - integrateId: raw.integrateId.trim(), + integrateId: integrateIdStr, requestDomain: raw.requestDomain.replace(/\/+$/, ''), // 去掉末尾斜杠 userId: raw.userId, - roleId: raw.roleId, categoryId: raw.categoryId, showCategorySwitch: (_a = raw.showCategorySwitch) !== null && _a !== void 0 ? _a : false, title: raw.title || 'AI 智能助手', @@ -72,11 +130,140 @@ var ChatbotSDK = (function () { streaming: (_e = raw.streaming) !== null && _e !== void 0 ? _e : true, locale: raw.locale || 'zh-CN', debug: (_f = raw.debug) !== null && _f !== void 0 ? _f : true, + chatId: '', // 初始为空,由 chatId 初始化流程填充 }; - logger.info(`配置解析完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + logger.info(`配置解析完成 integrateId(=roleId)=${config.integrateId} userId(=accountId)=${config.userId || '(未设置)'} requestDomain=${config.requestDomain}`); return config; } + /** + * 多语言国际化模块 - i18n 字典 + 翻译函数 + */ + /** 语言包字典 */ + const dictionaries = { + 'zh-CN': { + // 头部 + title: 'AI 智能助手', + minimize: '最小化', + close: '关闭', + // 输入区 + placeholder: '输入您的问题...', + send: '发送', + // 消息 + loading: '正在思考...', + stream_interrupted: '回复被中断', + stream_unstable: '网络不稳定,内容可能不完整', + // 知识库 + category_placeholder: '选择知识库分类', + category_all: '全部分类', + category_load_error: '加载分类失败', + source_title: '参考来源', + source_count: '{n} 条参考来源', + source_loading: '加载来源中...', + // 清空/管理 + clear: '清空对话', + clear_confirm: '确定清空所有对话记录?', + // 历史会话 + history_title: '历史会话', + history_empty: '暂无历史会话', + history_load_error: '加载会话列表失败', + history_delete_confirm: '确定删除该会话?', + history_export: '导出', + history_delete: '删除', + // 错误提示 + error_network: '网络连接失败,请检查网络', + error_timeout: '请求超时,请稍后重试', + error_server: '服务器异常,请稍后重试', + error_cors: '跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', + error_auth: '鉴权失败,请联系管理员', + error_forbidden: '无访问权限,请联系管理员配置', + error_not_found: '请求的资源不存在', + error_rate_limit: '请求过于频繁,请稍后重试', + error_unavailable: '服务暂不可用,请稍后重试', + error_unknown: '请求发生未知错误', + error_send: '发送失败,请稍后重试', + error_stream_unsupported: '浏览器不支持流式读取', + }, + 'en': { + // Header + title: 'AI Assistant', + minimize: 'Minimize', + close: 'Close', + // Input + placeholder: 'Type your question...', + send: 'Send', + // Messages + loading: 'Thinking...', + stream_interrupted: 'Response interrupted', + stream_unstable: 'Network unstable, content may be incomplete', + // Knowledge base + 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/Management + clear: 'Clear chat', + clear_confirm: 'Clear all conversation history?', + // 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', + // Errors + 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 currentLocale = 'zh-CN'; + /** + * 设置当前语言 + */ + function setLocale(locale) { + if (dictionaries[locale]) { + currentLocale = locale; + } + else { + // 尝试匹配语言前缀(如 zh -> zh-CN) + const prefix = locale.split('-')[0]; + const matched = Object.keys(dictionaries).find(k => k.startsWith(prefix)); + if (matched) { + currentLocale = matched; + } + // 未匹配则保持默认 zh-CN + } + } + /** + * 获取翻译文本 + * @param key 翻译 key + * @param params 插值参数,如 { n: 3 } 替换 {n} + */ + function t(key, params) { + const dict = dictionaries[currentLocale] || dictionaries['zh-CN']; + let text = dict[key] || dictionaries['zh-CN'][key] || key; + // 简单插值替换:{n} → 实际值 + if (params) { + for (const [k, v] of Object.entries(params)) { + text = text.replace(`{${k}}`, String(v)); + } + } + return text; + } + /** 请求超时时间(毫秒) */ const REQUEST_TIMEOUT = 30000; let currentConfig = null; @@ -84,6 +271,16 @@ var ChatbotSDK = (function () { function setApiConfig(config) { currentConfig = config; } + /** 更新当前 chatId(对话 ID) */ + function updateChatId(chatId) { + if (currentConfig) { + currentConfig.chatId = chatId; + } + } + /** 获取当前 chatId */ + function getChatId() { + return (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.chatId) || ''; + } /** 构建完整请求 URL,自动防御双斜杠 */ function buildUrl(path) { if (!currentConfig) { @@ -93,36 +290,72 @@ var ChatbotSDK = (function () { const cleanPath = path.startsWith('/') ? path : `/${path}`; return `${domain}${cleanPath}`; } - /** 构建同步对话请求 URL */ + /** + * 安全设置可选参数:仅当 value 非空时追加 + */ + function setIfPresent(params, key, value) { + if (value === undefined || value === null) + return; + if (typeof value === 'string' && value.trim() === '') + return; + params.set(key, String(value)); + } + // ==================== 对话接口 URL 构建 ==================== + /** + * 构建同步对话请求 URL + * - integrateId → roleId + * - userId → accountId + * - chatId → 自动管理的对话 ID + */ function buildChatUrl(message) { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig.integrateId); + params.set('chatId', currentConfig.chatId); + // integrateId 映射为 roleId + setIfPresent(params, 'roleId', currentConfig.integrateId); + // userId 映射为 accountId setIfPresent(params, 'accountId', currentConfig.userId); - setIfPresent(params, 'roleId', currentConfig.roleId); - setIfPresent(params, 'categoryId', currentConfig.categoryId); return buildUrl(`/ai/assistant_app/chat/sync?${params.toString()}`); } - /** 构建 SSE 流式请求 URL */ - function buildChatSSEUrl(message) { + /** + * 构建 SSE 流式请求 URL + */ + function buildChatSSEUrl(message, categoryId) { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig.integrateId); + params.set('chatId', currentConfig.chatId); + setIfPresent(params, 'roleId', currentConfig.integrateId); setIfPresent(params, 'accountId', currentConfig.userId); - setIfPresent(params, 'roleId', currentConfig.roleId); - setIfPresent(params, 'categoryId', currentConfig.categoryId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); return buildUrl(`/ai/assistant_app/chat/sse?${params.toString()}`); } /** - * 安全设置可选参数:仅当 value 非空时追加,数字类型直接转字符串 + * 构建 RAG 增强流式请求 URL */ - function setIfPresent(params, key, value) { - if (value === undefined || value === null) - return; - if (typeof value === 'string' && value.trim() === '') - return; - params.set(key, String(value)); + function buildChatRAGSSEUrl(message, categoryId) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.chatId); + params.set('rewriteStrategy', 'REWRITE'); + setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'accountId', currentConfig.userId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); + return buildUrl(`/ai/assistant_app/chat/rag/sse?${params.toString()}`); + } + /** + * 构建 RAG 引用来源请求 URL + */ + function buildRagSourcesUrl(message, categoryId) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.chatId); + params.set('rewriteStrategy', 'REWRITE'); + setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'accountId', currentConfig.userId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); + return buildUrl(`/ai/assistant_app/rag/sources?${params.toString()}`); } + // ==================== HTTP 基础封装 ==================== /** 带超时的 fetch 封装 */ async function safeFetch(url, options = {}, timeout = REQUEST_TIMEOUT) { const controller = new AbortController(); @@ -133,12 +366,12 @@ var ChatbotSDK = (function () { } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') { - throw new CskError('请求超时,请稍后重试', 'timeout'); + throw new CskError(t('error_timeout'), 'timeout'); } if (err instanceof TypeError && err.message.includes('Failed to fetch')) { - throw new CskError('跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', 'cors'); + throw new CskError(t('error_cors'), 'cors'); } - throw new CskError('网络连接失败,请检查网络', 'network'); + throw new CskError(t('error_network'), 'network'); } finally { clearTimeout(timer); @@ -152,77 +385,67 @@ var ChatbotSDK = (function () { this.type = type; } } - /** 根据 HTTP 状态码返回对应的中文错误消息 */ + /** 根据 HTTP 状态码返回对应的国际化错误消息 */ function getHttpErrorMessage(status) { switch (status) { - case 401: - return '鉴权失败,请联系管理员'; - case 403: - return '无访问权限,请联系管理员配置'; - case 404: - return '请求的资源不存在'; - case 429: - return '请求过于频繁,请稍后重试'; - case 500: - return '服务器异常,请稍后重试'; + case 401: return t('error_auth'); + case 403: return t('error_forbidden'); + case 404: return t('error_not_found'); + case 429: return t('error_rate_limit'); + case 500: return t('error_server'); case 502: - case 503: - return '服务暂不可用,请稍后重试'; - default: - return `请求失败(状态码 ${status})`; + case 503: return t('error_unavailable'); + default: return `${t('error_unknown')}(${status})`; } } + // ==================== 对话请求 ==================== /** * 同步对话请求 */ async function chatRequest(message) { const url = buildChatUrl(message); - const startTime = Date.now(); - logger.info(`发送消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig.integrateId, message.length); try { const response = await safeFetch(url); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); throw new CskError(errorMsg, `http_${response.status}`); } const text = await response.text(); - const duration = Date.now() - startTime; - logger.info(`AI 回复 integrateId=${currentConfig.integrateId} length=${text.length} duration=${duration}ms`); + logger.lifecycleReply(currentConfig.integrateId, text.length); return text; } catch (err) { - if (err instanceof CskError) { + if (err instanceof CskError) throw err; - } - logger.error(`请求异常 integrateId=${currentConfig.integrateId}`, err); - throw new CskError('请求发生未知错误', 'unknown'); + logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + throw new CskError(t('error_unknown'), 'unknown'); } } /** * SSE 流式对话请求 - * @param message 用户消息 - * @param onChunk 每次收到文本片段的回调 - * @param onDone 流结束时的回调 - * @param onError 发生错误时的回调 + * @param useRag 是否使用 RAG 增强对话 + * @param categoryId 知识库分类 ID */ - async function chatSSERequest(message, onChunk, onDone, onError) { + async function chatSSERequest(message, onChunk, onDone, onError, categoryId, useRag) { var _a; - const url = buildChatSSEUrl(message); - const startTime = Date.now(); + const url = useRag + ? buildChatRAGSSEUrl(message, categoryId) + : buildChatSSEUrl(message, categoryId); let totalText = ''; - logger.info(`发送流式消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig.integrateId, message.length); try { - const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); // SSE 超时更长 + const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`流式请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); onError(new CskError(errorMsg, `http_${response.status}`)); return; } const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader(); if (!reader) { - onError(new CskError('浏览器不支持流式读取', 'stream_unsupported')); + onError(new CskError(t('error_stream_unsupported'), 'stream_unsupported')); return; } const decoder = new TextDecoder('utf-8', { stream: true }); @@ -230,22 +453,15 @@ var ChatbotSDK = (function () { try { while (true) { const { done, value } = await reader.read(); - if (done) { + if (done) break; - } - // 解码并追加到 buffer buffer += decoder.decode(value, { stream: true }); - // 按行解析 SSE 数据 const lines = buffer.split('\n'); - // 最后一行可能不完整,保留到下次 buffer = lines.pop() || ''; for (const line of lines) { const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith(':')) { - // 跳过空行和 SSE 注释 + if (!trimmed || trimmed.startsWith(':')) continue; - } - // 解析 "data: xxx" 格式 if (trimmed.startsWith('data:')) { const data = trimmed.substring(5).trim(); if (data) { @@ -254,17 +470,14 @@ var ChatbotSDK = (function () { } } else if (trimmed === '[DONE]') { - // 流结束标记(OpenAI 风格,此处做兼容) break; } else if (!trimmed.startsWith('event:') && !trimmed.startsWith('id:') && !trimmed.startsWith('retry:')) { - // 可能是 Flux 裸文本格式(无 data: 前缀) totalText += trimmed; onChunk(trimmed); } } } - // 处理 buffer 中剩余的数据 if (buffer.trim()) { const trimmed = buffer.trim(); if (trimmed.startsWith('data:')) { @@ -281,9 +494,8 @@ var ChatbotSDK = (function () { } } catch (readErr) { - // 流中断不丢已接收的文本 if (totalText.length > 0) { - onChunk('\n\n[网络不稳定,内容可能不完整]'); + onChunk('\n\n' + t('stream_unstable')); } else { throw readErr; @@ -292,8 +504,7 @@ var ChatbotSDK = (function () { finally { reader.releaseLock(); } - const duration = Date.now() - startTime; - logger.info(`流式回复完成 integrateId=${currentConfig.integrateId} length=${totalText.length} duration=${duration}ms`); + logger.lifecycleStreamDone(currentConfig.integrateId, totalText.length); onDone(); } catch (err) { @@ -301,11 +512,206 @@ var ChatbotSDK = (function () { onError(err); } else { - logger.error(`流式请求异常 integrateId=${currentConfig.integrateId}`, err); - onError(new CskError('网络连接失败,请检查网络', 'network')); + logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + onError(new CskError(t('error_network'), 'network')); } } } + // ==================== P1: 知识库分类 ==================== + /** + * 获取知识库分类树 + */ + async function fetchCategoryTree() { + const url = buildUrl('/category/tree'); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`加载分类树成功 count=${json.data.length}`); + return json.data; + } + return []; + } + catch (err) { + if (err instanceof CskError) + logger.error(`加载分类树失败: ${err.message}`); + else + logger.error('加载分类树失败', err); + return []; + } + } + /** + * 获取 RAG 引用来源 + */ + async function fetchRagSources(message, categoryId) { + const url = buildRagSourcesUrl(message, categoryId); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`获取引用来源 count=${json.data.length}`); + return json.data; + } + return []; + } + catch (err) { + logger.error('获取引用来源失败', err); + return []; + } + } + /** + * 获取会话列表 + */ + async function fetchConversationList(page = 1, size = 20, accountId, roleId) { + let path = `/conversation/list?page=${page}&size=${size}`; + if (accountId) + path += `&accountId=${encodeURIComponent(accountId)}`; + if (roleId) + path += `&roleId=${encodeURIComponent(roleId)}`; + const url = buildUrl(path); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + return { + list: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + pages: json.pages || 0, + }; + } + catch (err) { + logger.error('加载会话列表失败', err); + return { list: [], total: 0, pages: 0 }; + } + } + /** + * 获取会话消息 + */ + async function fetchConversationMessages(conversationId) { + const url = buildUrl(`/conversation/${conversationId}/messages`); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + return { + messages: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + }; + } + catch (err) { + logger.error('加载会话消息失败', err); + return { messages: [], total: 0 }; + } + } + /** + * 删除会话 + */ + async function deleteConversation(conversationId) { + const url = buildUrl(`/conversation/${conversationId}`); + try { + const response = await safeFetch(url, { method: 'DELETE' }); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + logger.info(`删除会话 id=${conversationId} success=${json.success}`); + return json.success || false; + } + catch (err) { + logger.error('删除会话失败', err); + return false; + } + } + /** + * 导出会话 URL + */ + function getConversationExportUrl(conversationId) { + return buildUrl(`/conversation/${conversationId}/export`); + } + // ==================== chatId 自动初始化 ==================== + /** + * 初始化 chatId:查询后端已有会话,找到则复用,否则生成新的 + * + * 逻辑: + * 1. 先查 localStorage 缓存的 chatId(同一 integrateId + userId 可能复用) + * 2. 查 /conversation/list?accountId=X&roleId=Y 看是否有匹配的会话 + * 3. 有会话 → 使用最新会话的 conversationId 作为 chatId + * 4. 无会话 → 自动生成 chatId(格式:sdk_timestamp_random) + */ + async function initChatId() { + if (!currentConfig) + return ''; + // 1. 先尝试从 localStorage 恢复 + const cachedChatId = loadCachedChatId(currentConfig.integrateId, currentConfig.userId); + if (cachedChatId) { + currentConfig.chatId = cachedChatId; + logger.info(`从缓存恢复 chatId=${cachedChatId}`); + return cachedChatId; + } + // 2. 查询后端会话列表 + try { + const result = await fetchConversationList(1, 5, currentConfig.userId, currentConfig.integrateId); + if (result.list.length > 0) { + // 使用最新会话的 conversationId 作为 chatId + const latestConv = result.list[0]; + const chatId = latestConv.conversationId || latestConv.chatId || ''; + if (chatId) { + currentConfig.chatId = chatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, chatId); + logger.info(`从后端恢复会话 chatId=${chatId} messageCount=${latestConv.messageCount}`); + return chatId; + } + } + } + catch (err) { + logger.warn('查询后端会话列表失败,将生成新 chatId', err); + } + // 3. 生成新的 chatId + const newChatId = generateChatId(); + currentConfig.chatId = newChatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, newChatId); + logger.info(`生成新 chatId=${newChatId}`); + return newChatId; + } + /** 生成 chatId(格式:sdk_timestamp_random) */ + function generateChatId() { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; + } + /** localStorage key 格式 */ + function chatIdStorageKey(integrateId, userId) { + return `csk_chatId_${integrateId}${userId ? '_' + userId : ''}`; + } + /** 从 localStorage 加载 chatId */ + function loadCachedChatId(integrateId, userId) { + try { + return localStorage.getItem(chatIdStorageKey(integrateId, userId)) || ''; + } + catch (_a) { + return ''; + } + } + /** 保存 chatId 到 localStorage */ + function saveCachedChatId(integrateId, userId, chatId) { + try { + if (chatId) { + localStorage.setItem(chatIdStorageKey(integrateId, userId), chatId); + } + else { + localStorage.removeItem(chatIdStorageKey(integrateId, userId)); + } + } + catch (_a) { + // localStorage 不可用则忽略 + } + } let styleElement = null; /** CSS 变量:将配置中的主题色转换为 CSS 自定义属性 */ @@ -601,6 +1007,366 @@ var ChatbotSDK = (function () { color: #DC2626; } +/* ========== P1: 知识库分类下拉 ========== */ +.csk-category-bar { + display: flex; + align-items: center; + padding: 6px 12px; + border-top: 1px solid #E5E7EB; + background: #F9FAFB; + gap: 8px; +} +.csk-category-bar__label { + font-size: 12px; + color: #6B7280; + white-space: nowrap; +} +.csk-category-select { + flex: 1; + padding: 5px 8px; + border: 1px solid #E5E7EB; + border-radius: 6px; + font-size: 12px; + color: #374151; + background: #fff; + outline: none; + cursor: pointer; + font-family: inherit; + transition: border-color 0.2s; + max-width: 200px; +} +.csk-category-select:focus { + border-color: var(--csk-primary); +} + +/* ========== P1: RAG 引用来源卡片 ========== */ +.csk-sources { + margin-top: 8px; + border: 1px solid #E5E7EB; + border-radius: 8px; + overflow: hidden; + font-size: 12px; + max-width: 100%; +} +.csk-sources__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + background: #F9FAFB; + cursor: pointer; + user-select: none; + transition: background 0.15s; +} +.csk-sources__header:hover { + background: #F3F4F6; +} +.csk-sources__title { + display: flex; + align-items: center; + gap: 4px; + font-weight: 500; + color: #374151; +} +.csk-sources__arrow { + transition: transform 0.2s; + color: #9CA3AF; +} +.csk-sources--collapsed .csk-sources__arrow { + transform: rotate(-90deg); +} +.csk-sources__body { + border-top: 1px solid #E5E7EB; + padding: 0; +} +.csk-sources--collapsed .csk-sources__body { + display: none; +} +.csk-source-item { + padding: 8px 12px; + border-bottom: 1px solid #F3F4F6; + transition: background 0.15s; +} +.csk-source-item:last-child { + border-bottom: none; +} +.csk-source-item:hover { + background: #F9FAFB; +} +.csk-source-item__name { + font-weight: 500; + color: #1F2937; + margin-bottom: 2px; +} +.csk-source-item__snippet { + color: #6B7280; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.csk-source-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} + +/* ========== P1: Markdown 渲染样式 ========== */ +.csk-msg--ai .csk-msg__bubble .csk-md-p { + margin: 0 0 8px; +} +.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { + margin-bottom: 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1, +.csk-msg--ai .csk-msg__bubble .csk-md-h2, +.csk-msg--ai .csk-msg__bubble .csk-md-h3, +.csk-msg--ai .csk-msg__bubble .csk-md-h4, +.csk-msg--ai .csk-msg__bubble .csk-md-h5, +.csk-msg--ai .csk-msg__bubble .csk-md-h6 { + margin: 12px 0 6px; + font-weight: 600; + line-height: 1.3; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; } + +.csk-md-code-block { + background: #1E293B; + color: #E2E8F0; + padding: 12px 14px; + border-radius: 8px; + overflow-x: auto; + margin: 8px 0; + font-size: 13px; + line-height: 1.5; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-md-code-block code { + background: none; + padding: 0; + border-radius: 0; + font-size: inherit; + color: inherit; +} +.csk-md-inline-code { + background: #E5E7EB; + color: #DC2626; + padding: 1px 6px; + border-radius: 4px; + font-size: 13px; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul, +.csk-msg--ai .csk-msg__bubble .csk-md-ol { + padding-left: 20px; + margin: 6px 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul li, +.csk-msg--ai .csk-msg__bubble .csk-md-ol li { + margin-bottom: 4px; +} +.csk-md-blockquote { + border-left: 3px solid var(--csk-primary); + padding-left: 12px; + margin: 8px 0; + color: #6B7280; +} +.csk-md-link { + color: var(--csk-primary); + text-decoration: none; +} +.csk-md-link:hover { + text-decoration: underline; +} +.csk-md-hr { + border: none; + border-top: 1px solid #E5E7EB; + margin: 12px 0; +} + +/* ========== P2: 会话管理面板 ========== */ +.csk-history-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + border-radius: 6px; + transition: background 0.15s; +} +.csk-history-btn:hover { + background: rgba(255, 255, 255, 0.2); +} +.csk-history-panel { + position: absolute; + top: 48px; + left: 0; + right: 0; + bottom: 0; + background: #fff; + z-index: 10; + display: flex; + flex-direction: column; + overflow: hidden; +} +.csk-history-panel--hidden { + display: none; +} +.csk-history-panel__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + border-bottom: 1px solid #E5E7EB; + background: #F9FAFB; +} +.csk-history-panel__title { + font-size: 14px; + font-weight: 600; + color: #1F2937; +} +.csk-history-panel__back { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + border: 1px solid #E5E7EB; + border-radius: 6px; + background: #fff; + color: #374151; + font-size: 12px; + cursor: pointer; + transition: all 0.15s; +} +.csk-history-panel__back:hover { + background: #F3F4F6; +} +.csk-history-panel__list { + flex: 1; + overflow-y: auto; + padding: 8px; +} +.csk-history-panel__list::-webkit-scrollbar { + width: 4px; +} +.csk-history-panel__list::-webkit-scrollbar-thumb { + background: #E5E7EB; + border-radius: 2px; +} +.csk-history-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + border-radius: 8px; + cursor: pointer; + transition: background 0.15s; + margin-bottom: 4px; +} +.csk-history-item:hover { + background: #F3F4F6; +} +.csk-history-item__info { + flex: 1; + min-width: 0; +} +.csk-history-item__id { + font-size: 13px; + font-weight: 500; + color: #1F2937; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-history-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} +.csk-history-item__actions { + display: flex; + gap: 4px; + margin-left: 8px; + opacity: 0; + transition: opacity 0.15s; +} +.csk-history-item:hover .csk-history-item__actions { + opacity: 1; +} +.csk-history-action { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 12px; + transition: all 0.15s; +} +.csk-history-action--export { + background: #EFF6FF; + color: #2563EB; +} +.csk-history-action--export:hover { + background: #DBEAFE; +} +.csk-history-action--delete { + background: #FEF2F2; + color: #DC2626; +} +.csk-history-action--delete:hover { + background: #FEE2E2; +} +.csk-history-panel__empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + color: #9CA3AF; + font-size: 13px; + text-align: center; +} +.csk-history-panel__empty-icon { + font-size: 32px; + margin-bottom: 8px; + opacity: 0.5; +} +.csk-history-panel__loading { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + color: #9CA3AF; + font-size: 13px; +} +.csk-history-panel__loadmore { + display: block; + width: 100%; + padding: 10px; + border: none; + background: #F9FAFB; + color: #6B7280; + font-size: 12px; + cursor: pointer; + text-align: center; + transition: background 0.15s; +} +.csk-history-panel__loadmore:hover { + background: #F3F4F6; +} + /* ========== 移动端适配 ========== */ @media (max-width: 480px) { .csk-window { @@ -658,6 +1424,17 @@ var ChatbotSDK = (function () { return v.toString(16); }); } + /** XSS 转义 - 防止用户输入中的 HTML 注入 */ + function escapeHtml(text) { + const map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + }; + return text.replace(/[&<>"']/g, (ch) => map[ch] || ch); + } /** 防抖函数 */ function debounce(fn, delay) { let timer = null; @@ -715,10 +1492,15 @@ var ChatbotSDK = (function () { titleEl.textContent = config.title; const actions = document.createElement('div'); actions.className = 'csk-header__actions'; + // 历史会话按钮(P2) + const historyBtn = document.createElement('button'); + historyBtn.className = 'csk-history-btn'; + historyBtn.setAttribute('title', t('history_title')); + historyBtn.innerHTML = ``; // 最小化按钮 const minimizeBtn = document.createElement('button'); minimizeBtn.className = 'csk-header__btn csk-header__btn--minimize'; - minimizeBtn.setAttribute('title', '最小化'); + minimizeBtn.setAttribute('title', t('minimize')); minimizeBtn.innerHTML = ``; minimizeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); @@ -726,11 +1508,12 @@ var ChatbotSDK = (function () { // 关闭按钮 const closeBtn = document.createElement('button'); closeBtn.className = 'csk-header__btn csk-header__btn--close'; - closeBtn.setAttribute('title', '关闭'); + closeBtn.setAttribute('title', t('close')); closeBtn.innerHTML = ``; closeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); }); + actions.appendChild(historyBtn); actions.appendChild(minimizeBtn); actions.appendChild(closeBtn); header.appendChild(titleEl); @@ -739,35 +1522,93 @@ var ChatbotSDK = (function () { const messagesContainer = document.createElement('div'); messagesContainer.id = 'csk-messages'; messagesContainer.className = 'csk-messages'; + // === 会话管理面板(P2,默认隐藏) === + const historyPanel = document.createElement('div'); + historyPanel.className = 'csk-history-panel csk-history-panel--hidden'; + historyPanel.innerHTML = ` +
+ ${t('history_title')} + +
+
+ `; + messagesContainer.appendChild(historyPanel); + // 历史面板返回按钮 + const backBtn = historyPanel.querySelector('#csk-history-back'); + if (backBtn) { + backBtn.addEventListener('click', () => { + historyPanel.classList.add('csk-history-panel--hidden'); + }); + } + // 历史按钮点击 + historyBtn.addEventListener('click', (e) => { + e.stopPropagation(); + const isHidden = historyPanel.classList.contains('csk-history-panel--hidden'); + historyPanel.classList.toggle('csk-history-panel--hidden'); + if (isHidden) { + // 触发自定义事件,通知加载会话列表 + windowEl.dispatchEvent(new CustomEvent('csk:loadHistory')); + } + }); + // === 知识库分类下拉框(P1) === + let categorySelect = null; + if (config.showCategorySwitch) { + const categoryBar = document.createElement('div'); + categoryBar.className = 'csk-category-bar'; + const categoryLabel = document.createElement('span'); + categoryLabel.className = 'csk-category-bar__label'; + categoryLabel.textContent = '📚'; + categorySelect = document.createElement('select'); + categorySelect.id = 'csk-category-select'; + categorySelect.className = 'csk-category-select'; + categorySelect.innerHTML = ``; + // onChange 触发自定义事件 + categorySelect.addEventListener('change', () => { + const selectedId = categorySelect.value; + windowEl.dispatchEvent(new CustomEvent('csk:categoryChange', { + detail: { categoryId: selectedId ? Number(selectedId) : undefined } + })); + }); + categoryBar.appendChild(categoryLabel); + categoryBar.appendChild(categorySelect); + // 插入到 messages 和 inputArea 之间 + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + windowEl.appendChild(categoryBar); + } + else { + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + } // === 输入区 === const inputArea = document.createElement('div'); inputArea.className = 'csk-input-area'; const inputEl = document.createElement('textarea'); inputEl.id = 'csk-input'; inputEl.className = 'csk-input'; - inputEl.setAttribute('placeholder', '输入您的问题...'); + inputEl.setAttribute('placeholder', t('placeholder')); inputEl.setAttribute('rows', '1'); inputEl.setAttribute('autofocus', ''); const sendBtn = document.createElement('button'); sendBtn.id = 'csk-send-btn'; sendBtn.className = 'csk-send-btn'; - sendBtn.setAttribute('title', '发送'); + sendBtn.setAttribute('title', t('send')); sendBtn.setAttribute('disabled', 'true'); sendBtn.innerHTML = ``; inputArea.appendChild(inputEl); inputArea.appendChild(sendBtn); - // === 组装 === - windowEl.appendChild(header); - windowEl.appendChild(messagesContainer); windowEl.appendChild(inputArea); // 清空按钮(可选) let clearBtn = null; if (config.showClear) { clearBtn = document.createElement('button'); clearBtn.className = 'csk-clear-btn'; - clearBtn.textContent = '清空对话'; + clearBtn.textContent = t('clear'); clearBtn.style.display = 'none'; // 初始隐藏,有消息后才显示 - // 插入到 messages 之后、inputArea 之前 + // 插入到 categoryBar/inputArea 之前 windowEl.insertBefore(clearBtn, inputArea); } // === Loading 动画 === @@ -800,6 +1641,8 @@ var ChatbotSDK = (function () { inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading, hideLoading, }; @@ -864,13 +1707,19 @@ var ChatbotSDK = (function () { container.appendChild(wrapper); return wrapper; } - /** 渲染 AI 消息气泡 */ - function renderAIBubble(container, text, timestamp) { + /** 渲染 AI 消息气泡(支持 Markdown) */ + function renderAIBubble(container, text, timestamp, renderMd) { const wrapper = document.createElement('div'); wrapper.className = 'csk-msg csk-msg--ai'; const bubble = document.createElement('div'); bubble.className = 'csk-msg__bubble'; - bubble.textContent = text; + // 支持 Markdown 渲染,传入渲染函数则使用,否则纯文本 + if (renderMd) { + bubble.innerHTML = renderMd(text); + } + else { + bubble.textContent = text; + } const time = document.createElement('div'); time.className = 'csk-msg__time'; time.textContent = formatTime(timestamp); @@ -894,6 +1743,132 @@ var ChatbotSDK = (function () { container.appendChild(wrapper); return { wrapper, bubble }; } + // ==================== P1: RAG 引用来源渲染 ==================== + /** 渲染 RAG 引用来源卡片 */ + function renderSources(wrapper, sources) { + // 移除已有的来源卡片 + const existing = wrapper.querySelector('.csk-sources'); + if (existing) + existing.remove(); + if (!sources || sources.length === 0) + return; + const sourcesEl = document.createElement('div'); + sourcesEl.className = 'csk-sources csk-sources--collapsed'; + // 头部 + const header = document.createElement('div'); + header.className = 'csk-sources__header'; + const titleSpan = document.createElement('span'); + titleSpan.className = 'csk-sources__title'; + titleSpan.textContent = `📚 ${t('source_count', { n: sources.length })}`; + const arrow = document.createElement('span'); + arrow.className = 'csk-sources__arrow'; + arrow.textContent = '▼'; + header.appendChild(titleSpan); + header.appendChild(arrow); + // 点击折叠/展开 + header.addEventListener('click', () => { + sourcesEl.classList.toggle('csk-sources--collapsed'); + }); + // 内容 + const body = document.createElement('div'); + body.className = 'csk-sources__body'; + for (const src of sources) { + const item = document.createElement('div'); + item.className = 'csk-source-item'; + const name = document.createElement('div'); + name.className = 'csk-source-item__name'; + name.textContent = src.title || src.sourceName || '未知文档'; + if (src.snippet) { + const snippet = document.createElement('div'); + snippet.className = 'csk-source-item__snippet'; + snippet.textContent = src.snippet; + item.appendChild(snippet); + } + const meta = document.createElement('div'); + meta.className = 'csk-source-item__meta'; + const metaParts = []; + if (src.sourceName) + metaParts.push(src.sourceName); + if (src.chunkIndex !== undefined) + metaParts.push(`分块 #${src.chunkIndex}`); + if (src.score !== undefined) + metaParts.push(`相关度 ${(src.score * 100).toFixed(0)}%`); + meta.textContent = metaParts.join(' · '); + item.appendChild(name); + item.appendChild(meta); + body.appendChild(item); + } + sourcesEl.appendChild(header); + sourcesEl.appendChild(body); + // 插入到气泡和时间戳之间 + const timeEl = wrapper.querySelector('.csk-msg__time'); + if (timeEl) { + wrapper.insertBefore(sourcesEl, timeEl); + } + else { + wrapper.appendChild(sourcesEl); + } + } + /** 渲染会话列表 */ + function renderHistoryList(listEl, items, onExport, onDelete, emptyText) { + listEl.innerHTML = ''; + if (items.length === 0) { + const empty = document.createElement('div'); + empty.className = 'csk-history-panel__empty'; + empty.innerHTML = ` +
💬
+
${t('history_empty')}
+ `; + listEl.appendChild(empty); + return; + } + for (const item of items) { + const el = document.createElement('div'); + el.className = 'csk-history-item'; + const info = document.createElement('div'); + info.className = 'csk-history-item__info'; + const idEl = document.createElement('div'); + idEl.className = 'csk-history-item__id'; + idEl.textContent = item.chatId || item.id; + const metaEl = document.createElement('div'); + metaEl.className = 'csk-history-item__meta'; + const metaParts = []; + if (item.messageCount !== undefined) + metaParts.push(`${item.messageCount} 条消息`); + if (item.lastMessageTime) + metaParts.push(item.lastMessageTime); + else if (item.createdAt) + metaParts.push(item.createdAt); + metaEl.textContent = metaParts.join(' · '); + info.appendChild(idEl); + info.appendChild(metaEl); + const actionsEl = document.createElement('div'); + actionsEl.className = 'csk-history-item__actions'; + // 导出按钮 + const exportBtn = document.createElement('button'); + exportBtn.className = 'csk-history-action csk-history-action--export'; + exportBtn.setAttribute('title', t('history_export')); + exportBtn.innerHTML = ``; + exportBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onExport(item.id); + }); + // 删除按钮 + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'csk-history-action csk-history-action--delete'; + deleteBtn.setAttribute('title', t('history_delete')); + deleteBtn.innerHTML = ``; + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onDelete(item.id); + }); + actionsEl.appendChild(exportBtn); + actionsEl.appendChild(deleteBtn); + el.appendChild(info); + el.appendChild(actionsEl); + listEl.appendChild(el); + } + } /** 滚动消息区到底部 */ function scrollToBottom(container) { container.scrollTop = container.scrollHeight; @@ -972,15 +1947,208 @@ var ChatbotSDK = (function () { } } + /** + * 轻量级 Markdown 渲染器 - 无外部依赖,XSS 安全 + * + * 支持:代码块、行内代码、标题、粗体、斜体、列表、链接、引用、段落 + * 策略:先转义 HTML,再转 Markdown 为安全 HTML 标签 + */ + /** 代码块占位符前缀 */ + const CODE_BLOCK_PREFIX = '\x00CODEBLOCK_'; + /** 行内代码占位符前缀 */ + const INLINE_CODE_PREFIX = '\x00INLINECODE_'; + /** + * 渲染 Markdown 文本为安全 HTML + * @param text Markdown 源文本 + * @returns 安全 HTML 字符串 + */ + function renderMarkdown(text) { + if (!text || typeof text !== 'string') + return ''; + // 1. 提取代码块(防止内部 Markdown 被处理) + const codeBlocks = []; + let processed = text; + // 提取围栏代码块 ``` + processed = processed.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => { + const idx = codeBlocks.length; + const escapedCode = escapeHtml(code.trimEnd()); + const langClass = lang ? ` class="language-${escapeHtml(lang)}"` : ''; + codeBlocks.push(`
${escapedCode}
`); + return `${CODE_BLOCK_PREFIX}${idx}\x00`; + }); + // 2. 提取行内代码 + const inlineCodes = []; + processed = processed.replace(/`([^`\n]+)`/g, (_match, code) => { + const idx = inlineCodes.length; + inlineCodes.push(`${escapeHtml(code)}`); + return `${INLINE_CODE_PREFIX}${idx}\x00`; + }); + // 3. 转义剩余 HTML(代码块和行内代码已安全处理) + processed = escapeHtml(processed); + // 4. 还原代码块和行内代码占位符(它们已经是安全 HTML) + processed = restorePlaceholders(processed, CODE_BLOCK_PREFIX, codeBlocks); + processed = restorePlaceholders(processed, INLINE_CODE_PREFIX, inlineCodes); + // 5. 逐行处理 Markdown 语法 + const lines = processed.split('\n'); + const result = []; + let inList = false; + let listType = ''; // 'ul' 或 'ol' + let inBlockquote = false; + let paragraphBuffer = []; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + // 代码块已在占位符还原阶段处理,直接输出 + if (line.includes(CODE_BLOCK_PREFIX) || line.includes('
')) {
+                flushParagraph();
+                closeList();
+                closeBlockquote();
+                result.push(line);
+                continue;
+            }
+            // 标题
+            const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
+            if (headingMatch) {
+                flushParagraph();
+                closeList();
+                closeBlockquote();
+                const level = headingMatch[1].length;
+                result.push(`${headingMatch[2]}`);
+                continue;
+            }
+            // 引用
+            const quoteMatch = line.match(/^>\s?(.*)/);
+            if (quoteMatch) {
+                flushParagraph();
+                closeList();
+                if (!inBlockquote) {
+                    inBlockquote = true;
+                    result.push('
'); + } + result.push(`

${inlineFormat(quoteMatch[1])}

`); + continue; + } + else if (inBlockquote) { + closeBlockquote(); + } + // 无序列表 + const ulMatch = line.match(/^[\-\*]\s+(.+)/); + if (ulMatch) { + flushParagraph(); + closeBlockquote(); + if (!inList || listType !== 'ul') { + closeList(); + inList = true; + listType = 'ul'; + result.push('' : ''); + inList = false; + listType = ''; + } + } + /** 关闭引用块 */ + function closeBlockquote() { + if (inBlockquote) { + result.push('
'); + inBlockquote = false; + } + } + } + /** 还原占位符为安全 HTML */ + function restorePlaceholders(text, prefix, replacements) { + return text.replace(new RegExp(escapeRegex(prefix) + '(\\d+)\x00', 'g'), (_m, idx) => { + return replacements[parseInt(idx)] || ''; + }); + } + /** 转义正则特殊字符 */ + function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + let config$1 = null; let messages = []; let messagesContainer$1 = null; let inputEl$1 = null; let sendBtn$1 = null; let clearBtn$1 = null; + let categorySelect$1 = null; + let historyPanel$1 = null; let showLoadingFn$1 = null; let hideLoadingFn$1 = null; let isSending = false; + /** 当前选中的知识库分类 ID */ + let currentCategoryId; + /** 当前是否使用 RAG 对话 */ + let useRag = false; /** * 初始化对话模块 */ @@ -990,41 +2158,84 @@ var ChatbotSDK = (function () { inputEl$1 = dom.inputEl; sendBtn$1 = dom.sendBtn; clearBtn$1 = dom.clearBtn; + categorySelect$1 = dom.categorySelect; + historyPanel$1 = dom.historyPanel; showLoadingFn$1 = dom.showLoading; hideLoadingFn$1 = dom.hideLoading; + // 初始化知识库分类 + currentCategoryId = cfg.categoryId; + useRag = !!cfg.categoryId || !!cfg.showCategorySwitch; // 绑定发送事件 bindSendEvents(); - // 恢复历史消息 - const history = loadMessages(cfg.integrateId); - if (history.length > 0) { - messages = history; - renderHistory(); + // 加载知识库分类下拉框 + if (cfg.showCategorySwitch && categorySelect$1) { + loadCategories(); + } + } + /** + * 初始化 chatId 并加载对话历史 + * 异步流程:查后端会话 → 恢复 chatId → 加载历史消息 + */ + async function initChatHistory() { + if (!config$1 || !messagesContainer$1) + return; + // 1. 初始化 chatId(从后端获取已有会话或自动生成) + await initChatId(); + // 2. 尝试从后端加载对话历史 + await loadHistoryFromBackend(); + // 3. 如果后端无历史,尝试从 localStorage 恢复 + if (messages.length === 0) { + const cached = loadMessages(config$1.integrateId); + if (cached.length > 0) { + messages = cached; + renderHistory(); + logger.info(`从本地缓存恢复 ${cached.length} 条消息`); + } + } + } + /** + * 从后端加载对话历史 + */ + async function loadHistoryFromBackend() { + if (!config$1 || !messagesContainer$1) + return; + const chatId = getChatId(); + if (!chatId) + return; + try { + const result = await fetchConversationMessages(chatId); + if (result.messages.length > 0) { + // 将后端消息转换为 ChatMessage 格式 + messages = result.messages.map((msg, idx) => ({ + id: uuid(), + role: msg.messageType === 'USER' ? 'user' : 'ai', + content: msg.content, + timestamp: new Date(msg.createTime).getTime(), + })); + renderHistory(); + logger.info(`从后端加载 ${messages.length} 条历史消息`); + // 同步到 localStorage + saveMessages(config$1.integrateId, messages); + } + } + catch (err) { + logger.warn('从后端加载历史消息失败', err); } } /** 绑定发送相关事件 */ function bindSendEvents() { if (!inputEl$1 || !sendBtn$1) return; - // 发送按钮点击 - sendBtn$1.addEventListener('click', () => { - handleSend(); - }); - // 输入框键盘事件:回车发送 / Shift+Enter 换行 + sendBtn$1.addEventListener('click', () => handleSend()); inputEl$1.addEventListener('keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }); - // 输入框内容变化时启用/禁用发送按钮 - inputEl$1.addEventListener('input', () => { - updateSendBtnState(); - }); - // 清空按钮 + inputEl$1.addEventListener('input', () => updateSendBtnState()); if (clearBtn$1) { - clearBtn$1.addEventListener('click', () => { - handleClear(); - }); + clearBtn$1.addEventListener('click', () => handleClear()); } } /** 更新发送按钮状态 */ @@ -1046,30 +2257,23 @@ var ChatbotSDK = (function () { const text = inputEl$1.value.trim(); if (text === '') return; - // 清空输入框 inputEl$1.value = ''; updateSendBtnState(); - // 自动调整 textarea 高度 inputEl$1.style.height = 'auto'; isSending = true; updateSendBtnState(); + // 确保 chatId 已初始化 + if (!config$1.chatId) { + await initChatId(); + } // 1. 渲染用户气泡 const userTimestamp = now(); - if (messagesContainer$1) { + if (messagesContainer$1) renderUserBubble(messagesContainer$1, text, userTimestamp); - } - const userMsg = { - id: uuid(), - role: 'user', - content: text, - timestamp: userTimestamp, - }; + const userMsg = { id: uuid(), role: 'user', content: text, timestamp: userTimestamp }; messages.push(userMsg); - // 显示清空按钮 - if (clearBtn$1 && messages.length > 0) { + if (clearBtn$1 && messages.length > 0) clearBtn$1.style.display = 'inline-flex'; - } - // 滚动到底部 if (messagesContainer$1) scrollToBottom(messagesContainer$1); // 2. 显示 loading @@ -1081,40 +2285,31 @@ var ChatbotSDK = (function () { try { let aiContent; const aiTimestamp = now(); + const shouldUseRag = useRag && (currentCategoryId !== undefined || config$1.categoryId !== undefined); if (config$1.streaming) { - // 流式输出:气泡由 sendStreamMessage 内部的 onChunk 回调创建 - aiContent = await sendStreamMessage(text, aiTimestamp); + aiContent = await sendStreamMessage(text, aiTimestamp, shouldUseRag); } else { - // 同步请求:需要在此渲染 AI 气泡 aiContent = await chatRequest(text); } - // 4. 隐藏 loading(流式模式在 onChunk 中已隐藏,此处做兜底) if (hideLoadingFn$1) hideLoadingFn$1(); - // 5. 非流式模式:在此渲染 AI 气泡;流式模式气泡已在 stream 回调中创建 if (!config$1.streaming && messagesContainer$1) { - renderAIBubble(messagesContainer$1, aiContent, aiTimestamp); + renderAIBubble(messagesContainer$1, aiContent, aiTimestamp, renderMarkdown); } - const aiMsg = { - id: uuid(), - role: 'ai', - content: aiContent, - timestamp: aiTimestamp, - }; + const aiMsg = { id: uuid(), role: 'ai', content: aiContent, timestamp: aiTimestamp }; messages.push(aiMsg); - // 6. 保存到 localStorage saveMessages(config$1.integrateId, messages); - // 7. 滚动到底部 if (messagesContainer$1) scrollToBottom(messagesContainer$1); + // RAG 引用来源 + if (shouldUseRag) + fetchAndRenderSources(text, aiMsg); } catch (err) { - // 隐藏 loading if (hideLoadingFn$1) hideLoadingFn$1(); - // 渲染错误提示 - const errMsg = err instanceof CskError ? err.message : '发送失败,请稍后重试'; + const errMsg = err instanceof CskError ? err.message : t('error_send'); if (messagesContainer$1) { const errorBubble = document.createElement('div'); errorBubble.className = 'csk-msg csk-msg--ai'; @@ -1133,93 +2328,190 @@ var ChatbotSDK = (function () { } } /** 流式发送消息 */ - async function sendStreamMessage(text, aiTimestamp) { + async function sendStreamMessage(text, aiTimestamp, shouldUseRag) { return new Promise((resolve, reject) => { let bubbleEl = null; - let wrapperEl = null; let accumulated = ''; let streamStarted = false; - chatSSERequest(text, - // onChunk - (chunk) => { + chatSSERequest(text, (chunk) => { accumulated += chunk; if (!streamStarted && messagesContainer$1) { - // 隐藏 loading,创建空 AI 气泡 if (hideLoadingFn$1) hideLoadingFn$1(); - const { wrapper, bubble } = createEmptyAIBubble(messagesContainer$1, aiTimestamp); - wrapperEl = wrapper; + const { bubble } = createEmptyAIBubble(messagesContainer$1, aiTimestamp); bubbleEl = bubble; streamStarted = true; } - if (bubbleEl) { + if (bubbleEl) bubbleEl.textContent = accumulated; - } if (messagesContainer$1) scrollToBottom(messagesContainer$1); - }, - // onDone - () => { - // 如果流没有产生任何内容,回退同步请求 + }, () => { if (!streamStarted && accumulated === '') { - chatRequest(text) - .then((content) => resolve(content)) - .catch(reject); + chatRequest(text).then(resolve).catch(reject); return; } + if (bubbleEl && accumulated) + bubbleEl.innerHTML = renderMarkdown(accumulated); resolve(accumulated); - }, - // onError - (error) => { + }, (error) => { if (accumulated.length > 0) { - // 有部分内容,保留并添加提示 - if (bubbleEl) { - bubbleEl.textContent = accumulated + '\n\n[回复被中断]'; - } + if (bubbleEl) + bubbleEl.innerHTML = renderMarkdown(accumulated + '\n\n' + t('stream_interrupted')); resolve(accumulated); } else { reject(error); } - }); + }, currentCategoryId, shouldUseRag); }); } + /** 获取并渲染 RAG 引用来源 */ + async function fetchAndRenderSources(message, aiMsg) { + try { + const sources = await fetchRagSources(message, currentCategoryId); + if (sources.length > 0) { + const ragSources = sources.map(s => { + var _a, _b; + return ({ + documentId: s.documentId || '', + title: s.title || '', + sourceName: s.sourceName || '', + chunkIndex: (_a = s.chunkIndex) !== null && _a !== void 0 ? _a : 0, + score: (_b = s.score) !== null && _b !== void 0 ? _b : 0, + snippet: s.snippet || '', + }); + }); + aiMsg.sources = ragSources; + if (messagesContainer$1) { + const lastAiMsg = messagesContainer$1.querySelector('.csk-msg--ai:last-of-type'); + if (lastAiMsg) + renderSources(lastAiMsg, ragSources); + } + if (config$1) + saveMessages(config$1.integrateId, messages); + } + } + catch (err) { + logger.warn('获取引用来源失败', err); + } + } + /** 加载知识库分类到下拉框 */ + async function loadCategories() { + if (!categorySelect$1) + return; + try { + const tree = await fetchCategoryTree(); + if (tree.length === 0) + return; + categorySelect$1.innerHTML = ``; + const addOptions = (nodes, indent = 0) => { + for (const node of nodes) { + const option = document.createElement('option'); + option.value = String(node.id); + option.textContent = `${' '.repeat(indent)}${node.name}`; + if (currentCategoryId !== undefined && String(node.id) === String(currentCategoryId)) + option.selected = true; + categorySelect$1.appendChild(option); + if (node.children && node.children.length > 0) + addOptions(node.children, indent + 1); + } + }; + addOptions(tree); + logger.info(`知识库分类加载成功 count=${tree.length}`); + } + catch (err) { + logger.error(t('category_load_error'), err); + } + } /** 渲染历史消息 */ function renderHistory() { if (!messagesContainer$1) return; - // 清空容器 - messagesContainer$1.innerHTML = ''; + const historyPanelEl = messagesContainer$1.querySelector('.csk-history-panel'); + const msgs = messagesContainer$1.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); for (const msg of messages) { if (msg.role === 'user') { renderUserBubble(messagesContainer$1, msg.content, msg.timestamp); } else { - renderAIBubble(messagesContainer$1, msg.content, msg.timestamp); + const wrapper = renderAIBubble(messagesContainer$1, msg.content, msg.timestamp, renderMarkdown); + if (msg.sources && msg.sources.length > 0) + renderSources(wrapper, msg.sources); } } scrollToBottom(messagesContainer$1); - // 显示清空按钮 - if (clearBtn$1 && messages.length > 0) { + if (clearBtn$1 && messages.length > 0) clearBtn$1.style.display = 'inline-flex'; + if (historyPanelEl && !messagesContainer$1.contains(historyPanelEl)) { + messagesContainer$1.appendChild(historyPanelEl); } } - /** 清空对话历史 */ + /** 清空对话历史(生成新 chatId) */ function handleClear() { if (!config$1) return; - if (!confirm('确定清空所有对话记录?')) { + if (!confirm(t('clear_confirm'))) return; - } messages = []; if (messagesContainer$1) { - messagesContainer$1.innerHTML = ''; + const msgs = messagesContainer$1.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); } - if (clearBtn$1) { + if (clearBtn$1) clearBtn$1.style.display = 'none'; - } clearMessages(config$1.integrateId); - logger.info(`清空会话 integrateId=${config$1.integrateId}`); + // 生成新的 chatId,开始新会话 + const newId = generateNewChatId(); + updateChatId(newId); + saveCachedChatId(config$1.integrateId, config$1.userId, newId); + logger.lifecycleClear(config$1.integrateId); + logger.info(`新 chatId=${newId}`); + } + /** 生成新 chatId */ + function generateNewChatId() { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; + } + /** 设置当前知识库分类 */ + function setCategory(categoryId) { + currentCategoryId = categoryId; + useRag = categoryId !== undefined; + logger.lifecycleCategoryChange(categoryId !== null && categoryId !== void 0 ? categoryId : '全部'); + } + // ==================== 会话管理面板 ==================== + /** 加载会话列表并渲染 */ + async function loadHistoryConversations() { + if (!historyPanel$1 || !config$1) + return; + const listEl = historyPanel$1.querySelector('#csk-history-list'); + if (!listEl) + return; + listEl.innerHTML = `
加载中...
`; + try { + const result = await fetchConversationList(1, 50, config$1.userId, config$1.integrateId); + const items = result.list.map(c => ({ + id: c.conversationId || c.chatId || '', + chatId: c.conversationId || c.chatId || '', + messageCount: c.messageCount, + lastMessageTime: c.lastMessageTime, + createdAt: c.firstMessageTime || c.createdAt, + })); + renderHistoryList(listEl, items, (id) => { window.open(getConversationExportUrl(id), '_blank'); }, async (id) => { + if (!confirm(t('history_delete_confirm'))) + return; + const ok = await deleteConversation(id); + if (ok) + loadHistoryConversations(); + }); + } + catch (err) { + logger.error(t('history_load_error'), err); + listEl.innerHTML = `
${t('history_load_error')}
`; + } } // ==================== 单例状态 ==================== @@ -1231,6 +2523,8 @@ var ChatbotSDK = (function () { let inputEl = null; let sendBtn = null; let clearBtn = null; + let categorySelect = null; + let historyPanel = null; let showLoadingFn = null; let hideLoadingFn = null; let dragCleanup = null; @@ -1243,52 +2537,67 @@ var ChatbotSDK = (function () { } // 1. 配置解析与校验 const parsed = parseConfig(rawConfig); - if (!parsed) { - return; // parseConfig 已输出错误 - } + if (!parsed) + return; config = parsed; - // 2. 设置日志级别 + // 2. 设置国际化语言 + setLocale(config.locale); + // 3. 设置日志级别 setDebug(config.debug); - // 3. 设置 API 配置 + // 4. 设置 API 配置 setApiConfig(config); - // 4. 注入样式 + // 5. 注入样式 injectStyles(config); - // 5. 创建悬浮按钮 + // 6. 创建悬浮按钮 launcherEl = createLauncher(config, toggle); document.body.appendChild(launcherEl); - // 6. 创建聊天弹窗 + // 7. 创建聊天弹窗 const dom = createChatWindow(config); windowEl = dom.window; messagesContainer = dom.messagesContainer; inputEl = dom.inputEl; sendBtn = dom.sendBtn; clearBtn = dom.clearBtn; + categorySelect = dom.categorySelect; + historyPanel = dom.historyPanel; showLoadingFn = dom.showLoading; hideLoadingFn = dom.hideLoading; document.body.appendChild(windowEl); - // 7. 启用拖拽 + // 8. 启用拖拽 const headerEl = windowEl.querySelector('.csk-header'); if (headerEl) { dragCleanup = enableDrag(headerEl, windowEl); } - // 8. 初始化对话模块 + // 9. 初始化对话模块 initChat(config, { messagesContainer, inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading: showLoadingFn, hideLoading: hideLoadingFn, }); + // 10. 监听知识库分类切换事件 + windowEl.addEventListener('csk:categoryChange', ((e) => { + setCategory(e.detail.categoryId); + })); + // 11. 监听会话管理面板加载事件 + windowEl.addEventListener('csk:loadHistory', () => { + loadHistoryConversations(); + }); isInitialized = true; - logger.info(`初始化完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + logger.lifecycleInit(config.integrateId, config.requestDomain); + // 12. 异步初始化 chatId 和对话历史(不阻塞 UI) + initChatHistory().catch(err => { + logger.warn('chatId 初始化失败,将在发送消息时重试', err); + }); } /** 销毁 SDK 实例 */ function destroy() { - if (!isInitialized) { + if (!isInitialized) return; - } - // 移除 DOM 元素 if (launcherEl && launcherEl.parentNode) { launcherEl.parentNode.removeChild(launcherEl); launcherEl = null; @@ -1297,14 +2606,11 @@ var ChatbotSDK = (function () { windowEl.parentNode.removeChild(windowEl); windowEl = null; } - // 移除拖拽事件 if (dragCleanup) { dragCleanup(); dragCleanup = null; } - // 移除样式 removeStyles(); - // 重置状态 const oldIntegrateId = config === null || config === void 0 ? void 0 : config.integrateId; config = null; isInitialized = false; @@ -1312,43 +2618,37 @@ var ChatbotSDK = (function () { inputEl = null; sendBtn = null; clearBtn = null; + categorySelect = null; + historyPanel = null; showLoadingFn = null; hideLoadingFn = null; - logger.info(`销毁实例 integrateId=${oldIntegrateId}`); + logger.lifecycleDestroy(oldIntegrateId || ''); } - /** 打开聊天窗口 */ function open() { if (!windowEl) return; windowEl.classList.remove('csk-window--hidden'); } - /** 关闭聊天窗口 */ function close() { if (!windowEl) return; windowEl.classList.add('csk-window--hidden'); } - /** 切换窗口显示/隐藏 */ function toggle() { if (!windowEl) return; if (windowEl.classList.contains('csk-window--hidden')) { open(); - // 聚焦输入框 - setTimeout(() => { - if (inputEl) - inputEl.focus(); - }, 100); + setTimeout(() => { if (inputEl) + inputEl.focus(); }, 100); } else { close(); } } - /** 清空当前会话历史 */ function clearHistory() { if (!config) return; - // 通过触发自定义事件,让 chat 模块处理 if (clearBtn) { clearBtn.click(); } @@ -1365,7 +2665,6 @@ var ChatbotSDK = (function () { toggle, clearHistory, }; - // IIFE 自动挂载 if (typeof window !== 'undefined') { window.ChatbotSDK = ChatbotSDK; } diff --git a/client/dist/chatbot-sdk.js.map b/client/dist/chatbot-sdk.js.map index e3a9868..ac22c50 100644 --- a/client/dist/chatbot-sdk.js.map +++ b/client/dist/chatbot-sdk.js.map @@ -1 +1 @@ -{"version":3,"file":"chatbot-sdk.js","sources":["../src/logger.ts","../src/config.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["config","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chatbot-sdk.js","sources":["../src/logger.ts","../src/config.ts","../src/i18n.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/markdown.ts","../src/chat.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null],"names":["config","messagesContainer","inputEl","sendBtn","clearBtn","categorySelect","historyPanel","showLoadingFn","hideLoadingFn"],"mappings":";;;IAMA,MAAM,MAAM,GAAG,cAAc;IAE7B,IAAI,YAAY,GAAG,IAAI;IAEvB;IACM,SAAU,QAAQ,CAAC,OAAgB,EAAA;QACvC,YAAY,GAAG,OAAO;IACxB;IAEA;IACA,MAAM,MAAM,GAA2B,EAAE;IAElC,MAAM,MAAM,GAAG;;QAEpB,IAAI,CAAC,GAAW,EAAE,IAAc,EAAA;YAC9B,IAAI,YAAY,EAAE;IAChB,YAAA,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YAC1D;QACF,CAAC;;QAGD,IAAI,CAAC,GAAW,EAAE,IAAc,EAAA;YAC9B,IAAI,YAAY,EAAE;IAChB,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YAC3D;QACF,CAAC;;QAGD,KAAK,CAAC,GAAW,EAAE,IAAc,EAAA;IAC/B,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5D,CAAC;;IAGD,IAAA,IAAI,CAAC,KAAa,EAAA;YAChB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5B,CAAC;;QAGD,OAAO,CAAC,KAAa,EAAE,MAAe,EAAA;IACpC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;IACnC,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;gBACpB,IAAI,YAAY,EAAE;IAChB,gBAAA,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,CAAI,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,IAAI;IACzE,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;gBAC1B;IACA,YAAA,OAAO,QAAQ;YACjB;IACA,QAAA,OAAO,CAAC;QACV,CAAC;;QAGD,aAAa,CAAC,WAAmB,EAAE,aAAqB,EAAA;YACtD,IAAI,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,WAAW,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,CAAC;QAC9E,CAAC;;IAGD,IAAA,gBAAgB,CAAC,WAAmB,EAAA;IAClC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAA,CAAE,CAAC;QAC9C,CAAC;;QAGD,aAAa,CAAC,WAAmB,EAAE,MAAc,EAAA;YAC/C,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,WAAW,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAC;IAC7D,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,WAAW,CAAA,CAAE,CAAC;QAClC,CAAC;;QAGD,cAAc,CAAC,WAAmB,EAAE,MAAc,EAAA;IAChD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAE,EAAE,OAAO,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,WAAW,CAAA,QAAA,EAAW,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAI,CAAC;QACvF,CAAC;;IAGD,IAAA,cAAc,CAAC,WAAmB,EAAE,MAAc,EAAE,OAAe,EAAA;IACjE,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,WAAW,CAAA,CAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,CAAA,iBAAA,EAAoB,WAAW,CAAA,QAAA,EAAW,MAAM,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAC;QACnF,CAAC;;IAGD,IAAA,cAAc,CAAC,WAAmB,EAAA;IAChC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAA,CAAE,CAAC;QAC9C,CAAC;;QAGD,mBAAmB,CAAC,WAAmB,EAAE,MAAc,EAAA;IACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAE,EAAE,MAAM,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,CAAA,mBAAA,EAAsB,WAAW,CAAA,QAAA,EAAW,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAI,CAAC;QACxF,CAAC;;IAGD,IAAA,uBAAuB,CAAC,UAA2B,EAAA;IACjD,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,UAAU,CAAA,CAAE,CAAC;QAC/C,CAAC;KACF;;IC1FD;IACA,MAAM,qBAAqB,GAAG,CAAA;;;OAGvB;IAEP;;IAEG;IACG,SAAU,WAAW,CAAC,GAAc,EAAA;;;IAExC,IAAA,IAAI,CAAC,GAAG,CAAC,WAAW,KAAK,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;IAC9F,YAAC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IAC3E,QAAA,MAAM,CAAC,KAAK,CAAC,uIAAuI,CAAC;IACrJ,QAAA,OAAO,IAAI;QACb;;QAGA,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IAClG,QAAA,MAAM,CAAC,KAAK,CAAC,oHAAoH,CAAC;IAClI,QAAA,OAAO,IAAI;QACb;;IAGA,IAAA,IAAI;IACF,QAAA,IAAI,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;QAC5B;IAAE,IAAA,OAAA,EAAA,EAAM;YACN,MAAM,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,GAAG,CAAC,aAAa,CAAA,mCAAA,CAAqC,CAAC;IAClG,QAAA,OAAO,IAAI;QACb;;QAGA,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;;IAGrD,IAAA,MAAM,MAAM,GAAmB;IAC7B,QAAA,WAAW,EAAE,cAAc;IAC3B,QAAA,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAAU;IAC1B,QAAA,kBAAkB,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,kBAAkB,mCAAI,KAAK;IACnD,QAAA,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;IAC7B,QAAA,KAAK,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,KAAK,mCAAI,GAAG;IACvB,QAAA,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,aAAa,GAAG,aAAa,GAAG,cAAc;IACzE,QAAA,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,SAAS;IAC3C,QAAA,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,qBAAqB;IACvD,QAAA,SAAS,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,SAAS,mCAAI,IAAI;IAChC,QAAA,cAAc,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,cAAc,mCAAI,KAAK;IAC3C,QAAA,SAAS,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,SAAS,mCAAI,IAAI;IAChC,QAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,OAAO;IAC7B,QAAA,KAAK,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,KAAK,mCAAI,IAAI;YACxB,MAAM,EAAE,EAAE;SACX;IAED,IAAA,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,WAAW,CAAA,oBAAA,EAAuB,MAAM,CAAC,MAAM,IAAI,OAAO,CAAA,eAAA,EAAkB,MAAM,CAAC,aAAa,CAAA,CAAE,CAAC;IACrJ,IAAA,OAAO,MAAM;IACf;;ICnEA;;IAEG;IAEH;IACA,MAAM,YAAY,GAA2C;IAC3D,IAAA,OAAO,EAAE;;IAEP,QAAA,KAAK,EAAE,SAAS;IAChB,QAAA,QAAQ,EAAE,KAAK;IACf,QAAA,KAAK,EAAE,IAAI;;IAGX,QAAA,WAAW,EAAE,WAAW;IACxB,QAAA,IAAI,EAAE,IAAI;;IAGV,QAAA,OAAO,EAAE,SAAS;IAClB,QAAA,kBAAkB,EAAE,OAAO;IAC3B,QAAA,eAAe,EAAE,eAAe;;IAGhC,QAAA,oBAAoB,EAAE,SAAS;IAC/B,QAAA,YAAY,EAAE,MAAM;IACpB,QAAA,mBAAmB,EAAE,QAAQ;IAC7B,QAAA,YAAY,EAAE,MAAM;IACpB,QAAA,YAAY,EAAE,WAAW;IACzB,QAAA,cAAc,EAAE,UAAU;;IAG1B,QAAA,KAAK,EAAE,MAAM;IACb,QAAA,aAAa,EAAE,aAAa;;IAG5B,QAAA,aAAa,EAAE,MAAM;IACrB,QAAA,aAAa,EAAE,QAAQ;IACvB,QAAA,kBAAkB,EAAE,UAAU;IAC9B,QAAA,sBAAsB,EAAE,UAAU;IAClC,QAAA,cAAc,EAAE,IAAI;IACpB,QAAA,cAAc,EAAE,IAAI;;IAGpB,QAAA,aAAa,EAAE,cAAc;IAC7B,QAAA,aAAa,EAAE,YAAY;IAC3B,QAAA,YAAY,EAAE,aAAa;IAC3B,QAAA,UAAU,EAAE,+BAA+B;IAC3C,QAAA,UAAU,EAAE,aAAa;IACzB,QAAA,eAAe,EAAE,gBAAgB;IACjC,QAAA,eAAe,EAAE,UAAU;IAC3B,QAAA,gBAAgB,EAAE,cAAc;IAChC,QAAA,iBAAiB,EAAE,cAAc;IACjC,QAAA,aAAa,EAAE,UAAU;IACzB,QAAA,UAAU,EAAE,YAAY;IACxB,QAAA,wBAAwB,EAAE,YAAY;IACvC,KAAA;IAED,IAAA,IAAI,EAAE;;IAEJ,QAAA,KAAK,EAAE,cAAc;IACrB,QAAA,QAAQ,EAAE,UAAU;IACpB,QAAA,KAAK,EAAE,OAAO;;IAGd,QAAA,WAAW,EAAE,uBAAuB;IACpC,QAAA,IAAI,EAAE,MAAM;;IAGZ,QAAA,OAAO,EAAE,aAAa;IACtB,QAAA,kBAAkB,EAAE,sBAAsB;IAC1C,QAAA,eAAe,EAAE,6CAA6C;;IAG9D,QAAA,oBAAoB,EAAE,iBAAiB;IACvC,QAAA,YAAY,EAAE,gBAAgB;IAC9B,QAAA,mBAAmB,EAAE,2BAA2B;IAChD,QAAA,YAAY,EAAE,SAAS;IACvB,QAAA,YAAY,EAAE,eAAe;IAC7B,QAAA,cAAc,EAAE,oBAAoB;;IAGpC,QAAA,KAAK,EAAE,YAAY;IACnB,QAAA,aAAa,EAAE,iCAAiC;;IAGhD,QAAA,aAAa,EAAE,SAAS;IACxB,QAAA,aAAa,EAAE,sBAAsB;IACrC,QAAA,kBAAkB,EAAE,8BAA8B;IAClD,QAAA,sBAAsB,EAAE,2BAA2B;IACnD,QAAA,cAAc,EAAE,QAAQ;IACxB,QAAA,cAAc,EAAE,QAAQ;;IAGxB,QAAA,aAAa,EAAE,2BAA2B;IAC1C,QAAA,aAAa,EAAE,qCAAqC;IACpD,QAAA,YAAY,EAAE,sCAAsC;IACpD,QAAA,UAAU,EAAE,qEAAqE;IACjF,QAAA,UAAU,EAAE,6CAA6C;IACzD,QAAA,eAAe,EAAE,qCAAqC;IACtD,QAAA,eAAe,EAAE,oBAAoB;IACrC,QAAA,gBAAgB,EAAE,2CAA2C;IAC7D,QAAA,iBAAiB,EAAE,iCAAiC;IACpD,QAAA,aAAa,EAAE,uBAAuB;IACtC,QAAA,UAAU,EAAE,kCAAkC;IAC9C,QAAA,wBAAwB,EAAE,oCAAoC;IAC/D,KAAA;KACF;IAED;IACA,IAAI,aAAa,GAAG,OAAO;IAE3B;;IAEG;IACG,SAAU,SAAS,CAAC,MAAc,EAAA;IACtC,IAAA,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;YACxB,aAAa,GAAG,MAAM;QACxB;aAAO;;YAEL,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,OAAO,EAAE;gBACX,aAAa,GAAG,OAAO;YACzB;;QAEF;IACF;IAEA;;;;IAIG;IACG,SAAU,CAAC,CAAC,GAAW,EAAE,MAAwC,EAAA;QACrE,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC;IACjE,IAAA,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;;QAGzD,IAAI,MAAM,EAAE;IACV,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;IAC3C,YAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1C;QACF;IAEA,IAAA,OAAO,IAAI;IACb;;ICpIA;IACA,MAAM,eAAe,GAAG,KAAK;IAE7B,IAAI,aAAa,GAA0B,IAAI;IAE/C;IACM,SAAU,YAAY,CAAC,MAAsB,EAAA;QACjD,aAAa,GAAG,MAAM;IACxB;IAEA;IACM,SAAU,YAAY,CAAC,MAAc,EAAA;QACzC,IAAI,aAAa,EAAE;IACjB,QAAA,aAAa,CAAC,MAAM,GAAG,MAAM;QAC/B;IACF;IAEA;aACgB,SAAS,GAAA;QACvB,OAAO,CAAA,aAAa,KAAA,IAAA,IAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,CAAE,MAAM,KAAI,EAAE;IACpC;IAEA;IACM,SAAU,QAAQ,CAAC,IAAY,EAAA;QACnC,IAAI,CAAC,aAAa,EAAE;IAClB,QAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC;QAC/B;IACA,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9D,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,EAAE;IAC1D,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,EAAE;IAChC;IAEA;;IAEG;IACH,SAAS,YAAY,CAAC,MAAuB,EAAE,GAAW,EAAE,KAAkC,EAAA;IAC5F,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE;QACtD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC;IAEA;IAEA;;;;;IAKG;IACH,SAAS,YAAY,CAAC,OAAe,EAAA;IACnC,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;IACpC,IAAA,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAc,CAAC,MAAM,CAAC;;QAG3C,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAc,CAAC,WAAW,CAAC;;QAE1D,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,aAAc,CAAC,MAAM,CAAC;QAExD,OAAO,QAAQ,CAAC,CAAA,4BAAA,EAA+B,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;IACrE;IAEA;;IAEG;IACH,SAAS,eAAe,CAAC,OAAe,EAAE,UAAmB,EAAA;IAC3D,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;IACpC,IAAA,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAc,CAAC,MAAM,CAAC;QAE3C,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAc,CAAC,WAAW,CAAC;QAC1D,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,aAAc,CAAC,MAAM,CAAC;IACxD,IAAA,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,aAAc,CAAC,UAAU,CAAC;QAE3E,OAAO,QAAQ,CAAC,CAAA,2BAAA,EAA8B,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;IACpE;IAEA;;IAEG;IACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,UAAmB,EAAA;IAC9D,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;IACpC,IAAA,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAc,CAAC,MAAM,CAAC;IAC3C,IAAA,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC;QAExC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAc,CAAC,WAAW,CAAC;QAC1D,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,aAAc,CAAC,MAAM,CAAC;IACxD,IAAA,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,aAAc,CAAC,UAAU,CAAC;QAE3E,OAAO,QAAQ,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;IACxE;IAEA;;IAEG;IACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,UAAmB,EAAA;IAC9D,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;IACpC,IAAA,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAc,CAAC,MAAM,CAAC;IAC3C,IAAA,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC;QAExC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAc,CAAC,WAAW,CAAC;QAC1D,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,aAAc,CAAC,MAAM,CAAC;IACxD,IAAA,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,aAAc,CAAC,UAAU,CAAC;QAE3E,OAAO,QAAQ,CAAC,CAAA,8BAAA,EAAiC,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;IACvE;IAEA;IAEA;IACA,eAAe,SAAS,CACtB,GAAW,EACX,OAAA,GAAuB,EAAE,EACzB,OAAA,GAAkB,eAAe,EAAA;IAEjC,IAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;IACxC,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC;IAE3D,IAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC3B,OAAO,CAAA,EAAA,EACV,MAAM,EAAE,UAAU,CAAC,MAAM,EACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,SAAS,EAAA,CAAA,CACtB;IACF,QAAA,OAAO,QAAQ;QACjB;QAAE,OAAO,GAAY,EAAE;YACrB,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC5D,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC;YACnD;IACA,QAAA,IAAI,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;gBACvE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAC7C;YACA,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC;QACnD;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;IACF;IAEA;IACM,MAAO,QAAS,SAAQ,KAAK,CAAA;QAEjC,WAAA,CAAY,OAAe,EAAE,IAAY,EAAA;YACvC,KAAK,CAAC,OAAO,CAAC;IACd,QAAA,IAAI,CAAC,IAAI,GAAG,UAAU;IACtB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAClB;IACD;IAED;IACA,SAAS,mBAAmB,CAAC,MAAc,EAAA;QACzC,QAAQ,MAAM;YACZ,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC;YAChC,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC;YACrC,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC;YACrC,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC;YACtC,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,cAAc,CAAC;IAClC,QAAA,KAAK,GAAG;YACR,KAAK,GAAG,EAAE,OAAO,CAAC,CAAC,mBAAmB,CAAC;YACvC,SAAS,OAAO,CAAA,EAAG,CAAC,CAAC,eAAe,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG;;IAEtD;IAEA;IAEA;;IAEG;IACI,eAAe,WAAW,CAAC,OAAe,EAAA;IAC/C,IAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC;QACjC,MAAM,CAAC,aAAa,CAAC,aAAc,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;IAEhE,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;IACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrD,YAAA,MAAM,CAAC,cAAc,CAAC,aAAc,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;gBACpF,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;YACzD;IAEA,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;YAClC,MAAM,CAAC,cAAc,CAAC,aAAc,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;IAC9D,QAAA,OAAO,IAAI;QACb;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,YAAY,QAAQ;IAAE,YAAA,MAAM,GAAG;IACtC,QAAA,MAAM,CAAC,cAAc,CAAC,aAAc,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACzE,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC;QACnD;IACF;IAEA;;;;IAIG;IACI,eAAe,cAAc,CAClC,OAAe,EACf,OAA+B,EAC/B,MAAkB,EAClB,OAAkC,EAClC,UAAmB,EACnB,MAAgB,EAAA;;QAEhB,MAAM,GAAG,GAAG;IACV,UAAE,kBAAkB,CAAC,OAAO,EAAE,UAAU;IACxC,UAAE,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC;QACxC,IAAI,SAAS,GAAG,EAAE;QAElB,MAAM,CAAC,aAAa,CAAC,aAAc,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC;IAEhE,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,eAAe,GAAG,CAAC,CAAC;IAE9D,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrD,YAAA,MAAM,CAAC,cAAc,CAAC,aAAc,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IACpF,YAAA,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC,CAAC;gBAC1D;YACF;YAEA,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,SAAS,EAAE;YACzC,IAAI,CAAC,MAAM,EAAE;IACX,YAAA,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBAC1E;YACF;IAEA,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAwB,CAAC;YAChF,IAAI,MAAM,GAAG,EAAE;IAEf,QAAA,IAAI;gBACF,OAAO,IAAI,EAAE;oBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;IAC3C,gBAAA,IAAI,IAAI;wBAAE;IAEV,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAChC,gBAAA,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;IAE1B,gBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;IACxB,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;wBAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;4BAAE;IAEzC,oBAAA,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;4BACxC,IAAI,IAAI,EAAE;gCAAE,SAAS,IAAI,IAAI;gCAAE,OAAO,CAAC,IAAI,CAAC;4BAAE;wBAChD;IAAO,yBAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;4BAC/B;wBACF;6BAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;4BACvG,SAAS,IAAI,OAAO;4BACpB,OAAO,CAAC,OAAO,CAAC;wBAClB;oBACF;gBACF;IAEA,YAAA,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE;IACjB,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE;IAC7B,gBAAA,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;wBAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACxC,IAAI,IAAI,EAAE;4BAAE,SAAS,IAAI,IAAI;4BAAE,OAAO,CAAC,IAAI,CAAC;wBAAE;oBAChD;IAAO,qBAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;wBAC/B,SAAS,IAAI,OAAO;wBACpB,OAAO,CAAC,OAAO,CAAC;oBAClB;gBACF;YACF;YAAE,OAAO,OAAgB,EAAE;IACzB,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACxB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBACxC;qBAAO;IACL,gBAAA,MAAM,OAAO;gBACf;YACF;oBAAU;gBACR,MAAM,CAAC,WAAW,EAAE;YACtB;YAEA,MAAM,CAAC,mBAAmB,CAAC,aAAc,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC;IACxE,QAAA,MAAM,EAAE;QACV;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,IAAI,GAAG,YAAY,QAAQ,EAAE;gBAC3B,OAAO,CAAC,GAAG,CAAC;YACd;iBAAO;IACL,YAAA,MAAM,CAAC,cAAc,CAAC,aAAc,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzE,YAAA,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;YACtD;QACF;IACF;IAEA;IAEA;;IAEG;IACI,eAAe,iBAAiB,GAAA;IACrC,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,gBAAgB,CAAC;IACtC,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;IAAE,YAAA,MAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;IACrG,QAAA,MAAM,IAAI,GAAgC,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC/D,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5C,MAAM,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA,CAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,IAAI;YAClB;IACA,QAAA,OAAO,EAAE;QACX;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,YAAY,QAAQ;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAA,SAAA,EAAY,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;;IAC/D,YAAA,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;IACjC,QAAA,OAAO,EAAE;QACX;IACF;IAcA;;IAEG;IACI,eAAe,eAAe,CAAC,OAAe,EAAE,UAAmB,EAAA;QACxE,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC;IACnD,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;IAAE,YAAA,MAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;IACrG,QAAA,MAAM,IAAI,GAAiC,MAAM,QAAQ,CAAC,IAAI,EAAE;IAChE,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5C,MAAM,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA,CAAE,CAAC;gBAC/C,OAAO,IAAI,CAAC,IAAI;YAClB;IACA,QAAA,OAAO,EAAE;QACX;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC;IAC7B,QAAA,OAAO,EAAE;QACX;IACF;IAiBA;;IAEG;IACI,eAAe,qBAAqB,CACzC,IAAA,GAAe,CAAC,EAChB,IAAA,GAAe,EAAE,EACjB,SAAkB,EAClB,MAAe,EAAA;IAMf,IAAA,IAAI,IAAI,GAAG,CAAA,wBAAA,EAA2B,IAAI,CAAA,MAAA,EAAS,IAAI,EAAE;IACzD,IAAA,IAAI,SAAS;IAAE,QAAA,IAAI,IAAI,CAAA,WAAA,EAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE;IACpE,IAAA,IAAI,MAAM;IAAE,QAAA,IAAI,IAAI,CAAA,QAAA,EAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAC3D,IAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE1B,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;IAAE,YAAA,MAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;IACrG,QAAA,MAAM,IAAI,GAAoC,MAAM,QAAQ,CAAC,IAAI,EAAE;YACnE,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;IAC/D,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;IACtB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;aACvB;QACH;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC;IAC7B,QAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QACzC;IACF;IAEA;;IAEG;IACI,eAAe,yBAAyB,CAAC,cAAsB,EAAA;QAIpE,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,cAAc,CAAA,SAAA,CAAW,CAAC;IAChE,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;IAAE,YAAA,MAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;IACrG,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;YAClC,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;IACnE,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;aACvB;QACH;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC;YAC7B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QACnC;IACF;IAEA;;IAEG;IACI,eAAe,kBAAkB,CAAC,cAAsB,EAAA;QAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,cAAc,CAAA,CAAE,CAAC;IACvD,IAAA,IAAI;IACF,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE;IAAE,YAAA,MAAM,IAAI,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;IACrG,QAAA,MAAM,IAAI,GAAgB,MAAM,QAAQ,CAAC,IAAI,EAAE;YAC/C,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,cAAc,CAAA,SAAA,EAAY,IAAI,CAAC,OAAO,CAAA,CAAE,CAAC;IAChE,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;IAC3B,QAAA,OAAO,KAAK;QACd;IACF;IAEA;;IAEG;IACG,SAAU,wBAAwB,CAAC,cAAsB,EAAA;IAC7D,IAAA,OAAO,QAAQ,CAAC,CAAA,cAAA,EAAiB,cAAc,CAAA,OAAA,CAAS,CAAC;IAC3D;IAEA;IAEA;;;;;;;;IAQG;IACI,eAAe,UAAU,GAAA;IAC9B,IAAA,IAAI,CAAC,aAAa;IAAE,QAAA,OAAO,EAAE;;IAG7B,IAAA,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC;QACtF,IAAI,YAAY,EAAE;IAChB,QAAA,aAAa,CAAC,MAAM,GAAG,YAAY;IACnC,QAAA,MAAM,CAAC,IAAI,CAAC,gBAAgB,YAAY,CAAA,CAAE,CAAC;IAC3C,QAAA,OAAO,YAAY;QACrB;;IAGA,IAAA,IAAI;IACF,QAAA,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC;YACjG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;gBAE1B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjC,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE;gBACnE,IAAI,MAAM,EAAE;IACV,gBAAA,aAAa,CAAC,MAAM,GAAG,MAAM;oBAC7B,gBAAgB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;oBACzE,MAAM,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,MAAM,CAAA,cAAA,EAAiB,UAAU,CAAC,YAAY,CAAA,CAAE,CAAC;IAC/E,gBAAA,OAAO,MAAM;gBACf;YACF;QACF;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;QAC5C;;IAGA,IAAA,MAAM,SAAS,GAAG,cAAc,EAAE;IAClC,IAAA,aAAa,CAAC,MAAM,GAAG,SAAS;QAChC,gBAAgB,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;IAC5E,IAAA,MAAM,CAAC,IAAI,CAAC,cAAc,SAAS,CAAA,CAAE,CAAC;IACtC,IAAA,OAAO,SAAS;IAClB;IAEA;IACA,SAAS,cAAc,GAAA;QACrB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;cACnD,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACpC,UAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAA,IAAA,EAAO,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,MAAM,EAAE;IACtC;IAEA;IACA,SAAS,gBAAgB,CAAC,WAAmB,EAAE,MAAe,EAAA;IAC5D,IAAA,OAAO,CAAA,WAAA,EAAc,WAAW,CAAA,EAAG,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,EAAE,EAAE;IACjE;IAEA;IACA,SAAS,gBAAgB,CAAC,WAAmB,EAAE,MAAe,EAAA;IAC5D,IAAA,IAAI;IACF,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE;QAC1E;IAAE,IAAA,OAAA,EAAA,EAAM;IACN,QAAA,OAAO,EAAE;QACX;IACF;IAEA;aACgB,gBAAgB,CAAC,WAAmB,EAAE,MAAe,EAAE,MAAe,EAAA;IACpF,IAAA,IAAI;YACF,IAAI,MAAM,EAAE;IACV,YAAA,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YACrE;iBAAO;gBACL,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAChE;QACF;IAAE,IAAA,OAAA,EAAA,EAAM;;QAER;IACF;;IC3gBA,IAAI,YAAY,GAA4B,IAAI;IAEhD;IACA,SAAS,OAAO,CAAC,MAAsB,EAAA;;QAErC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;QACpD,OAAO;AACY,mBAAA,EAAA,MAAM,CAAC,YAAY,CAAA;2BACb,MAAM,CAAA;;;;;AAKP,wBAAA,EAAA,MAAM,CAAC,KAAK,CAAA;GACnC;IACH;IAEA;IACA,SAAS,WAAW,CAAC,GAAW,EAAE,MAAc,EAAA;;QAE9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,qDAAqD,CAAC;QAC9E,IAAI,CAAC,KAAK,EAAE;IACV,QAAA,OAAO,GAAG;QACZ;QACA,MAAM,KAAK,GAAG,CAAC,CAAS,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAChD,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAChD,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAChD,IAAA,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;IAClH;IAEA;IACA,SAAS,SAAS,CAAC,MAAsB,EAAA;QACvC,OAAO;;;IAGL,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2nBlB;IACD;IAEA;;IAEG;IACG,SAAU,YAAY,CAAC,MAAsB,EAAA;;IAEjD,IAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE;YACjD;QACF;IAEA,IAAA,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IAC9C,IAAA,YAAY,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;IAC7C,IAAA,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;IAC5C,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;IACzC;IAmBA;;IAEG;aACa,YAAY,GAAA;IAC1B,IAAA,IAAI,YAAY,IAAI,YAAY,CAAC,UAAU,EAAE;IAC3C,QAAA,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC;YACjD,YAAY,GAAG,IAAI;QACrB;;IAEA,IAAA,QAAQ,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/E;;ICntBA;;IAEG;IAEH;IASA;aACgB,IAAI,GAAA;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;IACtD,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;QAC5B;;QAEA,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;IACnE,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;IAClC,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;IACzC,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvB,IAAA,CAAC,CAAC;IACJ;IAEA;IACM,SAAU,UAAU,CAAC,IAAY,EAAA;IACrC,IAAA,MAAM,GAAG,GAA2B;IAClC,QAAA,GAAG,EAAE,OAAO;IACZ,QAAA,GAAG,EAAE,MAAM;IACX,QAAA,GAAG,EAAE,MAAM;IACX,QAAA,GAAG,EAAE,QAAQ;IACb,QAAA,GAAG,EAAE,QAAQ;SACd;IACD,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACxD;IAEA;IACM,SAAU,QAAQ,CACtB,EAAK,EACL,KAAa,EAAA;QAEb,IAAI,KAAK,GAAyC,IAAI;QACtD,OAAO,UAAyB,GAAG,IAAmB,EAAA;IACpD,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,YAAY,CAAC,KAAK,CAAC;YACrB;IACA,QAAA,KAAK,GAAG,UAAU,CAAC,MAAK;IACtB,YAAA,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;gBACpB,KAAK,GAAG,IAAI;YACd,CAAC,EAAE,KAAK,CAAC;IACX,IAAA,CAAC;IACH;IAUA;aACgB,GAAG,GAAA;IACjB,IAAA,OAAO,IAAI,CAAC,GAAG,EAAE;IACnB;;ICzDA;IAEA;IACM,SAAU,cAAc,CAAC,MAAsB,EAAE,OAAmB,EAAA;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9C,IAAA,QAAQ,CAAC,EAAE,GAAG,cAAc;IAC5B,IAAA,QAAQ,CAAC,SAAS,GAAG,8BAA8B,MAAM,CAAC,QAAQ,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,EAAE;QACzG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QAC5C,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;IACjD,IAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;IACvC,IAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC;;IAGtC,IAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY;;QAGxC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;IAC7C,IAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC;;QAGlD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC,KAAI;IACzC,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;gBACtC,CAAC,CAAC,cAAc,EAAE;IAClB,YAAA,cAAc,EAAE;YAClB;IACF,IAAA,CAAC,CAAC;IAEF,IAAA,OAAO,QAAQ;IACjB;IAEA;IAEA;IACM,SAAU,gBAAgB,CAAC,MAAsB,EAAA;;QAYrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9C,IAAA,QAAQ,CAAC,EAAE,GAAG,YAAY;IAC1B,IAAA,QAAQ,CAAC,SAAS,GAAG,mCAAmC,MAAM,CAAC,QAAQ,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,qBAAqB;;QAGjI,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,YAAY;QAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IAC9C,IAAA,OAAO,CAAC,SAAS,GAAG,mBAAmB;IACvC,IAAA,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;QAElC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,qBAAqB;;QAGzC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IACnD,IAAA,UAAU,CAAC,SAAS,GAAG,iBAAiB;QACxC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACpD,IAAA,UAAU,CAAC,SAAS,GAAG,CAAA,gQAAA,CAAkQ;;QAGzR,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IACpD,IAAA,WAAW,CAAC,SAAS,GAAG,2CAA2C;QACnE,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAChD,IAAA,WAAW,CAAC,SAAS,GAAG,CAAA,iOAAA,CAAmO;IAC3P,IAAA,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACzC,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9C,IAAA,CAAC,CAAC;;QAGF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IACjD,IAAA,QAAQ,CAAC,SAAS,GAAG,wCAAwC;QAC7D,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAA,QAAQ,CAAC,SAAS,GAAG,CAAA,qQAAA,CAAuQ;IAC5R,IAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACtC,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9C,IAAA,CAAC,CAAC;IAEF,IAAA,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;IAC/B,IAAA,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC;IAChC,IAAA,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;IAC7B,IAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;IAC3B,IAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;;QAG3B,MAAM,iBAAiB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACvD,IAAA,iBAAiB,CAAC,EAAE,GAAG,cAAc;IACrC,IAAA,iBAAiB,CAAC,SAAS,GAAG,cAAc;;QAG5C,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAClD,IAAA,YAAY,CAAC,SAAS,GAAG,6CAA6C;QACtE,YAAY,CAAC,SAAS,GAAG;;+CAEoB,CAAC,CAAC,eAAe,CAAC,CAAA;;;UAGvD,CAAC,CAAC,OAAO,CAAC;;;;GAIjB;IACD,IAAA,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC;;QAG3C,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,mBAAmB,CAAC;QAC/D,IAAI,OAAO,EAAE;IACX,QAAA,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACrC,YAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACzD,QAAA,CAAC,CAAC;QACJ;;QAGA,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACzC,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC7E,QAAA,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,2BAA2B,CAAC;YAC1D,IAAI,QAAQ,EAAE;;gBAEZ,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAC;YAC5D;IACF,IAAA,CAAC,CAAC;;QAGF,IAAI,cAAc,GAA6B,IAAI;IACnD,IAAA,IAAI,MAAM,CAAC,kBAAkB,EAAE;YAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACjD,QAAA,WAAW,CAAC,SAAS,GAAG,kBAAkB;YAE1C,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IACpD,QAAA,aAAa,CAAC,SAAS,GAAG,yBAAyB;IACnD,QAAA,aAAa,CAAC,WAAW,GAAG,IAAI;IAEhC,QAAA,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IACjD,QAAA,cAAc,CAAC,EAAE,GAAG,qBAAqB;IACzC,QAAA,cAAc,CAAC,SAAS,GAAG,qBAAqB;YAChD,cAAc,CAAC,SAAS,GAAG,CAAA,iBAAA,EAAoB,CAAC,CAAC,cAAc,CAAC,CAAA,SAAA,CAAW;;IAG3E,QAAA,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;IAC7C,YAAA,MAAM,UAAU,GAAG,cAAe,CAAC,KAAK;IACxC,YAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,oBAAoB,EAAE;IAC3D,gBAAA,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS;IAClE,aAAA,CAAC,CAAC;IACL,QAAA,CAAC,CAAC;IAEF,QAAA,WAAW,CAAC,WAAW,CAAC,aAAa,CAAC;IACtC,QAAA,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC;;IAGvC,QAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;IAC5B,QAAA,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC;IACvC,QAAA,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC;QACnC;aAAO;IACL,QAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;IAC5B,QAAA,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC;QACzC;;QAGA,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,IAAA,SAAS,CAAC,SAAS,GAAG,gBAAgB;QAEtC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;IAClD,IAAA,OAAO,CAAC,EAAE,GAAG,WAAW;IACxB,IAAA,OAAO,CAAC,SAAS,GAAG,WAAW;QAC/B,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IACrD,IAAA,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;IACjC,IAAA,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAErC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,IAAA,OAAO,CAAC,EAAE,GAAG,cAAc;IAC3B,IAAA,OAAO,CAAC,SAAS,GAAG,cAAc;QAClC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,IAAA,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC;IACxC,IAAA,OAAO,CAAC,SAAS,GAAG,CAAA,8QAAA,CAAgR;IAEpS,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAC9B,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAC9B,IAAA,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;;QAG/B,IAAI,QAAQ,GAAuB,IAAI;IACvC,IAAA,IAAI,MAAM,CAAC,SAAS,EAAE;IACpB,QAAA,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC3C,QAAA,QAAQ,CAAC,SAAS,GAAG,eAAe;IACpC,QAAA,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC;YACjC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;;IAEhC,QAAA,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC;QAC5C;;QAGA,IAAI,SAAS,GAAuB,IAAI;IAExC,IAAA,SAAS,WAAW,GAAA;YAClB,IAAI,SAAS,EAAE;IACb,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAChC,YAAA,OAAO,SAAS;YAClB;YACA,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACxC,QAAA,EAAE,CAAC,SAAS,GAAG,aAAa;YAC5B,EAAE,CAAC,SAAS,GAAG;;;;KAId;IACD,QAAA,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,SAAS,GAAG,EAAE;IACd,QAAA,OAAO,EAAE;QACX;IAEA,IAAA,SAAS,WAAW,GAAA;IAClB,QAAA,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE;IACrC,YAAA,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;gBAC3C,SAAS,GAAG,IAAI;YAClB;QACF;QAEA,OAAO;IACL,QAAA,MAAM,EAAE,QAAQ;YAChB,iBAAiB;YACjB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAY;YACZ,WAAW;YACX,WAAW;SACZ;IACH;IAEA;IAEA;IACM,SAAU,UAAU,CAAC,QAAqB,EAAE,QAAqB,EAAA;QACrE,IAAI,QAAQ,GAAG,KAAK;QACpB,IAAI,MAAM,GAAG,CAAC;QACd,IAAI,MAAM,GAAG,CAAC;QACd,IAAI,OAAO,GAAG,CAAC;QACf,IAAI,OAAO,GAAG,CAAC;IAEf,IAAA,MAAM,WAAW,GAAG,CAAC,CAAa,KAAI;YACpC,QAAQ,GAAG,IAAI;IACf,QAAA,MAAM,GAAG,CAAC,CAAC,OAAO;IAClB,QAAA,MAAM,GAAG,CAAC,CAAC,OAAO;IAClB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE;IAC7C,QAAA,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI;IAC5B,QAAA,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG;IAC3B,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;IACnD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IACjD,IAAA,CAAC;IAED,IAAA,MAAM,WAAW,GAAG,CAAC,CAAa,KAAI;IACpC,QAAA,IAAI,CAAC,QAAQ;gBAAE;IACf,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO;;YAE7B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW;YACrD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAY;IACvD,QAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;IAC7B,QAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAC9B,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA,EAAA,CAAI;YAC3D,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA,EAAA,CAAI;IAC5D,IAAA,CAAC;QAED,MAAM,SAAS,GAAG,MAAK;YACrB,QAAQ,GAAG,KAAK;IAChB,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACtD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;IACpD,IAAA,CAAC;IAED,IAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;;IAGnD,IAAA,OAAO,MAAK;IACV,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACtD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACtD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;IACpD,IAAA,CAAC;IACH;IAEA;IAEA;aACgB,gBAAgB,CAAC,SAAsB,EAAE,IAAY,EAAE,SAAiB,EAAA;QACtF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,uBAAuB;QAE3C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,iBAAiB;IACpC,IAAA,MAAM,CAAC,WAAW,GAAG,IAAI;QAEzB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,IAAA,IAAI,CAAC,SAAS,GAAG,eAAe;IAChC,IAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC;IAExC,IAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IACzB,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAE9B,IAAA,OAAO,OAAO;IAChB;IAEA;IACM,SAAU,cAAc,CAAC,SAAsB,EAAE,IAAY,EAAE,SAAiB,EAAE,QAAmC,EAAA;QACzH,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,qBAAqB;QAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,iBAAiB;;QAEpC,IAAI,QAAQ,EAAE;IACZ,QAAA,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;QACnC;aAAO;IACL,QAAA,MAAM,CAAC,WAAW,GAAG,IAAI;QAC3B;QAEA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,IAAA,IAAI,CAAC,SAAS,GAAG,eAAe;IAChC,IAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC;IAExC,IAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IACzB,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAE9B,IAAA,OAAO,OAAO;IAChB;IAEA;IACM,SAAU,mBAAmB,CAAC,SAAsB,EAAE,SAAiB,EAAA;QAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,qBAAqB;QAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,iBAAiB;IACpC,IAAA,MAAM,CAAC,SAAS,GAAG,EAAE;QAErB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,IAAA,IAAI,CAAC,SAAS,GAAG,eAAe;IAChC,IAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC;IAExC,IAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IACzB,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAE9B,IAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;IAC5B;IAEA;IAEA;IACM,SAAU,aAAa,CAAC,OAAoB,EAAE,OAAoB,EAAA;;QAEtE,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC;IACtD,IAAA,IAAI,QAAQ;YAAE,QAAQ,CAAC,MAAM,EAAE;IAE/B,IAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAEtC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,IAAA,SAAS,CAAC,SAAS,GAAG,oCAAoC;;QAG1D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,qBAAqB;QAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IAChD,IAAA,SAAS,CAAC,SAAS,GAAG,oBAAoB;IAC1C,IAAA,SAAS,CAAC,WAAW,GAAG,CAAA,GAAA,EAAM,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;QAExE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IAC5C,IAAA,KAAK,CAAC,SAAS,GAAG,oBAAoB;IACtC,IAAA,KAAK,CAAC,WAAW,GAAG,GAAG;IAEvB,IAAA,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;IAC7B,IAAA,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;;IAGzB,IAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACpC,QAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,wBAAwB,CAAC;IACtD,IAAA,CAAC,CAAC;;QAGF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,IAAA,IAAI,CAAC,SAAS,GAAG,mBAAmB;IAEpC,IAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB;YAElC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,uBAAuB;IACxC,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,IAAI,MAAM;IAExD,QAAA,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,YAAA,OAAO,CAAC,SAAS,GAAG,0BAA0B;IAC9C,YAAA,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO;IACjC,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAC3B;YAEA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,uBAAuB;YACxC,MAAM,SAAS,GAAa,EAAE;YAC9B,IAAI,GAAG,CAAC,UAAU;IAAE,YAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IAClD,QAAA,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,GAAG,CAAC,UAAU,CAAA,CAAE,CAAC;IACzE,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;IAAE,YAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC;YACnF,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAExC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACtB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACtB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACxB;IAEA,IAAA,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;IAC7B,IAAA,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;;QAG3B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC;QACtD,IAAI,MAAM,EAAE;IACV,QAAA,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;QACzC;aAAO;IACL,QAAA,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;QAChC;IACF;IAaA;IACM,SAAU,iBAAiB,CAC/B,MAAmB,EACnB,KAAwB,EACxB,QAA8B,EAC9B,QAA8B,EAC9B,SAAkB,EAAA;IAElB,IAAA,MAAM,CAAC,SAAS,GAAG,EAAE;IAErB,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC3C,QAAA,KAAK,CAAC,SAAS,GAAG,0BAA0B;YAC5C,KAAK,CAAC,SAAS,GAAG;;AAET,WAAA,EAAa,CAAC,CAAC,eAAe,CAAC,CAAA;KACvC;IACD,QAAA,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;YACzB;QACF;IAEA,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACxC,QAAA,EAAE,CAAC,SAAS,GAAG,kBAAkB;YAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,wBAAwB;YAEzC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,sBAAsB;YACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE;YAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,QAAA,MAAM,CAAC,SAAS,GAAG,wBAAwB;YAC3C,MAAM,SAAS,GAAa,EAAE;IAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,YAAY,CAAA,IAAA,CAAM,CAAC;YAC/E,IAAI,IAAI,CAAC,eAAe;IAAE,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;iBACzD,IAAI,IAAI,CAAC,SAAS;IAAE,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACvD,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAE1C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACtB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,QAAA,SAAS,CAAC,SAAS,GAAG,2BAA2B;;YAGjD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,QAAA,SAAS,CAAC,SAAS,GAAG,+CAA+C;YACrE,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpD,QAAA,SAAS,CAAC,SAAS,GAAG,CAAA,2TAAA,CAA6T;YACnV,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;gBACxC,CAAC,CAAC,eAAe,EAAE;IACnB,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnB,QAAA,CAAC,CAAC;;YAGF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,QAAA,SAAS,CAAC,SAAS,GAAG,+CAA+C;YACrE,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpD,QAAA,SAAS,CAAC,SAAS,GAAG,CAAA,sTAAA,CAAwT;YAC9U,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;gBACxC,CAAC,CAAC,eAAe,EAAE;IACnB,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnB,QAAA,CAAC,CAAC;IAEF,QAAA,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IAChC,QAAA,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IAEhC,QAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;IACpB,QAAA,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;IACzB,QAAA,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACxB;IACF;IAEA;IACM,SAAU,cAAc,CAAC,SAAsB,EAAA;IACnD,IAAA,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY;IAC9C;IAEA;IACA,SAAS,UAAU,CAAC,SAAiB,EAAA;IACnC,IAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IAC7B,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAChD,IAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAClD,IAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,EAAE;IACtB;;ICnhBA,MAAM,cAAc,GAAG,cAAc;IACrC,MAAM,YAAY,GAAG,GAAG;IACxB,MAAM,UAAU,GAAG,EAAE;IAErB;IACA,SAAS,UAAU,CAAC,WAAmB,EAAA;IACrC,IAAA,OAAO,CAAA,EAAG,cAAc,CAAA,EAAG,WAAW,EAAE;IAC1C;IAEA;;IAEG;IACG,SAAU,YAAY,CAAC,WAAmB,EAAE,QAAuB,EAAA;IACvE,IAAA,IAAI;;YAEF,IAAI,OAAO,GAAG,QAAQ;IACtB,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,YAAY,EAAE;IACjC,YAAA,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,UAAU,CAAA,MAAA,EAAS,OAAO,CAAC,MAAM,CAAA,EAAA,CAAI,CAAC;YACtE;IAEA,QAAA,MAAM,IAAI,GAAc;IACtB,YAAA,QAAQ,EAAE,OAAO;IACjB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB;IACD,QAAA,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrE;QAAE,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,oBAAoB,EAAE;IACzD,YAAA,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC;YACtD;iBAAO;IACL,YAAA,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7B;QACF;IACF;IAEA;;IAEG;IACG,SAAU,YAAY,CAAC,WAAmB,EAAA;IAC9C,IAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,EAAE;IACR,YAAA,OAAO,EAAE;YACX;YACA,MAAM,IAAI,GAAc,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACvC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;IAC1C,YAAA,OAAO,EAAE;YACX;IACA,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,mBAAA,EAAsB,WAAW,CAAA,OAAA,EAAU,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;YAC9E,OAAO,IAAI,CAAC,QAAQ;QACtB;QAAE,OAAO,CAAC,EAAE;IACV,QAAA,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,QAAA,OAAO,EAAE;QACX;IACF;IAEA;;IAEG;IACG,SAAU,aAAa,CAAC,WAAmB,EAAA;IAC/C,IAAA,IAAI;YACF,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAClD;QAAE,OAAO,CAAC,EAAE;IACV,QAAA,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5B;IACF;;ICvEA;;;;;IAKG;IAGH;IACA,MAAM,iBAAiB,GAAG,gBAAgB;IAE1C;IACA,MAAM,kBAAkB,GAAG,iBAAiB;IAE5C;;;;IAIG;IACG,SAAU,cAAc,CAAC,IAAY,EAAA;IACzC,IAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;IAAE,QAAA,OAAO,EAAE;;QAGhD,MAAM,UAAU,GAAa,EAAE;QAC/B,IAAI,SAAS,GAAG,IAAI;;IAGpB,IAAA,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,KAAI;IAC/E,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM;YAC7B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAA,iBAAA,EAAoB,UAAU,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;YACrE,UAAU,CAAC,IAAI,CAAC,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAA,EAAI,WAAW,CAAA,aAAA,CAAe,CAAC;IAC/F,QAAA,OAAO,CAAA,EAAG,iBAAiB,CAAA,EAAG,GAAG,MAAM;IACzC,IAAA,CAAC,CAAC;;QAGF,MAAM,WAAW,GAAa,EAAE;IAChC,IAAA,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,IAAI,KAAI;IAC7D,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM;YAC9B,WAAW,CAAC,IAAI,CAAC,CAAA,iCAAA,EAAoC,UAAU,CAAC,IAAI,CAAC,CAAA,OAAA,CAAS,CAAC;IAC/E,QAAA,OAAO,CAAA,EAAG,kBAAkB,CAAA,EAAG,GAAG,MAAM;IAC1C,IAAA,CAAC,CAAC;;IAGF,IAAA,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;;QAGjC,SAAS,GAAG,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC;QACzE,SAAS,GAAG,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,EAAE,WAAW,CAAC;;QAG3E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,MAAM,MAAM,GAAa,EAAE;QAC3B,IAAI,MAAM,GAAG,KAAK;IAClB,IAAA,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,YAAY,GAAG,KAAK;QACxB,IAAI,eAAe,GAAa,EAAE;IAElC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACrC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;;IAGrB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE;IACxF,YAAA,cAAc,EAAE;IAChB,YAAA,SAAS,EAAE;IACX,YAAA,eAAe,EAAE;IACjB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjB;YACF;;YAGA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACnD,IAAI,YAAY,EAAE;IAChB,YAAA,cAAc,EAAE;IAChB,YAAA,SAAS,EAAE;IACX,YAAA,eAAe,EAAE;gBACjB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM;IACpC,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,mBAAmB,KAAK,CAAA,EAAA,EAAK,YAAY,CAAC,CAAC,CAAC,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,CAAG,CAAC;gBACjF;YACF;;YAGA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;YAC7C,IAAI,UAAU,EAAE;IACd,YAAA,cAAc,EAAE;IAChB,YAAA,SAAS,EAAE;gBACX,IAAI,CAAC,YAAY,EAAE;oBACjB,YAAY,GAAG,IAAI;IACnB,gBAAA,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC;gBACvD;IACA,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,GAAA,EAAM,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA,IAAA,CAAM,CAAC;gBACpD;YACF;iBAAO,IAAI,YAAY,EAAE;IACvB,YAAA,eAAe,EAAE;YACnB;;YAGA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC5C,IAAI,OAAO,EAAE;IACX,YAAA,cAAc,EAAE;IAChB,YAAA,eAAe,EAAE;IACjB,YAAA,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE;IAChC,gBAAA,SAAS,EAAE;oBACX,MAAM,GAAG,IAAI;oBACb,QAAQ,GAAG,IAAI;IACf,gBAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;gBACvC;IACA,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,KAAA,CAAO,CAAC;gBACnD;YACF;;YAGA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;YAC3C,IAAI,OAAO,EAAE;IACX,YAAA,cAAc,EAAE;IAChB,YAAA,eAAe,EAAE;IACjB,YAAA,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE;IAChC,gBAAA,SAAS,EAAE;oBACX,MAAM,GAAG,IAAI;oBACb,QAAQ,GAAG,IAAI;IACf,gBAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;gBACvC;IACA,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,KAAA,CAAO,CAAC;gBACnD;YACF;;IAGA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;IACtB,YAAA,cAAc,EAAE;IAChB,YAAA,SAAS,EAAE;gBACX;YACF;;YAGA,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE;IAC9C,YAAA,cAAc,EAAE;IAChB,YAAA,SAAS,EAAE;IACX,YAAA,eAAe,EAAE;IACjB,YAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;gBACrC;YACF;;IAGA,QAAA,SAAS,EAAE;IACX,QAAA,eAAe,EAAE;YACjB,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1C;IAEA,IAAA,cAAc,EAAE;IAChB,IAAA,SAAS,EAAE;IACX,IAAA,eAAe,EAAE;IAEjB,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;;QAKxB,SAAS,YAAY,CAAC,IAAY,EAAA;;YAEhC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,qBAAqB,CAAC;;YAExD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC;YAChD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC;;YAE3D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC;;IAElD,QAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAI;;IAEpE,YAAA,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;IACrD,YAAA,OAAO,CAAA,6BAAA,EAAgC,OAAO,CAAA,4CAAA,EAA+C,QAAQ,MAAM;IAC7G,QAAA,CAAC,CAAC;IACF,QAAA,OAAO,IAAI;QACb;;IAGA,IAAA,SAAS,cAAc,GAAA;IACrB,QAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;IAC9B,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,oBAAA,EAAuB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,IAAA,CAAM,CAAC;gBACtE,eAAe,GAAG,EAAE;YACtB;QACF;;IAGA,IAAA,SAAS,SAAS,GAAA;YAChB,IAAI,MAAM,EAAE;IACV,YAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;gBAClD,MAAM,GAAG,KAAK;gBACd,QAAQ,GAAG,EAAE;YACf;QACF;;IAGA,IAAA,SAAS,eAAe,GAAA;YACtB,IAAI,YAAY,EAAE;IAChB,YAAA,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;gBAC5B,YAAY,GAAG,KAAK;YACtB;QACF;IACF;IAEA;IACA,SAAS,mBAAmB,CAAC,IAAY,EAAE,MAAc,EAAE,YAAsB,EAAA;QAC/E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,KAAI;YACnF,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;IAC1C,IAAA,CAAC,CAAC;IACJ;IAEA;IACA,SAAS,WAAW,CAAC,GAAW,EAAA;QAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACnD;;IC5KA,IAAIA,QAAM,GAA0B,IAAI;IACxC,IAAI,QAAQ,GAAkB,EAAE;IAChC,IAAIC,mBAAiB,GAAuB,IAAI;IAChD,IAAIC,SAAO,GAA+B,IAAI;IAC9C,IAAIC,SAAO,GAAuB,IAAI;IACtC,IAAIC,UAAQ,GAAuB,IAAI;IACvC,IAAIC,gBAAc,GAA6B,IAAI;IACnD,IAAIC,cAAY,GAAuB,IAAI;IAC3C,IAAIC,eAAa,GAA+B,IAAI;IACpD,IAAIC,eAAa,GAAwB,IAAI;IAC7C,IAAI,SAAS,GAAG,KAAK;IAErB;IACA,IAAI,iBAAqC;IAEzC;IACA,IAAI,MAAM,GAAG,KAAK;IAElB;;IAEG;IACG,SAAU,QAAQ,CACtB,GAAmB,EACnB,GASC,EAAA;QAEDR,QAAM,GAAG,GAAG;IACZ,IAAAC,mBAAiB,GAAG,GAAG,CAAC,iBAAiB;IACzC,IAAAC,SAAO,GAAG,GAAG,CAAC,OAAO;IACrB,IAAAC,SAAO,GAAG,GAAG,CAAC,OAAO;IACrB,IAAAC,UAAQ,GAAG,GAAG,CAAC,QAAQ;IACvB,IAAAC,gBAAc,GAAG,GAAG,CAAC,cAAc;IACnC,IAAAC,cAAY,GAAG,GAAG,CAAC,YAAY;IAC/B,IAAAC,eAAa,GAAG,GAAG,CAAC,WAAW;IAC/B,IAAAC,eAAa,GAAG,GAAG,CAAC,WAAW;;IAG/B,IAAA,iBAAiB,GAAG,GAAG,CAAC,UAAU;IAClC,IAAA,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,kBAAkB;;IAGrD,IAAA,cAAc,EAAE;;IAGhB,IAAA,IAAI,GAAG,CAAC,kBAAkB,IAAIH,gBAAc,EAAE;IAC5C,QAAA,cAAc,EAAE;QAClB;IACF;IAEA;;;IAGG;IACI,eAAe,eAAe,GAAA;IACnC,IAAA,IAAI,CAACL,QAAM,IAAI,CAACC,mBAAiB;YAAE;;QAGnC,MAAM,UAAU,EAAE;;QAGlB,MAAM,sBAAsB,EAAE;;IAG9B,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,MAAM,MAAM,GAAG,YAAY,CAACD,QAAM,CAAC,WAAW,CAAC;IAC/C,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,QAAQ,GAAG,MAAM;IACjB,YAAA,aAAa,EAAE;gBACf,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,MAAM,CAAC,MAAM,CAAA,IAAA,CAAM,CAAC;YAC7C;QACF;IACF;IAEA;;IAEG;IACH,eAAe,sBAAsB,GAAA;IACnC,IAAA,IAAI,CAACA,QAAM,IAAI,CAACC,mBAAiB;YAAE;IAEnC,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE;IAC1B,IAAA,IAAI,CAAC,MAAM;YAAE;IAEb,IAAA,IAAI;IACF,QAAA,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC;YACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;;IAE9B,YAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM;oBAC5C,EAAE,EAAE,IAAI,EAAE;IACV,gBAAA,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,MAAM,GAAG,MAAM,GAAG,IAAa;oBACzD,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IAC9C,aAAA,CAAC,CAAC;IAEH,YAAA,aAAa,EAAE;gBACf,MAAM,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,QAAQ,CAAC,MAAM,CAAA,MAAA,CAAQ,CAAC;;IAG7C,YAAA,YAAY,CAACD,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;YAC5C;QACF;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;QACjC;IACF;IAEA;IACA,SAAS,cAAc,GAAA;IACrB,IAAA,IAAI,CAACE,SAAO,IAAI,CAACC,SAAO;YAAE;QAE1BA,SAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,UAAU,EAAE,CAAC;QAErDD,SAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAgB,KAAI;YACvD,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACpC,CAAC,CAAC,cAAc,EAAE;IAClB,YAAA,UAAU,EAAE;YACd;IACF,IAAA,CAAC,CAAC;QAEFA,SAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,kBAAkB,EAAE,CAAC;QAE7D,IAAIE,UAAQ,EAAE;YACZA,UAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,WAAW,EAAE,CAAC;QACzD;IACF;IAEA;IACA,SAAS,kBAAkB,GAAA;IACzB,IAAA,IAAI,CAACD,SAAO,IAAI,CAACD,SAAO;YAAE;IAC1B,IAAA,MAAM,OAAO,GAAGA,SAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;IAC/C,IAAA,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB,QAAAC,SAAO,CAAC,eAAe,CAAC,UAAU,CAAC;QACrC;aAAO;IACL,QAAAA,SAAO,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC;QAC1C;IACF;IAEA;IACA,eAAe,UAAU,GAAA;IACvB,IAAA,IAAI,CAACD,SAAO,IAAI,CAACF,QAAM,IAAI,SAAS;YAAE;QAEtC,MAAM,IAAI,GAAGE,SAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QACjC,IAAI,IAAI,KAAK,EAAE;YAAE;IAEjB,IAAAA,SAAO,CAAC,KAAK,GAAG,EAAE;IAClB,IAAA,kBAAkB,EAAE;IACpB,IAAAA,SAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QAE7B,SAAS,GAAG,IAAI;IAChB,IAAA,kBAAkB,EAAE;;IAGpB,IAAA,IAAI,CAACF,QAAM,CAAC,MAAM,EAAE;YAClB,MAAM,UAAU,EAAE;QACpB;;IAGA,IAAA,MAAM,aAAa,GAAG,GAAG,EAAE;IAC3B,IAAA,IAAIC,mBAAiB;IAAE,QAAA,gBAAgB,CAACA,mBAAiB,EAAE,IAAI,EAAE,aAAa,CAAC;QAC/E,MAAM,OAAO,GAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE;IAClG,IAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAEtB,IAAA,IAAIG,UAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;IAAE,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa;IAC3E,IAAA,IAAIH,mBAAiB;YAAE,cAAc,CAACA,mBAAiB,CAAC;;IAGxD,IAAA,IAAIM,eAAa;IAAE,QAAAA,eAAa,EAAE;IAClC,IAAA,IAAIN,mBAAiB;YAAE,cAAc,CAACA,mBAAiB,CAAC;;IAGxD,IAAA,IAAI;IACF,QAAA,IAAI,SAAiB;IACrB,QAAA,MAAM,WAAW,GAAG,GAAG,EAAE;IACzB,QAAA,MAAM,YAAY,GAAG,MAAM,KAAK,iBAAiB,KAAK,SAAS,IAAID,QAAM,CAAC,UAAU,KAAK,SAAS,CAAC;IAEnG,QAAA,IAAIA,QAAM,CAAC,SAAS,EAAE;gBACpB,SAAS,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC;YACtE;iBAAO;IACL,YAAA,SAAS,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC;YACrC;IAEA,QAAA,IAAIQ,eAAa;IAAE,YAAAA,eAAa,EAAE;IAElC,QAAA,IAAI,CAACR,QAAM,CAAC,SAAS,IAAIC,mBAAiB,EAAE;gBAC1C,cAAc,CAACA,mBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC;YAC3E;YACA,MAAM,KAAK,GAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE;IACjG,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAEpB,QAAA,YAAY,CAACD,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC1C,QAAA,IAAIC,mBAAiB;gBAAE,cAAc,CAACA,mBAAiB,CAAC;;IAGxD,QAAA,IAAI,YAAY;IAAE,YAAA,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC;QACtD;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,IAAIO,eAAa;IAAE,YAAAA,eAAa,EAAE;IAElC,QAAA,MAAM,MAAM,GAAG,GAAG,YAAY,QAAQ,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC;YACtE,IAAIP,mBAAiB,EAAE;gBACrB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACjD,YAAA,WAAW,CAAC,SAAS,GAAG,qBAAqB;gBAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,YAAA,MAAM,CAAC,SAAS,GAAG,iBAAiB;IACpC,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;IAC9B,YAAA,MAAM,CAAC,WAAW,GAAG,CAAA,EAAA,EAAK,MAAM,EAAE;IAClC,YAAA,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC;IAC/B,YAAAA,mBAAiB,CAAC,WAAW,CAAC,WAAW,CAAC;YAC5C;YACA,MAAM,CAAC,KAAK,CAAC,CAAA,iBAAA,EAAoBD,QAAM,CAAC,WAAW,CAAA,CAAE,EAAE,GAAG,CAAC;QAC7D;gBAAU;YACR,SAAS,GAAG,KAAK;IACjB,QAAA,kBAAkB,EAAE;QACtB;IACF;IAEA;IACA,eAAe,iBAAiB,CAAC,IAAY,EAAE,WAAmB,EAAE,YAAqB,EAAA;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,QAAQ,GAAuB,IAAI;YACvC,IAAI,WAAW,GAAG,EAAE;YACpB,IAAI,aAAa,GAAG,KAAK;IAEzB,QAAA,cAAc,CACZ,IAAI,EACJ,CAAC,KAAa,KAAI;gBAChB,WAAW,IAAI,KAAK;IACpB,YAAA,IAAI,CAAC,aAAa,IAAIC,mBAAiB,EAAE;IACvC,gBAAA,IAAIO,eAAa;IAAE,oBAAAA,eAAa,EAAE;oBAClC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAACP,mBAAiB,EAAE,WAAW,CAAC;oBACtE,QAAQ,GAAG,MAAM;oBACjB,aAAa,GAAG,IAAI;gBACtB;IACA,YAAA,IAAI,QAAQ;IAAE,gBAAA,QAAQ,CAAC,WAAW,GAAG,WAAW;IAChD,YAAA,IAAIA,mBAAiB;oBAAE,cAAc,CAACA,mBAAiB,CAAC;YAC1D,CAAC,EACD,MAAK;IACH,YAAA,IAAI,CAAC,aAAa,IAAI,WAAW,KAAK,EAAE,EAAE;IACxC,gBAAA,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC7C;gBACF;gBACA,IAAI,QAAQ,IAAI,WAAW;IAAE,gBAAA,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;gBAC7E,OAAO,CAAC,WAAW,CAAC;IACtB,QAAA,CAAC,EACD,CAAC,KAAe,KAAI;IAClB,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;IAC1B,gBAAA,IAAI,QAAQ;IAAE,oBAAA,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC;oBACjG,OAAO,CAAC,WAAW,CAAC;gBACtB;qBAAO;oBACL,MAAM,CAAC,KAAK,CAAC;gBACf;IACF,QAAA,CAAC,EACD,iBAAiB,EACjB,YAAY,CACb;IACH,IAAA,CAAC,CAAC;IACJ;IAEA;IACA,eAAe,qBAAqB,CAAC,OAAe,EAAE,KAAkB,EAAA;IACtE,IAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACjE,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,MAAM,UAAU,GAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;;IAAC,gBAAA,QAAC;IAChD,oBAAA,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;IAC9B,oBAAA,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;IACpB,oBAAA,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;IAC9B,oBAAA,UAAU,EAAE,CAAA,EAAA,GAAA,CAAC,CAAC,UAAU,mCAAI,CAAC;IAC7B,oBAAA,KAAK,EAAE,CAAA,EAAA,GAAA,CAAC,CAAC,KAAK,mCAAI,CAAC;IACnB,oBAAA,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;IACzB,iBAAA;IAAC,YAAA,CAAA,CAAC;IACH,YAAA,KAAK,CAAC,OAAO,GAAG,UAAU;gBAC1B,IAAIA,mBAAiB,EAAE;oBACrB,MAAM,SAAS,GAAGA,mBAAiB,CAAC,aAAa,CAAC,2BAA2B,CAAC;IAC9E,gBAAA,IAAI,SAAS;IAAE,oBAAA,aAAa,CAAC,SAAwB,EAAE,UAAU,CAAC;gBACpE;IACA,YAAA,IAAID,QAAM;IAAE,gBAAA,YAAY,CAACA,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;YACxD;QACF;QAAE,OAAO,GAAG,EAAE;IACZ,QAAA,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;QAC9B;IACF;IAEA;IACA,eAAe,cAAc,GAAA;IAC3B,IAAA,IAAI,CAACK,gBAAc;YAAE;IACrB,IAAA,IAAI;IACF,QAAA,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE;IACtC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE;YACvBA,gBAAc,CAAC,SAAS,GAAG,CAAA,iBAAA,EAAoB,CAAC,CAAC,cAAc,CAAC,CAAA,SAAA,CAAW;YAE3E,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAE,MAAA,GAAiB,CAAC,KAAI;IAC5D,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC/C,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9B,gBAAA,MAAM,CAAC,WAAW,GAAG,CAAA,EAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,EAAE;IACxD,gBAAA,IAAI,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,iBAAiB,CAAC;IAAE,oBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;IAC5G,gBAAAA,gBAAe,CAAC,WAAW,CAAC,MAAM,CAAC;oBACnC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;wBAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;gBACtF;IACF,QAAA,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAC,MAAM,CAAA,CAAE,CAAC;QAC/C;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,GAAG,CAAC;QAC7C;IACF;IAEA;IACA,SAAS,aAAa,GAAA;IACpB,IAAA,IAAI,CAACJ,mBAAiB;YAAE;QAExB,MAAM,cAAc,GAAGA,mBAAiB,CAAC,aAAa,CAAC,oBAAoB,CAAC;QAC5E,MAAM,IAAI,GAAGA,mBAAiB,CAAC,gBAAgB,CAAC,wBAAwB,CAAC;IACzE,IAAA,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAE/B,IAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;IAC1B,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;gBACvB,gBAAgB,CAACA,mBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC;YACjE;iBAAO;IACL,YAAA,MAAM,OAAO,GAAG,cAAc,CAACA,mBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC;gBAC7F,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;IAAE,gBAAA,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;YAChF;QACF;QAEA,cAAc,CAACA,mBAAiB,CAAC;IACjC,IAAA,IAAIG,UAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;IAAE,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa;QAE3E,IAAI,cAAc,IAAI,CAACH,mBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;IACjE,QAAAA,mBAAiB,CAAC,WAAW,CAAC,cAAc,CAAC;QAC/C;IACF;IAEA;IACA,SAAS,WAAW,GAAA;IAClB,IAAA,IAAI,CAACD,QAAM;YAAE;IACb,IAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAAE;QAElC,QAAQ,GAAG,EAAE;QACb,IAAIC,mBAAiB,EAAE;YACrB,MAAM,IAAI,GAAGA,mBAAiB,CAAC,gBAAgB,CAAC,wBAAwB,CAAC;IACzE,QAAA,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QACjC;IACA,IAAA,IAAIG,UAAQ;IAAE,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7C,IAAA,aAAa,CAACJ,QAAM,CAAC,WAAW,CAAC;;IAGjC,IAAA,MAAM,KAAK,GAAG,iBAAiB,EAAE;QACjC,YAAY,CAAC,KAAK,CAAC;QACnB,gBAAgB,CAACA,QAAM,CAAC,WAAW,EAAEA,QAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAE1D,IAAA,MAAM,CAAC,cAAc,CAACA,QAAM,CAAC,WAAW,CAAC;IACzC,IAAA,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,CAAA,CAAE,CAAC;IAClC;IAEA;IACA,SAAS,iBAAiB,GAAA;QACxB,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;cACnD,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACpC,UAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,OAAO,CAAA,IAAA,EAAO,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,MAAM,EAAE;IACtC;IAEA;IACM,SAAU,WAAW,CAAC,UAA8B,EAAA;QACxD,iBAAiB,GAAG,UAAU;IAC9B,IAAA,MAAM,GAAG,UAAU,KAAK,SAAS;QACjC,MAAM,CAAC,uBAAuB,CAAC,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,IAAI,CAAC;IACpD;IAEA;IAEA;IACO,eAAe,wBAAwB,GAAA;IAC5C,IAAA,IAAI,CAACM,cAAY,IAAI,CAACN,QAAM;YAAE;QAE9B,MAAM,MAAM,GAAGM,cAAY,CAAC,aAAa,CAAC,mBAAmB,CAAgB;IAC7E,IAAA,IAAI,CAAC,MAAM;YAAE;IAEb,IAAA,MAAM,CAAC,SAAS,GAAG,CAAA,oDAAA,CAAsD;IAEzE,IAAA,IAAI;IACF,QAAA,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,CAAC,EAAE,EAAE,EAAEN,QAAM,CAAC,MAAM,EAAEA,QAAM,CAAC,WAAW,CAAC;IACpF,QAAA,MAAM,KAAK,GAAsB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;gBACrD,EAAE,EAAE,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;gBACtC,MAAM,EAAE,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;gBAC1C,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;IAClC,YAAA,SAAS,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,SAAS;IAC7C,SAAA,CAAC,CAAC;IAEH,QAAA,iBAAiB,CACf,MAAM,EACN,KAAK,EACL,CAAC,EAAU,KAAI,EAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EACxE,OAAO,EAAU,KAAI;IACnB,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;oBAAE;IAC3C,YAAA,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC;IACvC,YAAA,IAAI,EAAE;IAAE,gBAAA,wBAAwB,EAAE;IACpC,QAAA,CAAC,CACF;QACH;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,GAAG,CAAC;YAC1C,MAAM,CAAC,SAAS,GAAG,CAAA,6FAAA,EAAgG,CAAC,CAAC,oBAAoB,CAAC,CAAA,YAAA,CAAc;QAC1J;IACF;;IC9aA;IAEA,IAAI,MAAM,GAA0B,IAAI;IACxC,IAAI,aAAa,GAAG,KAAK;IACzB,IAAI,UAAU,GAAuB,IAAI;IACzC,IAAI,QAAQ,GAAuB,IAAI;IACvC,IAAI,iBAAiB,GAAuB,IAAI;IAChD,IAAI,OAAO,GAA+B,IAAI;IAC9C,IAAI,OAAO,GAAuB,IAAI;IACtC,IAAI,QAAQ,GAAuB,IAAI;IACvC,IAAI,cAAc,GAA6B,IAAI;IACnD,IAAI,YAAY,GAAuB,IAAI;IAC3C,IAAI,aAAa,GAA+B,IAAI;IACpD,IAAI,aAAa,GAAwB,IAAI;IAC7C,IAAI,WAAW,GAAwB,IAAI;IAE3C;IAEA;IACA,SAAS,IAAI,CAAC,SAAoB,EAAA;QAChC,IAAI,aAAa,EAAE;IACjB,QAAA,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC;YAC7C;QACF;;IAGA,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC;IACrC,IAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,GAAG,MAAM;;IAGf,IAAA,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;;IAGxB,IAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;;QAGtB,YAAY,CAAC,MAAM,CAAC;;QAGpB,YAAY,CAAC,MAAM,CAAC;;IAGpB,IAAA,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3C,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;;IAGrC,IAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACpC,IAAA,QAAQ,GAAG,GAAG,CAAC,MAAM;IACrB,IAAA,iBAAiB,GAAG,GAAG,CAAC,iBAAiB;IACzC,IAAA,OAAO,GAAG,GAAG,CAAC,OAAO;IACrB,IAAA,OAAO,GAAG,GAAG,CAAC,OAAO;IACrB,IAAA,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACvB,IAAA,cAAc,GAAG,GAAG,CAAC,cAAc;IACnC,IAAA,YAAY,GAAG,GAAG,CAAC,YAAY;IAC/B,IAAA,aAAa,GAAG,GAAG,CAAC,WAAW;IAC/B,IAAA,aAAa,GAAG,GAAG,CAAC,WAAW;IAC/B,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;;QAGnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAgB;QACrE,IAAI,QAAQ,EAAE;IACZ,QAAA,WAAW,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC9C;;QAGA,QAAQ,CAAC,MAAM,EAAE;YACf,iBAAiB;YACjB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAY;IACZ,QAAA,WAAW,EAAE,aAAa;IAC1B,QAAA,WAAW,EAAE,aAAa;IAC3B,KAAA,CAAC;;QAGF,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,GAAG,CAAC,CAAc,KAAI;IAClE,QAAA,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC,CAAC,EAAmB;;IAGpB,IAAA,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,MAAK;IAChD,QAAA,wBAAwB,EAAE;IAC5B,IAAA,CAAC,CAAC;QAEF,aAAa,GAAG,IAAI;QACpB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;;IAG9D,IAAA,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,IAAG;IAC5B,QAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC5C,IAAA,CAAC,CAAC;IACJ;IAEA;IACA,SAAS,OAAO,GAAA;IACd,IAAA,IAAI,CAAC,aAAa;YAAE;IAEpB,IAAA,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,EAAE;IAAE,QAAA,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC;YAAE,UAAU,GAAG,IAAI;QAAE;IAC7G,IAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE;IAAE,QAAA,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,IAAI;QAAE;QACnG,IAAI,WAAW,EAAE;IAAE,QAAA,WAAW,EAAE;YAAE,WAAW,GAAG,IAAI;QAAE;IAEtD,IAAA,YAAY,EAAE;QAEd,MAAM,cAAc,GAAG,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,WAAW;QAC1C,MAAM,GAAG,IAAI;QACb,aAAa,GAAG,KAAK;QACrB,iBAAiB,GAAG,IAAI;QACxB,OAAO,GAAG,IAAI;QACd,OAAO,GAAG,IAAI;QACd,QAAQ,GAAG,IAAI;QACf,cAAc,GAAG,IAAI;QACrB,YAAY,GAAG,IAAI;QACnB,aAAa,GAAG,IAAI;QACpB,aAAa,GAAG,IAAI;IAEpB,IAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,IAAI,EAAE,CAAC;IAC/C;IAEA,SAAS,IAAI,GAAA;IACX,IAAA,IAAI,CAAC,QAAQ;YAAE;IACf,IAAA,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACjD;IAEA,SAAS,KAAK,GAAA;IACZ,IAAA,IAAI,CAAC,QAAQ;YAAE;IACf,IAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9C;IAEA,SAAS,MAAM,GAAA;IACb,IAAA,IAAI,CAAC,QAAQ;YAAE;QACf,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IACrD,QAAA,IAAI,EAAE;IACN,QAAA,UAAU,CAAC,MAAK,EAAG,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1D;aAAO;IACL,QAAA,KAAK,EAAE;QACT;IACF;IAEA,SAAS,YAAY,GAAA;IACnB,IAAA,IAAI,CAAC,MAAM;YAAE;QACb,IAAI,QAAQ,EAAE;YAAE,QAAQ,CAAC,KAAK,EAAE;QAAE;IAC7B,SAAA,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE;IAAE,QAAA,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QAAE;IACxE;IAEA;AAEA,UAAM,UAAU,GAAuB;QACrC,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,KAAK;QACL,MAAM;QACN,YAAY;;IAGd,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IAChC,IAAA,MAA6C,CAAC,UAAU,GAAG,UAAU;IACxE;;;;;;;;"} \ No newline at end of file diff --git a/client/dist/chatbot-sdk.min.js b/client/dist/chatbot-sdk.min.js index 0826a35..90e850f 100644 --- a/client/dist/chatbot-sdk.min.js +++ b/client/dist/chatbot-sdk.min.js @@ -1,2 +1,2 @@ -var ChatbotSDK=function(){"use strict";const n="[ChatbotSDK]";let e=!0;const t={info(t,r){e&&console.log(n,t,void 0!==r?r:"")},warn(t,r){e&&console.warn(n,t,void 0!==r?r:"")},error(e,t){console.error(n,e,void 0!==t?t:"")}};let r=null;function o(n){if(!r)throw new Error("API 配置未初始化");return`${r.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function i(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function s(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new a("请求超时,请稍后重试","timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new a("跨域请求被拦截,请联系管理员将当前域名加入 API 白名单","cors");throw new a("网络连接失败,请检查网络","network")}finally{clearTimeout(o)}}class a extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function c(n){switch(n){case 401:return"鉴权失败,请联系管理员";case 403:return"无访问权限,请联系管理员配置";case 404:return"请求的资源不存在";case 429:return"请求过于频繁,请稍后重试";case 500:return"服务器异常,请稍后重试";case 502:case 503:return"服务暂不可用,请稍后重试";default:return`请求失败(状态码 ${n})`}}async function l(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n),l=Date.now();t.info(`发送消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(e);if(!n.ok){const e=c(n.status);throw t.error(`请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),new a(e,`http_${n.status}`)}const o=await n.text(),i=Date.now()-l;return t.info(`AI 回复 integrateId=${r.integrateId} length=${o.length} duration=${i}ms`),o}catch(n){if(n instanceof a)throw n;throw t.error(`请求异常 integrateId=${r.integrateId}`,n),new a("请求发生未知错误","unknown")}}async function d(n,e,l,d){var u;const m=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sse?${e.toString()}`)}(n),p=Date.now();let g="";t.info(`发送流式消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(m,{},6e4);if(!n.ok){const e=c(n.status);return t.error(`流式请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),void d(new a(e,`http_${n.status}`))}const o=null===(u=n.body)||void 0===u?void 0:u.getReader();if(!o)return void d(new a("浏览器不支持流式读取","stream_unsupported"));const i=new TextDecoder("utf-8",{stream:!0});let h="";try{for(;;){const{done:n,value:t}=await o.read();if(n)break;h+=i.decode(t,{stream:!0});const r=h.split("\n");h=r.pop()||"";for(const n of r){const t=n.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const n=t.substring(5).trim();n&&(g+=n,e(n))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(g+=t,e(t))}}}if(h.trim()){const n=h.trim();if(n.startsWith("data:")){const t=n.substring(5).trim();t&&(g+=t,e(t))}else"[DONE]"!==n&&(g+=n,e(n))}}catch(n){if(!(g.length>0))throw n;e("\n\n[网络不稳定,内容可能不完整]")}finally{o.releaseLock()}const f=Date.now()-p;t.info(`流式回复完成 integrateId=${r.integrateId} length=${g.length} duration=${f}ms`),l()}catch(n){n instanceof a?d(n):(t.error(`流式请求异常 integrateId=${r.integrateId}`,n),d(new a("网络连接失败,请检查网络","network")))}}let u=null;function m(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),i=r(parseInt(t[2],16)+e),s=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function p(n){document.querySelector("style[data-csk-sdk]")||(u=document.createElement("style"),u.setAttribute("data-csk-sdk",""),u.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${m(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(u))}function g(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})}function h(){return Date.now()}function f(n,e){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===n.position?"left":"right"),t.setAttribute("title",n.title),t.setAttribute("aria-label",n.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=n.launcherIcon;const r=function(n,e){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,r),t=null},e)}}(e,300);return t.addEventListener("click",r),t.addEventListener("keydown",n=>{"Enter"!==n.key&&" "!==n.key||(n.preventDefault(),r())}),t}function x(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function k(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function w(n){n.scrollTop=n.scrollHeight}function b(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function y(n){return`csk_history_${n}`}function v(n){try{localStorage.removeItem(y(n))}catch(n){t.warn("清空会话历史失败",n)}}let I=null,C=[],E=null,_=null,$=null,D=null,L=null,A=null,N=!1;function S(n,e){I=n,E=e.messagesContainer,_=e.inputEl,$=e.sendBtn,D=e.clearBtn,L=e.showLoading,A=e.hideLoading,function(){if(!_||!$)return;$.addEventListener("click",()=>{B()}),_.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),B())}),_.addEventListener("input",()=>{F()}),D&&D.addEventListener("click",()=>{!function(){if(!I)return;if(!confirm("确定清空所有对话记录?"))return;C=[],E&&(E.innerHTML="");D&&(D.style.display="none");v(I.integrateId),t.info(`清空会话 integrateId=${I.integrateId}`)}()})}();const r=function(n){try{const e=localStorage.getItem(y(n));if(!e)return[];const r=JSON.parse(e);return r&&Array.isArray(r.messages)?(t.info(`加载历史消息 integrateId=${n} count=${r.messages.length}`),r.messages):[]}catch(n){return t.warn("加载会话历史失败",n),[]}}(n.integrateId);r.length>0&&(C=r,function(){if(!E)return;E.innerHTML="";for(const n of C)"user"===n.role?x(E,n.content,n.timestamp):k(E,n.content,n.timestamp);w(E),D&&C.length>0&&(D.style.display="inline-flex")}())}function F(){if(!$||!_)return;_.value.trim().length>0&&!N?$.removeAttribute("disabled"):$.setAttribute("disabled","true")}async function B(){if(!_||!I||N)return;const n=_.value.trim();if(""===n)return;_.value="",F(),_.style.height="auto",N=!0,F();const e=h();E&&x(E,n,e);const r={id:g(),role:"user",content:n,timestamp:e};C.push(r),D&&C.length>0&&(D.style.display="inline-flex"),E&&w(E),L&&L(),E&&w(E);try{let e;const r=h();e=I.streaming?await async function(n,e){return new Promise((t,r)=>{let o=null,i=null,s="",a=!1;d(n,n=>{if(s+=n,!a&&E){A&&A();const{wrapper:n,bubble:t}=function(n,e){const t=document.createElement("div");t.className="csk-msg csk-msg--ai";const r=document.createElement("div");r.className="csk-msg__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=b(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(E,e);i=n,o=t,a=!0}o&&(o.textContent=s),E&&w(E)},()=>{a||""!==s?t(s):l(n).then(n=>t(n)).catch(r)},n=>{s.length>0?(o&&(o.textContent=s+"\n\n[回复被中断]"),t(s)):r(n)})})}(n,r):await l(n),A&&A(),!I.streaming&&E&&k(E,e,r);const o={id:g(),role:"ai",content:e,timestamp:r};C.push(o),function(n,e){try{let r=e;r.length>200&&(r=r.slice(50),t.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${r.length} 条`));const o={messages:r,updatedAt:Date.now()};localStorage.setItem(y(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?t.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):t.error("保存会话历史失败",n)}}(I.integrateId,C),E&&w(E)}catch(n){A&&A();const e=n instanceof a?n.message:"发送失败,请稍后重试";if(E){const n=document.createElement("div");n.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${e}`,n.appendChild(t),E.appendChild(n)}t.error(`发送失败 integrateId=${I.integrateId}`,n)}finally{N=!1,F()}}let M=null,q=!1,T=null,H=null,z=null,j=null,U=null,W=null,K=null,O=null,P=null;function R(){H&&H.classList.remove("csk-window--hidden")}function J(){H&&H.classList.add("csk-window--hidden")}function X(){H&&(H.classList.contains("csk-window--hidden")?(R(),setTimeout(()=>{j&&j.focus()},100)):J())}const Y={init:function(n){if(q)return void t.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const o=function(n){var e,r,o,i,s,a;if(!n.integrateId||"string"!=typeof n.integrateId||""===n.integrateId.trim())return t.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return t.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return t.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:n.integrateId.trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,roleId:n.roleId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(r=n.width)&&void 0!==r?r:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'\n \n \n',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(i=n.showAdminPanel)&&void 0!==i&&i,streaming:null===(s=n.streaming)||void 0===s||s,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a};return t.info(`配置解析完成 integrateId=${c.integrateId} requestDomain=${c.requestDomain}`),c}(n);if(!o)return;var i;M=o,i=M.debug,e=i,function(n){r=n}(M),p(M),T=f(M,X),document.body.appendChild(T);const s=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const i=document.createElement("button");i.className="csk-header__btn csk-header__btn--minimize",i.setAttribute("title","最小化"),i.innerHTML='',i.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const s=document.createElement("button");s.className="csk-header__btn csk-header__btn--close",s.setAttribute("title","关闭"),s.innerHTML='',s.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(i),o.appendChild(s),t.appendChild(r),t.appendChild(o);const a=document.createElement("div");a.id="csk-messages",a.className="csk-messages";const c=document.createElement("div");c.className="csk-input-area";const l=document.createElement("textarea");l.id="csk-input",l.className="csk-input",l.setAttribute("placeholder","输入您的问题..."),l.setAttribute("rows","1"),l.setAttribute("autofocus","");const d=document.createElement("button");d.id="csk-send-btn",d.className="csk-send-btn",d.setAttribute("title","发送"),d.setAttribute("disabled","true"),d.innerHTML='',c.appendChild(l),c.appendChild(d),e.appendChild(t),e.appendChild(a),e.appendChild(c);let u=null;n.showClear&&(u=document.createElement("button"),u.className="csk-clear-btn",u.textContent="清空对话",u.style.display="none",e.insertBefore(u,c));let m=null;return{window:e,messagesContainer:a,inputEl:l,sendBtn:d,clearBtn:u,showLoading:function(){if(m)return m.style.display="flex",m;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n
\n
\n
\n ',a.appendChild(n),m=n,n},hideLoading:function(){m&&m.parentNode&&(m.parentNode.removeChild(m),m=null)}}}(M);H=s.window,z=s.messagesContainer,j=s.inputEl,U=s.sendBtn,W=s.clearBtn,K=s.showLoading,O=s.hideLoading,document.body.appendChild(H);const a=H.querySelector(".csk-header");a&&(P=function(n,e){let t=!1,r=0,o=0,i=0,s=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();i=r-a.left,s=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",l)},c=n=>{if(!t)return;const r=n.clientX-i,o=n.clientY-s,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},l=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)}}(a,H)),S(M,{messagesContainer:z,inputEl:j,sendBtn:U,clearBtn:W,showLoading:K,hideLoading:O}),q=!0,t.info(`初始化完成 integrateId=${M.integrateId} requestDomain=${M.requestDomain}`)},destroy:function(){if(!q)return;T&&T.parentNode&&(T.parentNode.removeChild(T),T=null),H&&H.parentNode&&(H.parentNode.removeChild(H),H=null),P&&(P(),P=null),u&&u.parentNode&&(u.parentNode.removeChild(u),u=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==M?void 0:M.integrateId;M=null,q=!1,z=null,j=null,U=null,W=null,K=null,O=null,t.info(`销毁实例 integrateId=${n}`)},open:R,close:J,toggle:X,clearHistory:function(){M&&(W?W.click():confirm("确定清空所有对话记录?")&&v(M.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=Y),Y}(); +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,o){const s=t[r];if(void 0!==s){const i=Date.now()-s;if(delete t[r],e){const e=o?`${o} ${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 o={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",placeholder:"输入您的问题...",send:"发送",loading:"正在思考...",stream_interrupted:"回复被中断",stream_unstable:"网络不稳定,内容可能不完整",category_placeholder:"选择知识库分类",category_all:"全部分类",category_load_error:"加载分类失败",source_title:"参考来源",source_count:"{n} 条参考来源",source_loading:"加载来源中...",clear:"清空对话",clear_confirm:"确定清空所有对话记录?",history_title:"历史会话",history_empty:"暂无历史会话",history_load_error:"加载会话列表失败",history_delete_confirm:"确定删除该会话?",history_export:"导出",history_delete:"删除",error_network:"网络连接失败,请检查网络",error_timeout:"请求超时,请稍后重试",error_server:"服务器异常,请稍后重试",error_cors:"跨域请求被拦截,请联系管理员将当前域名加入 API 白名单",error_auth:"鉴权失败,请联系管理员",error_forbidden:"无访问权限,请联系管理员配置",error_not_found:"请求的资源不存在",error_rate_limit:"请求过于频繁,请稍后重试",error_unavailable:"服务暂不可用,请稍后重试",error_unknown:"请求发生未知错误",error_send:"发送失败,请稍后重试",error_stream_unsupported:"浏览器不支持流式读取"},en:{title:"AI Assistant",minimize:"Minimize",close:"Close",placeholder:"Type your question...",send:"Send",loading:"Thinking...",stream_interrupted:"Response interrupted",stream_unstable:"Network unstable, content may be incomplete",category_placeholder:"Select category",category_all:"All categories",category_load_error:"Failed to load categories",source_title:"Sources",source_count:"{n} source(s)",source_loading:"Loading sources...",clear:"Clear chat",clear_confirm:"Clear all conversation history?",history_title:"History",history_empty:"No conversations yet",history_load_error:"Failed to load conversations",history_delete_confirm:"Delete this conversation?",history_export:"Export",history_delete:"Delete",error_network:"Network connection failed",error_timeout:"Request timed out, please try again",error_server:"Server error, please try again later",error_cors:"CORS request blocked. Please contact admin to whitelist your domain",error_auth:"Authentication failed, please contact admin",error_forbidden:"Access denied, please contact admin",error_not_found:"Resource not found",error_rate_limit:"Too many requests, please try again later",error_unavailable:"Service temporarily unavailable",error_unknown:"Unknown request error",error_send:"Failed to send, please try again",error_stream_unsupported:"Browser does not support streaming"}};let s="zh-CN";function i(n,e){let t=(o[s]||o["zh-CN"])[n]||o["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){if(!a)throw new Error("API 配置未初始化");return`${a.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function l(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function d(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new u(i("error_timeout"),"timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new u(i("error_cors"),"cors");throw new u(i("error_network"),"network")}finally{clearTimeout(o)}}class u extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function p(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 m(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",a.chatId),l(e,"roleId",a.integrateId),l(e,"accountId",a.userId),c(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n);r.lifecycleSend(a.integrateId,n.length);try{const n=await d(e);if(!n.ok){const e=p(n.status);throw r.lifecycleError(a.integrateId,String(n.status),e),new u(e,`http_${n.status}`)}const t=await n.text();return r.lifecycleReply(a.integrateId,t.length),t}catch(n){if(n instanceof u)throw n;throw r.lifecycleError(a.integrateId,"unknown",String(n)),new u(i("error_unknown"),"unknown")}}async function h(n,e,t,o,s,m){var h;const g=m?function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(n,s):function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/chat/sse?${t.toString()}`)}(n,s);let k="";r.lifecycleSend(a.integrateId,n.length);try{const n=await d(g,{},6e4);if(!n.ok){const e=p(n.status);return r.lifecycleError(a.integrateId,String(n.status),e),void o(new u(e,`http_${n.status}`))}const s=null===(h=n.body)||void 0===h?void 0:h.getReader();if(!s)return void o(new u(i("error_stream_unsupported"),"stream_unsupported"));const c=new TextDecoder("utf-8",{stream:!0});let l="";try{for(;;){const{done:n,value:t}=await s.read();if(n)break;l+=c.decode(t,{stream:!0});const r=l.split("\n");l=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(l.trim()){const n=l.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{s.releaseLock()}r.lifecycleStreamDone(a.integrateId,k.length),t()}catch(n){n instanceof u?o(n):(r.lifecycleError(a.integrateId,"unknown",String(n)),o(new u(i("error_network"),"network")))}}async function g(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"),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/rag/sources?${t.toString()}`)}(n,e);try{const n=await d(t);if(!n.ok)throw new u(p(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 k(n=1,e=20,t,o){let s=`/conversation/list?page=${n}&size=${e}`;t&&(s+=`&accountId=${encodeURIComponent(t)}`),o&&(s+=`&roleId=${encodeURIComponent(o)}`);const i=c(s);try{const n=await d(i);if(!n.ok)throw new u(p(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 f(){if(!a)return"";const n=function(n,e){try{return localStorage.getItem(y(n,e))||""}catch(n){return""}}(a.integrateId,a.userId);if(n)return a.chatId=n,r.info(`从缓存恢复 chatId=${n}`),n;try{const n=await k(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,b(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,b(a.integrateId,a.userId,e),r.info(`生成新 chatId=${e}`),e}function y(n,e){return`csk_chatId_${n}${e?"_"+e:""}`}function b(n,e,t){try{t?localStorage.setItem(y(n,e),t):localStorage.removeItem(y(n,e))}catch(n){}}let x=null;function _(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),s=r(parseInt(t[2],16)+e),i=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function w(n){document.querySelector("style[data-csk-sdk]")||(x=document.createElement("style"),x.setAttribute("data-csk-sdk",""),x.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${_(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n border-top: 1px solid #E5E7EB;\n background: #F9FAFB;\n gap: 8px;\n}\n.csk-category-bar__label {\n font-size: 12px;\n color: #6B7280;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 12px;\n color: #374151;\n background: #fff;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s;\n max-width: 200px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F9FAFB;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover {\n background: #F3F4F6;\n}\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n}\n.csk-sources--collapsed .csk-sources__arrow {\n transform: rotate(-90deg);\n}\n.csk-sources__body {\n border-top: 1px solid #E5E7EB;\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body {\n display: none;\n}\n.csk-source-item {\n padding: 8px 12px;\n border-bottom: 1px solid #F3F4F6;\n transition: background 0.15s;\n}\n.csk-source-item:last-child {\n border-bottom: none;\n}\n.csk-source-item:hover {\n background: #F9FAFB;\n}\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 2px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.csk-source-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p {\n margin: 0 0 8px;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child {\n margin-bottom: 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1,\n.csk-msg--ai .csk-msg__bubble .csk-md-h2,\n.csk-msg--ai .csk-msg__bubble .csk-md-h3,\n.csk-msg--ai .csk-msg__bubble .csk-md-h4,\n.csk-msg--ai .csk-msg__bubble .csk-md-h5,\n.csk-msg--ai .csk-msg__bubble .csk-md-h6 {\n margin: 12px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; }\n\n.csk-md-code-block {\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 8px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.5;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-md-code-block code {\n background: none;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n color: inherit;\n}\n.csk-md-inline-code {\n background: #E5E7EB;\n color: #DC2626;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol {\n padding-left: 20px;\n margin: 6px 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul li,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol li {\n margin-bottom: 4px;\n}\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding-left: 12px;\n margin: 8px 0;\n color: #6B7280;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n}\n.csk-md-link:hover {\n text-decoration: underline;\n}\n.csk-md-hr {\n border: none;\n border-top: 1px solid #E5E7EB;\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-history-panel {\n position: absolute;\n top: 48px;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n z-index: 10;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.csk-history-panel--hidden {\n display: none;\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n background: #F9FAFB;\n}\n.csk-history-panel__title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n}\n.csk-history-panel__back {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n.csk-history-panel__back:hover {\n background: #F3F4F6;\n}\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n.csk-history-panel__list::-webkit-scrollbar {\n width: 4px;\n}\n.csk-history-panel__list::-webkit-scrollbar-thumb {\n background: #E5E7EB;\n border-radius: 2px;\n}\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 4px;\n}\n.csk-history-item:hover {\n background: #F3F4F6;\n}\n.csk-history-item__info {\n flex: 1;\n min-width: 0;\n}\n.csk-history-item__id {\n font-size: 13px;\n font-weight: 500;\n color: #1F2937;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-history-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n.csk-history-item__actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.csk-history-item:hover .csk-history-item__actions {\n opacity: 1;\n}\n.csk-history-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export {\n background: #EFF6FF;\n color: #2563EB;\n}\n.csk-history-action--export:hover {\n background: #DBEAFE;\n}\n.csk-history-action--delete {\n background: #FEF2F2;\n color: #DC2626;\n}\n.csk-history-action--delete:hover {\n background: #FEE2E2;\n}\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n color: #9CA3AF;\n font-size: 13px;\n}\n.csk-history-panel__loadmore {\n display: block;\n width: 100%;\n padding: 10px;\n border: none;\n background: #F9FAFB;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n transition: background 0.15s;\n}\n.csk-history-panel__loadmore:hover {\n background: #F3F4F6;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(x))}function v(){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 E(n){const e={"&":"&","<":"<",">":">",'"':""","'":"'"};return n.replace(/[&<>"']/g,n=>e[n]||n)}function I(){return Date.now()}function C(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 $(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const s=document.createElement("div");return s.className="csk-msg__time",s.textContent=N(t),r.appendChild(o),r.appendChild(s),n.appendChild(r),r}function S(n,e,t,r){const o=document.createElement("div");o.className="csk-msg csk-msg--ai";const s=document.createElement("div");s.className="csk-msg__bubble",r?s.innerHTML=r(e):s.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=N(t),o.appendChild(s),o.appendChild(i),n.appendChild(o),o}function A(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 o=document.createElement("div");o.className="csk-sources__header";const s=document.createElement("span");s.className="csk-sources__title",s.textContent=`📚 ${i("source_count",{n:e.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",o.appendChild(s),o.appendChild(a),o.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const c=document.createElement("div");c.className="csk-sources__body";for(const 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 o=[];n.sourceName&&o.push(n.sourceName),void 0!==n.chunkIndex&&o.push(`分块 #${n.chunkIndex}`),void 0!==n.score&&o.push(`相关度 ${(100*n.score).toFixed(0)}%`),r.textContent=o.join(" · "),e.appendChild(t),e.appendChild(r),c.appendChild(e)}r.appendChild(o),r.appendChild(c);const l=n.querySelector(".csk-msg__time");l?n.insertBefore(r,l):n.appendChild(r)}function F(n){n.scrollTop=n.scrollHeight}function N(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function L(n){return`csk_history_${n}`}function D(n,e){try{let t=e;t.length>200&&(t=t.slice(50),r.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const o={messages:t,updatedAt:Date.now()};localStorage.setItem(L(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?r.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):r.error("保存会话历史失败",n)}}function B(n){try{localStorage.removeItem(L(n))}catch(n){r.warn("清空会话历史失败",n)}}const M="\0CODEBLOCK_",z="\0INLINECODE_";function T(n){if(!n||"string"!=typeof n)return"";const e=[];let t=n;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(n,t,r)=>{const o=e.length,s=E(r.trimEnd()),i=t?` class="language-${E(t)}"`:"";return e.push(`
${s}
`),`${M}${o}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(n,e)=>{const t=r.length;return r.push(`${E(e)}`),`${z}${t}\0`}),t=E(t),t=q(t,M,e),t=q(t,z,r);const o=t.split("\n"),s=[];let i=!1,a="",c=!1,l=[];for(let n=0;n')){u(),p(),m(),s.push(e);continue}const t=e.match(/^(#{1,6})\s+(.+)/);if(t){u(),p(),m();const n=t[1].length;s.push(`${t[2]}`);continue}const r=e.match(/^>\s?(.*)/);if(r){u(),p(),c||(c=!0,s.push('
')),s.push(`

${d(r[1])}

`);continue}c&&m();const h=e.match(/^[\-\*]\s+(.+)/);if(h){u(),m(),i&&"ul"===a||(p(),i=!0,a="ul",s.push('
    ')),s.push(`
  • ${d(h[1])}
  • `);continue}const g=e.match(/^\d+\.\s+(.+)/);g?(u(),m(),i&&"ol"===a||(p(),i=!0,a="ol",s.push('
      ')),s.push(`
    1. ${d(g[1])}
    2. `)):""!==e.trim()?/^(\*{3,}|-{3,}|_{3,})$/.test(e.trim())?(u(),p(),m(),s.push('
      ')):(p(),m(),l.push(d(e))):(u(),p())}return u(),p(),m(),s.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 u(){l.length>0&&(s.push(`

      ${l.join("
      ")}

      `),l=[])}function p(){i&&(s.push("ul"===a?"
":""),i=!1,a="")}function m(){c&&(s.push("
"),c=!1)}}function q(n,e,t){return n.replace(new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(n,e)=>t[parseInt(e)]||"")}let j,H=null,R=[],U=null,P=null,O=null,W=null,K=null,V=null,J=null,X=null,Y=!1,G=!1;function Q(n,e){H=n,U=e.messagesContainer,P=e.inputEl,O=e.sendBtn,W=e.clearBtn,K=e.categorySelect,V=e.historyPanel,J=e.showLoading,X=e.hideLoading,j=n.categoryId,G=!!n.categoryId||!!n.showCategorySwitch,function(){if(!P||!O)return;O.addEventListener("click",()=>en()),P.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),en())}),P.addEventListener("input",()=>nn()),W&&W.addEventListener("click",()=>function(){if(!H)return;if(!confirm(i("clear_confirm")))return;if(R=[],U){U.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove())}W&&(W.style.display="none");B(H.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}`}();e=n,a&&(a.chatId=e),b(H.integrateId,H.userId,n),r.lifecycleClear(H.integrateId),r.info(`新 chatId=${n}`);var e}())}(),n.showCategorySwitch&&K&&async function(){if(!K)return;try{const n=await async function(){const n=c("/category/tree");try{const e=await d(n);if(!e.ok)throw new u(p(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 u?r.error(`加载分类树失败: ${n.message}`):r.error("加载分类树失败",n),[]}}();if(0===n.length)return;K.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!==j&&String(r.id)===String(j)&&(n.selected=!0),K.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 Z(){if(H&&U&&(await f(),await async function(){if(!H||!U)return;const n=(null==a?void 0:a.chatId)||"";if(!n)return;try{const e=await async function(n){const e=c(`/conversation/${n}/messages`);try{const n=await d(e);if(!n.ok)throw new u(p(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}}}(n);e.messages.length>0&&(R=e.messages.map((n,e)=>({id:v(),role:"USER"===n.messageType?"user":"ai",content:n.content,timestamp:new Date(n.createTime).getTime()})),tn(),r.info(`从后端加载 ${R.length} 条历史消息`),D(H.integrateId,R))}catch(n){r.warn("从后端加载历史消息失败",n)}}(),0===R.length)){const n=function(n){try{const e=localStorage.getItem(L(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),[]}}(H.integrateId);n.length>0&&(R=n,tn(),r.info(`从本地缓存恢复 ${n.length} 条消息`))}}function nn(){if(!O||!P)return;P.value.trim().length>0&&!Y?O.removeAttribute("disabled"):O.setAttribute("disabled","true")}async function en(){if(!P||!H||Y)return;const n=P.value.trim();if(""===n)return;P.value="",nn(),P.style.height="auto",Y=!0,nn(),H.chatId||await f();const e=I();U&&$(U,n,e);const t={id:v(),role:"user",content:n,timestamp:e};R.push(t),W&&R.length>0&&(W.style.display="inline-flex"),U&&F(U),J&&J(),U&&F(U);try{let e;const t=I(),o=G&&(void 0!==j||void 0!==H.categoryId);e=H.streaming?await async function(n,e,t){return new Promise((r,o)=>{let s=null,a="",c=!1;h(n,n=>{if(a+=n,!c&&U){X&&X();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__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=N(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(U,e);s=n,c=!0}s&&(s.textContent=a),U&&F(U)},()=>{c||""!==a?(s&&a&&(s.innerHTML=T(a)),r(a)):m(n).then(r).catch(o)},n=>{a.length>0?(s&&(s.innerHTML=T(a+"\n\n"+i("stream_interrupted"))),r(a)):o(n)},j,t)})}(n,t,o):await m(n),X&&X(),!H.streaming&&U&&S(U,e,t,T);const s={id:v(),role:"ai",content:e,timestamp:t};R.push(s),D(H.integrateId,R),U&&F(U),o&&async function(n,e){try{const t=await g(n,j);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,U){const e=U.querySelector(".csk-msg--ai:last-of-type");e&&A(e,n)}H&&D(H.integrateId,R)}}catch(n){r.warn("获取引用来源失败",n)}}(n,s)}catch(n){X&&X();const e=n instanceof u?n.message:i("error_send");if(U){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),U.appendChild(n)}r.error(`发送失败 integrateId=${H.integrateId}`,n)}finally{Y=!1,nn()}}function tn(){if(!U)return;const n=U.querySelector(".csk-history-panel");U.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove());for(const n of R)if("user"===n.role)$(U,n.content,n.timestamp);else{const e=S(U,n.content,n.timestamp,T);n.sources&&n.sources.length>0&&A(e,n.sources)}F(U),W&&R.length>0&&(W.style.display="inline-flex"),n&&!U.contains(n)&&U.appendChild(n)}async function rn(){if(!V||!H)return;const n=V.querySelector("#csk-history-list");if(n){n.innerHTML='
加载中...
';try{const e=await k(1,50,H.userId,H.integrateId);!function(n,e,t,r){if(n.innerHTML="",0===e.length){const e=document.createElement("div");return e.className="csk-history-panel__empty",e.innerHTML=`\n
💬
\n
${i("history_empty")}
\n `,void n.appendChild(e)}for(const o of e){const e=document.createElement("div");e.className="csk-history-item";const s=document.createElement("div");s.className="csk-history-item__info";const a=document.createElement("div");a.className="csk-history-item__id",a.textContent=o.chatId||o.id;const c=document.createElement("div");c.className="csk-history-item__meta";const l=[];void 0!==o.messageCount&&l.push(`${o.messageCount} 条消息`),o.lastMessageTime?l.push(o.lastMessageTime):o.createdAt&&l.push(o.createdAt),c.textContent=l.join(" · "),s.appendChild(a),s.appendChild(c);const d=document.createElement("div");d.className="csk-history-item__actions";const u=document.createElement("button");u.className="csk-history-action csk-history-action--export",u.setAttribute("title",i("history_export")),u.innerHTML='',u.addEventListener("click",n=>{n.stopPropagation(),t(o.id)});const p=document.createElement("button");p.className="csk-history-action csk-history-action--delete",p.setAttribute("title",i("history_delete")),p.innerHTML='',p.addEventListener("click",n=>{n.stopPropagation(),r(o.id)}),d.appendChild(u),d.appendChild(p),e.appendChild(s),e.appendChild(d),n.appendChild(e)}}(n,e.list.map(n=>({id:n.conversationId||n.chatId||"",chatId:n.conversationId||n.chatId||"",messageCount:n.messageCount,lastMessageTime:n.lastMessageTime,createdAt:n.firstMessageTime||n.createdAt})),n=>{window.open(c(`/conversation/${n}/export`),"_blank")},async n=>{if(!confirm(i("history_delete_confirm")))return;await async function(n){const e=c(`/conversation/${n}`);try{const t=await d(e,{method:"DELETE"});if(!t.ok)throw new u(p(t.status),`http_${t.status}`);const o=await t.json();return r.info(`删除会话 id=${n} success=${o.success}`),o.success||!1}catch(n){return r.error("删除会话失败",n),!1}}(n)&&rn()})}catch(e){r.error(i("history_load_error"),e),n.innerHTML=`
${i("history_load_error")}
`}}}let on=null,sn=!1,an=null,cn=null,ln=null,dn=null,un=null,pn=null,mn=null,hn=null,gn=null,kn=null,fn=null;function yn(){cn&&cn.classList.remove("csk-window--hidden")}function bn(){cn&&cn.classList.add("csk-window--hidden")}function xn(){cn&&(cn.classList.contains("csk-window--hidden")?(yn(),setTimeout(()=>{dn&&dn.focus()},100)):bn())}const _n={init:function(n){if(sn)return void r.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const t=function(n){var e,t,o,s,i,a;if(!n.integrateId||"string"!=typeof n.integrateId&&"number"!=typeof n.integrateId||"string"==typeof n.integrateId&&""===n.integrateId.trim())return r.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return r.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return r.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:String(n.integrateId).trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(t=n.width)&&void 0!==t?t:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'\n \n \n',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(s=n.showAdminPanel)&&void 0!==s&&s,streaming:null===(i=n.streaming)||void 0===i||i,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a,chatId:""};return r.info(`配置解析完成 integrateId(=roleId)=${c.integrateId} userId(=accountId)=${c.userId||"(未设置)"} requestDomain=${c.requestDomain}`),c}(n);if(!t)return;var c;on=t,function(n){if(o[n])s=n;else{const e=n.split("-")[0],t=Object.keys(o).find(n=>n.startsWith(e));t&&(s=t)}}(on.locale),c=on.debug,e=c,function(n){a=n}(on),w(on),an=C(on,xn),document.body.appendChild(an);const l=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const s=document.createElement("button");s.className="csk-history-btn",s.setAttribute("title",i("history_title")),s.innerHTML='';const a=document.createElement("button");a.className="csk-header__btn csk-header__btn--minimize",a.setAttribute("title",i("minimize")),a.innerHTML='',a.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const c=document.createElement("button");c.className="csk-header__btn csk-header__btn--close",c.setAttribute("title",i("close")),c.innerHTML='',c.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(s),o.appendChild(a),o.appendChild(c),t.appendChild(r),t.appendChild(o);const l=document.createElement("div");l.id="csk-messages",l.className="csk-messages";const d=document.createElement("div");d.className="csk-history-panel csk-history-panel--hidden",d.innerHTML=`\n
\n ${i("history_title")}\n \n
\n
\n `,l.appendChild(d);const u=d.querySelector("#csk-history-back");u&&u.addEventListener("click",()=>{d.classList.add("csk-history-panel--hidden")}),s.addEventListener("click",n=>{n.stopPropagation();const t=d.classList.contains("csk-history-panel--hidden");d.classList.toggle("csk-history-panel--hidden"),t&&e.dispatchEvent(new CustomEvent("csk:loadHistory"))});let p=null;if(n.showCategorySwitch){const n=document.createElement("div");n.className="csk-category-bar";const r=document.createElement("span");r.className="csk-category-bar__label",r.textContent="📚",p=document.createElement("select"),p.id="csk-category-select",p.className="csk-category-select",p.innerHTML=``,p.addEventListener("change",()=>{const n=p.value;e.dispatchEvent(new CustomEvent("csk:categoryChange",{detail:{categoryId:n?Number(n):void 0}}))}),n.appendChild(r),n.appendChild(p),e.appendChild(t),e.appendChild(l),e.appendChild(n)}else e.appendChild(t),e.appendChild(l);const m=document.createElement("div");m.className="csk-input-area";const h=document.createElement("textarea");h.id="csk-input",h.className="csk-input",h.setAttribute("placeholder",i("placeholder")),h.setAttribute("rows","1"),h.setAttribute("autofocus","");const g=document.createElement("button");g.id="csk-send-btn",g.className="csk-send-btn",g.setAttribute("title",i("send")),g.setAttribute("disabled","true"),g.innerHTML='',m.appendChild(h),m.appendChild(g),e.appendChild(m);let k=null;n.showClear&&(k=document.createElement("button"),k.className="csk-clear-btn",k.textContent=i("clear"),k.style.display="none",e.insertBefore(k,m));let f=null;return{window:e,messagesContainer:l,inputEl:h,sendBtn:g,clearBtn:k,categorySelect:p,historyPanel:d,showLoading:function(){if(f)return f.style.display="flex",f;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n
\n
\n
\n ',l.appendChild(n),f=n,n},hideLoading:function(){f&&f.parentNode&&(f.parentNode.removeChild(f),f=null)}}}(on);cn=l.window,ln=l.messagesContainer,dn=l.inputEl,un=l.sendBtn,pn=l.clearBtn,mn=l.categorySelect,hn=l.historyPanel,gn=l.showLoading,kn=l.hideLoading,document.body.appendChild(cn);const d=cn.querySelector(".csk-header");d&&(fn=function(n,e){let t=!1,r=0,o=0,s=0,i=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();s=r-a.left,i=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",l)},c=n=>{if(!t)return;const r=n.clientX-s,o=n.clientY-i,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},l=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)}}(d,cn)),Q(on,{messagesContainer:ln,inputEl:dn,sendBtn:un,clearBtn:pn,categorySelect:mn,historyPanel:hn,showLoading:gn,hideLoading:kn}),cn.addEventListener("csk:categoryChange",n=>{var e;e=n.detail.categoryId,j=e,G=void 0!==e,r.lifecycleCategoryChange(null!=e?e:"全部")}),cn.addEventListener("csk:loadHistory",()=>{rn()}),sn=!0,r.lifecycleInit(on.integrateId,on.requestDomain),Z().catch(n=>{r.warn("chatId 初始化失败,将在发送消息时重试",n)})},destroy:function(){if(!sn)return;an&&an.parentNode&&(an.parentNode.removeChild(an),an=null),cn&&cn.parentNode&&(cn.parentNode.removeChild(cn),cn=null),fn&&(fn(),fn=null),x&&x.parentNode&&(x.parentNode.removeChild(x),x=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==on?void 0:on.integrateId;on=null,sn=!1,ln=null,dn=null,un=null,pn=null,mn=null,hn=null,gn=null,kn=null,r.lifecycleDestroy(n||"")},open:yn,close:bn,toggle:xn,clearHistory:function(){on&&(pn?pn.click():confirm("确定清空所有对话记录?")&&B(on.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=_n),_n}(); //# sourceMappingURL=chatbot-sdk.min.js.map diff --git a/client/dist/chatbot-sdk.min.js.map b/client/dist/chatbot-sdk.min.js.map index bba685b..c00e342 100644 --- a/client/dist/chatbot-sdk.min.js.map +++ b/client/dist/chatbot-sdk.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chatbot-sdk.min.js","sources":["../src/logger.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts","../src/config.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","debugEnabled","logger","info","msg","data","console","log","undefined","warn","error","currentConfig","buildUrl","path","Error","requestDomain","replace","startsWith","setIfPresent","params","key","value","trim","set","String","async","safeFetch","url","options","timeout","controller","AbortController","timer","setTimeout","abort","fetch","Object","assign","signal","mode","credentials","err","DOMException","name","CskError","TypeError","message","includes","clearTimeout","constructor","type","super","this","getHttpErrorMessage","status","chatRequest","URLSearchParams","integrateId","userId","roleId","categoryId","toString","buildChatUrl","startTime","Date","now","length","response","ok","errorMsg","text","duration","chatSSERequest","onChunk","onDone","onError","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","_a","body","getReader","decoder","TextDecoder","stream","buffer","done","read","decode","lines","split","pop","line","trimmed","substring","readErr","releaseLock","styleElement","cssVars","config","darker","hex","amount","match","clamp","v","Math","max","min","r","parseInt","g","b","padStart","adjustColor","primaryColor","width","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","crypto","randomUUID","c","random","createLauncher","onClick","launcher","id","className","position","title","innerHTML","launcherIcon","debouncedClick","fn","delay","args","apply","debounce","addEventListener","e","preventDefault","renderUserBubble","container","timestamp","wrapper","bubble","time","formatTime","renderAIBubble","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","clearMessages","localStorage","removeItem","messages","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn","isSending","initChat","cfg","dom","showLoading","hideLoading","handleSend","shiftKey","updateSendBtnState","confirm","style","display","handleClear","bindSendEvents","history","raw","getItem","JSON","parse","Array","isArray","loadMessages","role","content","renderHistory","removeAttribute","height","userTimestamp","userMsg","push","aiContent","aiTimestamp","streaming","Promise","resolve","reject","bubbleEl","wrapperEl","accumulated","streamStarted","chunk","createEmptyAIBubble","then","catch","sendStreamMessage","aiMsg","slice","updatedAt","setItem","stringify","saveMessages","errMsg","errorBubble","color","isInitialized","launcherEl","windowEl","dragCleanup","open","classList","remove","close","add","toggle","contains","focus","ChatbotSDK","init","rawConfig","parsed","URL","_g","showCategorySwitch","_b","showClear","_c","showAdminPanel","_d","_e","locale","debug","_f","parseConfig","enabled","setApiConfig","header","titleEl","actions","minimizeBtn","closeBtn","inputArea","insertBefore","loadingEl","window","el","parentNode","removeChild","createChatWindow","headerEl","dragging","startX","startY","offsetX","offsetY","onMouseDown","clientX","clientY","rect","getBoundingClientRect","left","top","onMouseMove","onMouseUp","x","y","maxX","innerWidth","offsetWidth","maxY","innerHeight","offsetHeight","right","bottom","removeEventListener","enableDrag","destroy","querySelectorAll","forEach","oldIntegrateId","clearHistory","click"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chatbot-sdk.min.js","sources":["../src/logger.ts","../src/i18n.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/markdown.ts","../src/chat.ts","../src/index.ts","../src/config.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null],"names":["PREFIX","debugEnabled","timers","logger","info","msg","data","console","log","undefined","warn","error","time","label","Date","now","timeEnd","prefix","start","duration","lifecycleInit","integrateId","requestDomain","this","lifecycleDestroy","lifecycleSend","length","lifecycleReply","lifecycleError","status","message","lifecycleClear","lifecycleStreamDone","lifecycleCategoryChange","categoryId","dictionaries","title","minimize","close","placeholder","send","loading","stream_interrupted","stream_unstable","category_placeholder","category_all","category_load_error","source_title","source_count","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","error_auth","error_forbidden","error_not_found","error_rate_limit","error_unavailable","error_unknown","error_send","error_stream_unsupported","en","currentLocale","t","key","params","text","k","v","Object","entries","replace","String","currentConfig","buildUrl","path","Error","startsWith","setIfPresent","value","trim","set","async","safeFetch","url","options","timeout","controller","AbortController","timer","setTimeout","abort","fetch","assign","signal","mode","credentials","err","DOMException","name","CskError","TypeError","includes","clearTimeout","constructor","type","super","getHttpErrorMessage","chatRequest","URLSearchParams","chatId","userId","toString","buildChatUrl","response","ok","errorMsg","chatSSERequest","onChunk","onDone","onError","useRag","buildChatRAGSSEUrl","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","_a","body","getReader","decoder","TextDecoder","stream","buffer","done","read","decode","lines","split","pop","line","trimmed","substring","readErr","releaseLock","fetchRagSources","buildRagSourcesUrl","json","success","Array","isArray","fetchConversationList","page","size","accountId","roleId","encodeURIComponent","list","total","pages","initChatId","cachedChatId","localStorage","getItem","chatIdStorageKey","loadCachedChatId","result","latestConv","conversationId","saveCachedChatId","messageCount","newChatId","random","crypto","randomUUID","Math","generateChatId","setItem","removeItem","styleElement","cssVars","config","darker","hex","amount","match","clamp","max","min","r","parseInt","g","b","padStart","adjustColor","primaryColor","width","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","c","escapeHtml","map","ch","createLauncher","onClick","launcher","id","className","position","innerHTML","launcherIcon","debouncedClick","fn","delay","args","apply","debounce","addEventListener","e","preventDefault","renderUserBubble","container","timestamp","wrapper","bubble","formatTime","renderAIBubble","renderMd","renderSources","sources","existing","remove","sourcesEl","header","titleSpan","n","arrow","classList","toggle","src","item","sourceName","snippet","meta","metaParts","push","chunkIndex","score","toFixed","join","timeEl","insertBefore","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","saveMessages","messages","slice","updatedAt","JSON","stringify","clearMessages","CODE_BLOCK_PREFIX","INLINE_CODE_PREFIX","renderMarkdown","codeBlocks","processed","_match","lang","code","idx","escapedCode","trimEnd","langClass","inlineCodes","restorePlaceholders","inList","listType","inBlockquote","paragraphBuffer","i","flushParagraph","closeList","closeBlockquote","headingMatch","level","quoteMatch","inlineFormat","ulMatch","olMatch","test","_m","linkText","replacements","RegExp","currentCategoryId","messagesContainer","inputEl","sendBtn","clearBtn","categorySelect","historyPanel","showLoadingFn","hideLoadingFn","isSending","initChat","cfg","dom","showLoading","hideLoading","showCategorySwitch","handleSend","shiftKey","updateSendBtnState","confirm","querySelectorAll","forEach","el","style","display","newId","generateNewChatId","handleClear","bindSendEvents","tree","fetchCategoryTree","addOptions","nodes","indent","node","option","repeat","selected","children","loadCategories","initChatHistory","fetchConversationMessages","role","messageType","content","createTime","getTime","renderHistory","loadHistoryFromBackend","cached","raw","parse","loadMessages","removeAttribute","height","userTimestamp","userMsg","aiContent","aiTimestamp","shouldUseRag","streaming","Promise","resolve","reject","bubbleEl","accumulated","streamStarted","chunk","createEmptyAIBubble","then","catch","sendStreamMessage","aiMsg","ragSources","s","documentId","_b","lastAiMsg","fetchAndRenderSources","errMsg","errorBubble","color","historyPanelEl","contains","loadHistoryConversations","listEl","items","onExport","onDelete","empty","idEl","metaEl","lastMessageTime","createdAt","actionsEl","exportBtn","stopPropagation","deleteBtn","renderHistoryList","firstMessageTime","window","open","method","deleteConversation","isInitialized","launcherEl","windowEl","dragCleanup","add","focus","ChatbotSDK","init","rawConfig","parsed","URL","_g","showClear","_c","showAdminPanel","_d","_e","locale","debug","_f","parseConfig","enabled","matched","keys","find","setLocale","setApiConfig","titleEl","actions","historyBtn","minimizeBtn","closeBtn","backBtn","isHidden","dispatchEvent","CustomEvent","categoryBar","categoryLabel","selectedId","detail","Number","inputArea","loadingEl","parentNode","removeChild","createChatWindow","headerEl","dragging","startX","startY","offsetX","offsetY","onMouseDown","clientX","clientY","rect","getBoundingClientRect","left","top","onMouseMove","onMouseUp","x","y","maxX","innerWidth","offsetWidth","maxY","innerHeight","offsetHeight","right","bottom","removeEventListener","enableDrag","destroy","oldIntegrateId","clearHistory","click"],"mappings":"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"} \ No newline at end of file diff --git a/client/src/api.ts b/client/src/api.ts index ab345c5..1136913 100644 --- a/client/src/api.ts +++ b/client/src/api.ts @@ -1,8 +1,14 @@ /** * API 通信模块 - HTTP 封装 + 错误拦截 + 参数映射 + * + * 核心参数映射(SDK → 后端): + * integrateId → roleId(客服角色 ID) + * userId → accountId(客户账号 ID) + * chatId → 自动管理的对话 ID(从 /conversation/list 获取或自动生成) */ -import { ResolvedConfig, ChatMessage, ApiResponse } from './types'; +import { ResolvedConfig, ApiResponse, CategoryNode } from './types'; import { logger } from './logger'; +import { t } from './i18n'; /** 请求超时时间(毫秒) */ const REQUEST_TIMEOUT = 30000; @@ -14,6 +20,18 @@ export function setApiConfig(config: ResolvedConfig): void { currentConfig = config; } +/** 更新当前 chatId(对话 ID) */ +export function updateChatId(chatId: string): void { + if (currentConfig) { + currentConfig.chatId = chatId; + } +} + +/** 获取当前 chatId */ +export function getChatId(): string { + return currentConfig?.chatId || ''; +} + /** 构建完整请求 URL,自动防御双斜杠 */ export function buildUrl(path: string): string { if (!currentConfig) { @@ -24,41 +42,85 @@ export function buildUrl(path: string): string { return `${domain}${cleanPath}`; } -/** 构建同步对话请求 URL */ +/** + * 安全设置可选参数:仅当 value 非空时追加 + */ +function setIfPresent(params: URLSearchParams, key: string, value: string | number | undefined): void { + if (value === undefined || value === null) return; + if (typeof value === 'string' && value.trim() === '') return; + params.set(key, String(value)); +} + +// ==================== 对话接口 URL 构建 ==================== + +/** + * 构建同步对话请求 URL + * - integrateId → roleId + * - userId → accountId + * - chatId → 自动管理的对话 ID + */ function buildChatUrl(message: string): string { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig!.integrateId); + params.set('chatId', currentConfig!.chatId); + // integrateId 映射为 roleId + setIfPresent(params, 'roleId', currentConfig!.integrateId); + // userId 映射为 accountId setIfPresent(params, 'accountId', currentConfig!.userId); - setIfPresent(params, 'roleId', currentConfig!.roleId); - setIfPresent(params, 'categoryId', currentConfig!.categoryId); return buildUrl(`/ai/assistant_app/chat/sync?${params.toString()}`); } -/** 构建 SSE 流式请求 URL */ -function buildChatSSEUrl(message: string): string { +/** + * 构建 SSE 流式请求 URL + */ +function buildChatSSEUrl(message: string, categoryId?: number): string { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig!.integrateId); + params.set('chatId', currentConfig!.chatId); + setIfPresent(params, 'roleId', currentConfig!.integrateId); setIfPresent(params, 'accountId', currentConfig!.userId); - setIfPresent(params, 'roleId', currentConfig!.roleId); - setIfPresent(params, 'categoryId', currentConfig!.categoryId); + setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); return buildUrl(`/ai/assistant_app/chat/sse?${params.toString()}`); } /** - * 安全设置可选参数:仅当 value 非空时追加,数字类型直接转字符串 + * 构建 RAG 增强流式请求 URL */ -function setIfPresent(params: URLSearchParams, key: string, value: string | number | undefined): void { - if (value === undefined || value === null) return; - if (typeof value === 'string' && value.trim() === '') return; - params.set(key, String(value)); +function buildChatRAGSSEUrl(message: string, categoryId?: number): string { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig!.chatId); + params.set('rewriteStrategy', 'REWRITE'); + + setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'accountId', currentConfig!.userId); + setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); + + return buildUrl(`/ai/assistant_app/chat/rag/sse?${params.toString()}`); } +/** + * 构建 RAG 引用来源请求 URL + */ +function buildRagSourcesUrl(message: string, categoryId?: number): string { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig!.chatId); + params.set('rewriteStrategy', 'REWRITE'); + + setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'accountId', currentConfig!.userId); + setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); + + return buildUrl(`/ai/assistant_app/rag/sources?${params.toString()}`); +} + +// ==================== HTTP 基础封装 ==================== + /** 带超时的 fetch 封装 */ async function safeFetch( url: string, @@ -78,15 +140,12 @@ async function safeFetch( return response; } catch (err: unknown) { if (err instanceof DOMException && err.name === 'AbortError') { - throw new CskError('请求超时,请稍后重试', 'timeout'); + throw new CskError(t('error_timeout'), 'timeout'); } if (err instanceof TypeError && err.message.includes('Failed to fetch')) { - throw new CskError( - '跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', - 'cors' - ); + throw new CskError(t('error_cors'), 'cors'); } - throw new CskError('网络连接失败,请检查网络', 'network'); + throw new CskError(t('error_network'), 'network'); } finally { clearTimeout(timer); } @@ -102,91 +161,80 @@ export class CskError extends Error { } } -/** 根据 HTTP 状态码返回对应的中文错误消息 */ +/** 根据 HTTP 状态码返回对应的国际化错误消息 */ function getHttpErrorMessage(status: number): string { switch (status) { - case 401: - return '鉴权失败,请联系管理员'; - case 403: - return '无访问权限,请联系管理员配置'; - case 404: - return '请求的资源不存在'; - case 429: - return '请求过于频繁,请稍后重试'; - case 500: - return '服务器异常,请稍后重试'; + case 401: return t('error_auth'); + case 403: return t('error_forbidden'); + case 404: return t('error_not_found'); + case 429: return t('error_rate_limit'); + case 500: return t('error_server'); case 502: - case 503: - return '服务暂不可用,请稍后重试'; - default: - return `请求失败(状态码 ${status})`; + case 503: return t('error_unavailable'); + default: return `${t('error_unknown')}(${status})`; } } +// ==================== 对话请求 ==================== + /** * 同步对话请求 */ export async function chatRequest(message: string): Promise { const url = buildChatUrl(message); - const startTime = Date.now(); - - logger.info(`发送消息 integrateId=${currentConfig!.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig!.integrateId, message.length); try { const response = await safeFetch(url); - if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`请求失败 integrateId=${currentConfig!.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig!.integrateId, String(response.status), errorMsg); throw new CskError(errorMsg, `http_${response.status}`); } const text = await response.text(); - const duration = Date.now() - startTime; - logger.info(`AI 回复 integrateId=${currentConfig!.integrateId} length=${text.length} duration=${duration}ms`); - + logger.lifecycleReply(currentConfig!.integrateId, text.length); return text; } catch (err) { - if (err instanceof CskError) { - throw err; - } - logger.error(`请求异常 integrateId=${currentConfig!.integrateId}`, err); - throw new CskError('请求发生未知错误', 'unknown'); + if (err instanceof CskError) throw err; + logger.lifecycleError(currentConfig!.integrateId, 'unknown', String(err)); + throw new CskError(t('error_unknown'), 'unknown'); } } /** * SSE 流式对话请求 - * @param message 用户消息 - * @param onChunk 每次收到文本片段的回调 - * @param onDone 流结束时的回调 - * @param onError 发生错误时的回调 + * @param useRag 是否使用 RAG 增强对话 + * @param categoryId 知识库分类 ID */ export async function chatSSERequest( message: string, onChunk: (text: string) => void, onDone: () => void, - onError: (error: CskError) => void + onError: (error: CskError) => void, + categoryId?: number, + useRag?: boolean ): Promise { - const url = buildChatSSEUrl(message); - const startTime = Date.now(); + const url = useRag + ? buildChatRAGSSEUrl(message, categoryId) + : buildChatSSEUrl(message, categoryId); let totalText = ''; - logger.info(`发送流式消息 integrateId=${currentConfig!.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig!.integrateId, message.length); try { - const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); // SSE 超时更长 + const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`流式请求失败 integrateId=${currentConfig!.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig!.integrateId, String(response.status), errorMsg); onError(new CskError(errorMsg, `http_${response.status}`)); return; } const reader = response.body?.getReader(); if (!reader) { - onError(new CskError('浏览器不支持流式读取', 'stream_unsupported')); + onError(new CskError(t('error_stream_unsupported'), 'stream_unsupported')); return; } @@ -196,61 +244,41 @@ export async function chatSSERequest( try { while (true) { const { done, value } = await reader.read(); - if (done) { - break; - } + if (done) break; - // 解码并追加到 buffer buffer += decoder.decode(value, { stream: true }); - - // 按行解析 SSE 数据 const lines = buffer.split('\n'); - // 最后一行可能不完整,保留到下次 buffer = lines.pop() || ''; for (const line of lines) { const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith(':')) { - // 跳过空行和 SSE 注释 - continue; - } + if (!trimmed || trimmed.startsWith(':')) continue; - // 解析 "data: xxx" 格式 if (trimmed.startsWith('data:')) { const data = trimmed.substring(5).trim(); - if (data) { - totalText += data; - onChunk(data); - } + if (data) { totalText += data; onChunk(data); } } else if (trimmed === '[DONE]') { - // 流结束标记(OpenAI 风格,此处做兼容) break; } else if (!trimmed.startsWith('event:') && !trimmed.startsWith('id:') && !trimmed.startsWith('retry:')) { - // 可能是 Flux 裸文本格式(无 data: 前缀) totalText += trimmed; onChunk(trimmed); } } } - // 处理 buffer 中剩余的数据 if (buffer.trim()) { const trimmed = buffer.trim(); if (trimmed.startsWith('data:')) { const data = trimmed.substring(5).trim(); - if (data) { - totalText += data; - onChunk(data); - } + if (data) { totalText += data; onChunk(data); } } else if (trimmed !== '[DONE]') { totalText += trimmed; onChunk(trimmed); } } } catch (readErr: unknown) { - // 流中断不丢已接收的文本 if (totalText.length > 0) { - onChunk('\n\n[网络不稳定,内容可能不完整]'); + onChunk('\n\n' + t('stream_unstable')); } else { throw readErr; } @@ -258,15 +286,246 @@ export async function chatSSERequest( reader.releaseLock(); } - const duration = Date.now() - startTime; - logger.info(`流式回复完成 integrateId=${currentConfig!.integrateId} length=${totalText.length} duration=${duration}ms`); + logger.lifecycleStreamDone(currentConfig!.integrateId, totalText.length); onDone(); } catch (err) { if (err instanceof CskError) { onError(err); } else { - logger.error(`流式请求异常 integrateId=${currentConfig!.integrateId}`, err); - onError(new CskError('网络连接失败,请检查网络', 'network')); + logger.lifecycleError(currentConfig!.integrateId, 'unknown', String(err)); + onError(new CskError(t('error_network'), 'network')); + } + } +} + +// ==================== P1: 知识库分类 ==================== + +/** + * 获取知识库分类树 + */ +export async function fetchCategoryTree(): Promise { + const url = buildUrl('/category/tree'); + try { + const response = await safeFetch(url); + if (!response.ok) throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json: ApiResponse = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`加载分类树成功 count=${json.data.length}`); + return json.data; + } + return []; + } catch (err) { + if (err instanceof CskError) logger.error(`加载分类树失败: ${err.message}`); + else logger.error('加载分类树失败', err); + return []; + } +} + +// ==================== P1: RAG 引用来源 ==================== + +/** RAG 来源响应数据项 */ +interface RagSourceData { + documentId?: string; + title?: string; + sourceName?: string; + chunkIndex?: number; + score?: number; + snippet?: string; +} + +/** + * 获取 RAG 引用来源 + */ +export async function fetchRagSources(message: string, categoryId?: number): Promise { + const url = buildRagSourcesUrl(message, categoryId); + try { + const response = await safeFetch(url); + if (!response.ok) throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json: ApiResponse = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`获取引用来源 count=${json.data.length}`); + return json.data; + } + return []; + } catch (err) { + logger.error('获取引用来源失败', err); + return []; + } +} + +// ==================== P2: 会话管理 + chatId 初始化 ==================== + +/** 会话列表项 */ +interface ConversationItem { + conversationId?: string; + chatId?: string; + accountId?: string; + roleId?: number; + messageCount?: number; + lastMessageTime?: string; + firstMessageTime?: string; + lastMessagePreview?: string; + createdAt?: string; +} + +/** + * 获取会话列表 + */ +export async function fetchConversationList( + page: number = 1, + size: number = 20, + accountId?: string, + roleId?: string +): Promise<{ + list: ConversationItem[]; + total: number; + pages: number; +}> { + let path = `/conversation/list?page=${page}&size=${size}`; + if (accountId) path += `&accountId=${encodeURIComponent(accountId)}`; + if (roleId) path += `&roleId=${encodeURIComponent(roleId)}`; + const url = buildUrl(path); + + try { + const response = await safeFetch(url); + if (!response.ok) throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json: ApiResponse = await response.json(); + return { + list: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + pages: json.pages || 0, + }; + } catch (err) { + logger.error('加载会话列表失败', err); + return { list: [], total: 0, pages: 0 }; + } +} + +/** + * 获取会话消息 + */ +export async function fetchConversationMessages(conversationId: string): Promise<{ + messages: Array<{ messageType: string; content: string; createTime: string }>; + total: number; +}> { + const url = buildUrl(`/conversation/${conversationId}/messages`); + try { + const response = await safeFetch(url); + if (!response.ok) throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + return { + messages: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + }; + } catch (err) { + logger.error('加载会话消息失败', err); + return { messages: [], total: 0 }; + } +} + +/** + * 删除会话 + */ +export async function deleteConversation(conversationId: string): Promise { + const url = buildUrl(`/conversation/${conversationId}`); + try { + const response = await safeFetch(url, { method: 'DELETE' }); + if (!response.ok) throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json: ApiResponse = await response.json(); + logger.info(`删除会话 id=${conversationId} success=${json.success}`); + return json.success || false; + } catch (err) { + logger.error('删除会话失败', err); + return false; + } +} + +/** + * 导出会话 URL + */ +export function getConversationExportUrl(conversationId: string): string { + return buildUrl(`/conversation/${conversationId}/export`); +} + +// ==================== chatId 自动初始化 ==================== + +/** + * 初始化 chatId:查询后端已有会话,找到则复用,否则生成新的 + * + * 逻辑: + * 1. 先查 localStorage 缓存的 chatId(同一 integrateId + userId 可能复用) + * 2. 查 /conversation/list?accountId=X&roleId=Y 看是否有匹配的会话 + * 3. 有会话 → 使用最新会话的 conversationId 作为 chatId + * 4. 无会话 → 自动生成 chatId(格式:sdk_timestamp_random) + */ +export async function initChatId(): Promise { + if (!currentConfig) return ''; + + // 1. 先尝试从 localStorage 恢复 + const cachedChatId = loadCachedChatId(currentConfig.integrateId, currentConfig.userId); + if (cachedChatId) { + currentConfig.chatId = cachedChatId; + logger.info(`从缓存恢复 chatId=${cachedChatId}`); + return cachedChatId; + } + + // 2. 查询后端会话列表 + try { + const result = await fetchConversationList(1, 5, currentConfig.userId, currentConfig.integrateId); + if (result.list.length > 0) { + // 使用最新会话的 conversationId 作为 chatId + const latestConv = result.list[0]; + const chatId = latestConv.conversationId || latestConv.chatId || ''; + if (chatId) { + currentConfig.chatId = chatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, chatId); + logger.info(`从后端恢复会话 chatId=${chatId} messageCount=${latestConv.messageCount}`); + return chatId; + } + } + } catch (err) { + logger.warn('查询后端会话列表失败,将生成新 chatId', err); + } + + // 3. 生成新的 chatId + const newChatId = generateChatId(); + currentConfig.chatId = newChatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, newChatId); + logger.info(`生成新 chatId=${newChatId}`); + return newChatId; +} + +/** 生成 chatId(格式:sdk_timestamp_random) */ +function generateChatId(): string { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; +} + +/** localStorage key 格式 */ +function chatIdStorageKey(integrateId: string, userId?: string): string { + return `csk_chatId_${integrateId}${userId ? '_' + userId : ''}`; +} + +/** 从 localStorage 加载 chatId */ +function loadCachedChatId(integrateId: string, userId?: string): string { + try { + return localStorage.getItem(chatIdStorageKey(integrateId, userId)) || ''; + } catch { + return ''; + } +} + +/** 保存 chatId 到 localStorage */ +export function saveCachedChatId(integrateId: string, userId?: string, chatId?: string): void { + try { + if (chatId) { + localStorage.setItem(chatIdStorageKey(integrateId, userId), chatId); + } else { + localStorage.removeItem(chatIdStorageKey(integrateId, userId)); } + } catch { + // localStorage 不可用则忽略 } } diff --git a/client/src/chat.ts b/client/src/chat.ts index b998578..2b1ab30 100644 --- a/client/src/chat.ts +++ b/client/src/chat.ts @@ -1,16 +1,40 @@ /** * 对话核心模块 - 发送/接收/渲染 + * + * 核心参数映射: + * integrateId → roleId(客服角色 ID) + * userId → accountId(客户账号 ID) + * chatId → 自动管理(从 /conversation/list 获取或自动生成) */ -import { ResolvedConfig, ChatMessage } from './types'; -import { chatRequest, chatSSERequest, CskError } from './api'; +import { ResolvedConfig, ChatMessage, RagSource } from './types'; +import { + chatRequest, + chatSSERequest, + fetchCategoryTree, + fetchRagSources, + fetchConversationList, + fetchConversationMessages, + deleteConversation, + getConversationExportUrl, + initChatId, + updateChatId, + getChatId, + saveCachedChatId, + CskError, +} from './api'; import { renderUserBubble, renderAIBubble, createEmptyAIBubble, scrollToBottom, + renderSources, + renderHistoryList, + HistoryItemData, } from './dom'; import { saveMessages, loadMessages, clearMessages } from './storage'; +import { renderMarkdown } from './markdown'; import { logger } from './logger'; +import { t } from './i18n'; import { uuid, now } from './utils'; let config: ResolvedConfig | null = null; @@ -19,10 +43,18 @@ let messagesContainer: HTMLElement | null = null; let inputEl: HTMLTextAreaElement | null = null; let sendBtn: HTMLElement | null = null; let clearBtn: HTMLElement | null = null; +let categorySelect: HTMLSelectElement | null = null; +let historyPanel: HTMLElement | null = null; let showLoadingFn: (() => HTMLElement) | null = null; let hideLoadingFn: (() => void) | null = null; let isSending = false; +/** 当前选中的知识库分类 ID */ +let currentCategoryId: number | undefined; + +/** 当前是否使用 RAG 对话 */ +let useRag = false; + /** * 初始化对话模块 */ @@ -33,6 +65,8 @@ export function initChat( inputEl: HTMLTextAreaElement; sendBtn: HTMLElement; clearBtn: HTMLElement | null; + categorySelect: HTMLSelectElement | null; + historyPanel: HTMLElement; showLoading: () => HTMLElement; hideLoading: () => void; } @@ -42,17 +76,76 @@ export function initChat( inputEl = dom.inputEl; sendBtn = dom.sendBtn; clearBtn = dom.clearBtn; + categorySelect = dom.categorySelect; + historyPanel = dom.historyPanel; showLoadingFn = dom.showLoading; hideLoadingFn = dom.hideLoading; + // 初始化知识库分类 + currentCategoryId = cfg.categoryId; + useRag = !!cfg.categoryId || !!cfg.showCategorySwitch; + // 绑定发送事件 bindSendEvents(); - // 恢复历史消息 - const history = loadMessages(cfg.integrateId); - if (history.length > 0) { - messages = history; - renderHistory(); + // 加载知识库分类下拉框 + if (cfg.showCategorySwitch && categorySelect) { + loadCategories(); + } +} + +/** + * 初始化 chatId 并加载对话历史 + * 异步流程:查后端会话 → 恢复 chatId → 加载历史消息 + */ +export async function initChatHistory(): Promise { + if (!config || !messagesContainer) return; + + // 1. 初始化 chatId(从后端获取已有会话或自动生成) + await initChatId(); + + // 2. 尝试从后端加载对话历史 + await loadHistoryFromBackend(); + + // 3. 如果后端无历史,尝试从 localStorage 恢复 + if (messages.length === 0) { + const cached = loadMessages(config.integrateId); + if (cached.length > 0) { + messages = cached; + renderHistory(); + logger.info(`从本地缓存恢复 ${cached.length} 条消息`); + } + } +} + +/** + * 从后端加载对话历史 + */ +async function loadHistoryFromBackend(): Promise { + if (!config || !messagesContainer) return; + + const chatId = getChatId(); + if (!chatId) return; + + try { + const result = await fetchConversationMessages(chatId); + if (result.messages.length > 0) { + // 将后端消息转换为 ChatMessage 格式 + messages = result.messages.map((msg, idx) => ({ + id: uuid(), + role: msg.messageType === 'USER' ? 'user' : 'ai' as const, + content: msg.content, + timestamp: new Date(msg.createTime).getTime(), + })); + + renderHistory(); + logger.info(`从后端加载 ${messages.length} 条历史消息`); + + // 同步到 localStorage + saveMessages(config.integrateId, messages); + } + } catch (err) { + logger.warn('从后端加载历史消息失败', err); } } @@ -60,12 +153,8 @@ export function initChat( function bindSendEvents(): void { if (!inputEl || !sendBtn) return; - // 发送按钮点击 - sendBtn.addEventListener('click', () => { - handleSend(); - }); + sendBtn.addEventListener('click', () => handleSend()); - // 输入框键盘事件:回车发送 / Shift+Enter 换行 inputEl.addEventListener('keydown', (e: KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); @@ -73,16 +162,10 @@ function bindSendEvents(): void { } }); - // 输入框内容变化时启用/禁用发送按钮 - inputEl.addEventListener('input', () => { - updateSendBtnState(); - }); + inputEl.addEventListener('input', () => updateSendBtnState()); - // 清空按钮 if (clearBtn) { - clearBtn.addEventListener('click', () => { - handleClear(); - }); + clearBtn.addEventListener('click', () => handleClear()); } } @@ -104,35 +187,25 @@ async function handleSend(): Promise { const text = inputEl.value.trim(); if (text === '') return; - // 清空输入框 inputEl.value = ''; updateSendBtnState(); - - // 自动调整 textarea 高度 inputEl.style.height = 'auto'; isSending = true; updateSendBtnState(); + // 确保 chatId 已初始化 + if (!config.chatId) { + await initChatId(); + } + // 1. 渲染用户气泡 const userTimestamp = now(); - if (messagesContainer) { - renderUserBubble(messagesContainer, text, userTimestamp); - } - const userMsg: ChatMessage = { - id: uuid(), - role: 'user', - content: text, - timestamp: userTimestamp, - }; + if (messagesContainer) renderUserBubble(messagesContainer, text, userTimestamp); + const userMsg: ChatMessage = { id: uuid(), role: 'user', content: text, timestamp: userTimestamp }; messages.push(userMsg); - // 显示清空按钮 - if (clearBtn && messages.length > 0) { - clearBtn.style.display = 'inline-flex'; - } - - // 滚动到底部 + if (clearBtn && messages.length > 0) clearBtn.style.display = 'inline-flex'; if (messagesContainer) scrollToBottom(messagesContainer); // 2. 显示 loading @@ -143,41 +216,31 @@ async function handleSend(): Promise { try { let aiContent: string; const aiTimestamp = now(); + const shouldUseRag = useRag && (currentCategoryId !== undefined || config.categoryId !== undefined); if (config.streaming) { - // 流式输出:气泡由 sendStreamMessage 内部的 onChunk 回调创建 - aiContent = await sendStreamMessage(text, aiTimestamp); + aiContent = await sendStreamMessage(text, aiTimestamp, shouldUseRag); } else { - // 同步请求:需要在此渲染 AI 气泡 aiContent = await chatRequest(text); } - // 4. 隐藏 loading(流式模式在 onChunk 中已隐藏,此处做兜底) if (hideLoadingFn) hideLoadingFn(); - // 5. 非流式模式:在此渲染 AI 气泡;流式模式气泡已在 stream 回调中创建 if (!config.streaming && messagesContainer) { - renderAIBubble(messagesContainer, aiContent, aiTimestamp); + renderAIBubble(messagesContainer, aiContent, aiTimestamp, renderMarkdown); } - const aiMsg: ChatMessage = { - id: uuid(), - role: 'ai', - content: aiContent, - timestamp: aiTimestamp, - }; + const aiMsg: ChatMessage = { id: uuid(), role: 'ai', content: aiContent, timestamp: aiTimestamp }; messages.push(aiMsg); - // 6. 保存到 localStorage saveMessages(config.integrateId, messages); - - // 7. 滚动到底部 if (messagesContainer) scrollToBottom(messagesContainer); + + // RAG 引用来源 + if (shouldUseRag) fetchAndRenderSources(text, aiMsg); } catch (err) { - // 隐藏 loading if (hideLoadingFn) hideLoadingFn(); - // 渲染错误提示 - const errMsg = err instanceof CskError ? err.message : '发送失败,请稍后重试'; + const errMsg = err instanceof CskError ? err.message : t('error_send'); if (messagesContainer) { const errorBubble = document.createElement('div'); errorBubble.className = 'csk-msg csk-msg--ai'; @@ -196,104 +259,197 @@ async function handleSend(): Promise { } /** 流式发送消息 */ -async function sendStreamMessage(text: string, aiTimestamp: number): Promise { +async function sendStreamMessage(text: string, aiTimestamp: number, shouldUseRag: boolean): Promise { return new Promise((resolve, reject) => { let bubbleEl: HTMLElement | null = null; - let wrapperEl: HTMLElement | null = null; let accumulated = ''; let streamStarted = false; chatSSERequest( text, - // onChunk (chunk: string) => { accumulated += chunk; if (!streamStarted && messagesContainer) { - // 隐藏 loading,创建空 AI 气泡 if (hideLoadingFn) hideLoadingFn(); - const { wrapper, bubble } = createEmptyAIBubble(messagesContainer, aiTimestamp); - wrapperEl = wrapper; + const { bubble } = createEmptyAIBubble(messagesContainer, aiTimestamp); bubbleEl = bubble; streamStarted = true; } - if (bubbleEl) { - bubbleEl.textContent = accumulated; - } + if (bubbleEl) bubbleEl.textContent = accumulated; if (messagesContainer) scrollToBottom(messagesContainer); }, - // onDone () => { - // 如果流没有产生任何内容,回退同步请求 if (!streamStarted && accumulated === '') { - chatRequest(text) - .then((content) => resolve(content)) - .catch(reject); + chatRequest(text).then(resolve).catch(reject); return; } + if (bubbleEl && accumulated) bubbleEl.innerHTML = renderMarkdown(accumulated); resolve(accumulated); }, - // onError (error: CskError) => { if (accumulated.length > 0) { - // 有部分内容,保留并添加提示 - if (bubbleEl) { - bubbleEl.textContent = accumulated + '\n\n[回复被中断]'; - } + if (bubbleEl) bubbleEl.innerHTML = renderMarkdown(accumulated + '\n\n' + t('stream_interrupted')); resolve(accumulated); } else { reject(error); } - } + }, + currentCategoryId, + shouldUseRag ); }); } +/** 获取并渲染 RAG 引用来源 */ +async function fetchAndRenderSources(message: string, aiMsg: ChatMessage): Promise { + try { + const sources = await fetchRagSources(message, currentCategoryId); + if (sources.length > 0) { + const ragSources: RagSource[] = sources.map(s => ({ + documentId: s.documentId || '', + title: s.title || '', + sourceName: s.sourceName || '', + chunkIndex: s.chunkIndex ?? 0, + score: s.score ?? 0, + snippet: s.snippet || '', + })); + aiMsg.sources = ragSources; + if (messagesContainer) { + const lastAiMsg = messagesContainer.querySelector('.csk-msg--ai:last-of-type'); + if (lastAiMsg) renderSources(lastAiMsg as HTMLElement, ragSources); + } + if (config) saveMessages(config.integrateId, messages); + } + } catch (err) { + logger.warn('获取引用来源失败', err); + } +} + +/** 加载知识库分类到下拉框 */ +async function loadCategories(): Promise { + if (!categorySelect) return; + try { + const tree = await fetchCategoryTree(); + if (tree.length === 0) return; + categorySelect.innerHTML = ``; + + const addOptions = (nodes: typeof tree, indent: number = 0) => { + for (const node of nodes) { + const option = document.createElement('option'); + option.value = String(node.id); + option.textContent = `${' '.repeat(indent)}${node.name}`; + if (currentCategoryId !== undefined && String(node.id) === String(currentCategoryId)) option.selected = true; + categorySelect!.appendChild(option); + if (node.children && node.children.length > 0) addOptions(node.children, indent + 1); + } + }; + addOptions(tree); + logger.info(`知识库分类加载成功 count=${tree.length}`); + } catch (err) { + logger.error(t('category_load_error'), err); + } +} + /** 渲染历史消息 */ function renderHistory(): void { if (!messagesContainer) return; - // 清空容器 - messagesContainer.innerHTML = ''; + const historyPanelEl = messagesContainer.querySelector('.csk-history-panel'); + const msgs = messagesContainer.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); for (const msg of messages) { if (msg.role === 'user') { renderUserBubble(messagesContainer, msg.content, msg.timestamp); } else { - renderAIBubble(messagesContainer, msg.content, msg.timestamp); + const wrapper = renderAIBubble(messagesContainer, msg.content, msg.timestamp, renderMarkdown); + if (msg.sources && msg.sources.length > 0) renderSources(wrapper, msg.sources); } } scrollToBottom(messagesContainer); + if (clearBtn && messages.length > 0) clearBtn.style.display = 'inline-flex'; - // 显示清空按钮 - if (clearBtn && messages.length > 0) { - clearBtn.style.display = 'inline-flex'; + if (historyPanelEl && !messagesContainer.contains(historyPanelEl)) { + messagesContainer.appendChild(historyPanelEl); } } -/** 清空对话历史 */ +/** 清空对话历史(生成新 chatId) */ function handleClear(): void { if (!config) return; - - if (!confirm('确定清空所有对话记录?')) { - return; - } + if (!confirm(t('clear_confirm'))) return; messages = []; if (messagesContainer) { - messagesContainer.innerHTML = ''; - } - if (clearBtn) { - clearBtn.style.display = 'none'; + const msgs = messagesContainer.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); } + if (clearBtn) clearBtn.style.display = 'none'; clearMessages(config.integrateId); - logger.info(`清空会话 integrateId=${config.integrateId}`); + // 生成新的 chatId,开始新会话 + const newId = generateNewChatId(); + updateChatId(newId); + saveCachedChatId(config.integrateId, config.userId, newId); + + logger.lifecycleClear(config.integrateId); + logger.info(`新 chatId=${newId}`); } -/** - * 获取当前消息列表 - */ +/** 生成新 chatId */ +function generateNewChatId(): string { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; +} + +/** 设置当前知识库分类 */ +export function setCategory(categoryId: number | undefined): void { + currentCategoryId = categoryId; + useRag = categoryId !== undefined; + logger.lifecycleCategoryChange(categoryId ?? '全部'); +} + +// ==================== 会话管理面板 ==================== + +/** 加载会话列表并渲染 */ +export async function loadHistoryConversations(): Promise { + if (!historyPanel || !config) return; + + const listEl = historyPanel.querySelector('#csk-history-list') as HTMLElement; + if (!listEl) return; + + listEl.innerHTML = `
加载中...
`; + + try { + const result = await fetchConversationList(1, 50, config.userId, config.integrateId); + const items: HistoryItemData[] = result.list.map(c => ({ + id: c.conversationId || c.chatId || '', + chatId: c.conversationId || c.chatId || '', + messageCount: c.messageCount, + lastMessageTime: c.lastMessageTime, + createdAt: c.firstMessageTime || c.createdAt, + })); + + renderHistoryList( + listEl, + items, + (id: string) => { window.open(getConversationExportUrl(id), '_blank'); }, + async (id: string) => { + if (!confirm(t('history_delete_confirm'))) return; + const ok = await deleteConversation(id); + if (ok) loadHistoryConversations(); + } + ); + } catch (err) { + logger.error(t('history_load_error'), err); + listEl.innerHTML = `
${t('history_load_error')}
`; + } +} + +/** 获取当前消息列表 */ export function getMessages(): ChatMessage[] { return messages; } diff --git a/client/src/config.ts b/client/src/config.ts index 4f8a00f..332b472 100644 --- a/client/src/config.ts +++ b/client/src/config.ts @@ -1,5 +1,10 @@ /** * 配置解析模块 - 参数校验 + 默认值填充 + * + * 参数映射: + * integrateId → 后端 roleId(客服角色 ID) + * userId → 后端 accountId(客户账号 ID) + * chatId → 自动管理(不在用户配置中暴露) */ import { SDKConfig, ResolvedConfig } from './types'; import { logger } from './logger'; @@ -14,15 +19,16 @@ const DEFAULT_LAUNCHER_ICON = ` HTMLElement; hideLoading: () => void; } { @@ -62,10 +67,16 @@ export function createChatWindow(config: ResolvedConfig): { const actions = document.createElement('div'); actions.className = 'csk-header__actions'; + // 历史会话按钮(P2) + const historyBtn = document.createElement('button'); + historyBtn.className = 'csk-history-btn'; + historyBtn.setAttribute('title', t('history_title')); + historyBtn.innerHTML = ``; + // 最小化按钮 const minimizeBtn = document.createElement('button'); minimizeBtn.className = 'csk-header__btn csk-header__btn--minimize'; - minimizeBtn.setAttribute('title', '最小化'); + minimizeBtn.setAttribute('title', t('minimize')); minimizeBtn.innerHTML = ``; minimizeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); @@ -74,12 +85,13 @@ export function createChatWindow(config: ResolvedConfig): { // 关闭按钮 const closeBtn = document.createElement('button'); closeBtn.className = 'csk-header__btn csk-header__btn--close'; - closeBtn.setAttribute('title', '关闭'); + closeBtn.setAttribute('title', t('close')); closeBtn.innerHTML = ``; closeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); }); + actions.appendChild(historyBtn); actions.appendChild(minimizeBtn); actions.appendChild(closeBtn); header.appendChild(titleEl); @@ -90,6 +102,75 @@ export function createChatWindow(config: ResolvedConfig): { messagesContainer.id = 'csk-messages'; messagesContainer.className = 'csk-messages'; + // === 会话管理面板(P2,默认隐藏) === + const historyPanel = document.createElement('div'); + historyPanel.className = 'csk-history-panel csk-history-panel--hidden'; + historyPanel.innerHTML = ` +
+ ${t('history_title')} + +
+
+ `; + messagesContainer.appendChild(historyPanel); + + // 历史面板返回按钮 + const backBtn = historyPanel.querySelector('#csk-history-back'); + if (backBtn) { + backBtn.addEventListener('click', () => { + historyPanel.classList.add('csk-history-panel--hidden'); + }); + } + + // 历史按钮点击 + historyBtn.addEventListener('click', (e) => { + e.stopPropagation(); + const isHidden = historyPanel.classList.contains('csk-history-panel--hidden'); + historyPanel.classList.toggle('csk-history-panel--hidden'); + if (isHidden) { + // 触发自定义事件,通知加载会话列表 + windowEl.dispatchEvent(new CustomEvent('csk:loadHistory')); + } + }); + + // === 知识库分类下拉框(P1) === + let categorySelect: HTMLSelectElement | null = null; + if (config.showCategorySwitch) { + const categoryBar = document.createElement('div'); + categoryBar.className = 'csk-category-bar'; + + const categoryLabel = document.createElement('span'); + categoryLabel.className = 'csk-category-bar__label'; + categoryLabel.textContent = '📚'; + + categorySelect = document.createElement('select'); + categorySelect.id = 'csk-category-select'; + categorySelect.className = 'csk-category-select'; + categorySelect.innerHTML = ``; + + // onChange 触发自定义事件 + categorySelect.addEventListener('change', () => { + const selectedId = categorySelect!.value; + windowEl.dispatchEvent(new CustomEvent('csk:categoryChange', { + detail: { categoryId: selectedId ? Number(selectedId) : undefined } + })); + }); + + categoryBar.appendChild(categoryLabel); + categoryBar.appendChild(categorySelect); + + // 插入到 messages 和 inputArea 之间 + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + windowEl.appendChild(categoryBar); + } else { + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + } + // === 输入区 === const inputArea = document.createElement('div'); inputArea.className = 'csk-input-area'; @@ -97,23 +178,19 @@ export function createChatWindow(config: ResolvedConfig): { const inputEl = document.createElement('textarea'); inputEl.id = 'csk-input'; inputEl.className = 'csk-input'; - inputEl.setAttribute('placeholder', '输入您的问题...'); + inputEl.setAttribute('placeholder', t('placeholder')); inputEl.setAttribute('rows', '1'); inputEl.setAttribute('autofocus', ''); const sendBtn = document.createElement('button'); sendBtn.id = 'csk-send-btn'; sendBtn.className = 'csk-send-btn'; - sendBtn.setAttribute('title', '发送'); + sendBtn.setAttribute('title', t('send')); sendBtn.setAttribute('disabled', 'true'); sendBtn.innerHTML = ``; inputArea.appendChild(inputEl); inputArea.appendChild(sendBtn); - - // === 组装 === - windowEl.appendChild(header); - windowEl.appendChild(messagesContainer); windowEl.appendChild(inputArea); // 清空按钮(可选) @@ -121,9 +198,9 @@ export function createChatWindow(config: ResolvedConfig): { if (config.showClear) { clearBtn = document.createElement('button'); clearBtn.className = 'csk-clear-btn'; - clearBtn.textContent = '清空对话'; + clearBtn.textContent = t('clear'); clearBtn.style.display = 'none'; // 初始隐藏,有消息后才显示 - // 插入到 messages 之后、inputArea 之前 + // 插入到 categoryBar/inputArea 之前 windowEl.insertBefore(clearBtn, inputArea); } @@ -160,6 +237,8 @@ export function createChatWindow(config: ResolvedConfig): { inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading, hideLoading, }; @@ -237,14 +316,19 @@ export function renderUserBubble(container: HTMLElement, text: string, timestamp return wrapper; } -/** 渲染 AI 消息气泡 */ -export function renderAIBubble(container: HTMLElement, text: string, timestamp: number): HTMLElement { +/** 渲染 AI 消息气泡(支持 Markdown) */ +export function renderAIBubble(container: HTMLElement, text: string, timestamp: number, renderMd?: (text: string) => string): HTMLElement { const wrapper = document.createElement('div'); wrapper.className = 'csk-msg csk-msg--ai'; const bubble = document.createElement('div'); bubble.className = 'csk-msg__bubble'; - bubble.textContent = text; + // 支持 Markdown 渲染,传入渲染函数则使用,否则纯文本 + if (renderMd) { + bubble.innerHTML = renderMd(text); + } else { + bubble.textContent = text; + } const time = document.createElement('div'); time.className = 'csk-msg__time'; @@ -277,6 +361,169 @@ export function createEmptyAIBubble(container: HTMLElement, timestamp: number): return { wrapper, bubble }; } +// ==================== P1: RAG 引用来源渲染 ==================== + +/** 渲染 RAG 引用来源卡片 */ +export function renderSources(wrapper: HTMLElement, sources: RagSource[]): void { + // 移除已有的来源卡片 + const existing = wrapper.querySelector('.csk-sources'); + if (existing) existing.remove(); + + if (!sources || sources.length === 0) return; + + const sourcesEl = document.createElement('div'); + sourcesEl.className = 'csk-sources csk-sources--collapsed'; + + // 头部 + const header = document.createElement('div'); + header.className = 'csk-sources__header'; + + const titleSpan = document.createElement('span'); + titleSpan.className = 'csk-sources__title'; + titleSpan.textContent = `📚 ${t('source_count', { n: sources.length })}`; + + const arrow = document.createElement('span'); + arrow.className = 'csk-sources__arrow'; + arrow.textContent = '▼'; + + header.appendChild(titleSpan); + header.appendChild(arrow); + + // 点击折叠/展开 + header.addEventListener('click', () => { + sourcesEl.classList.toggle('csk-sources--collapsed'); + }); + + // 内容 + const body = document.createElement('div'); + body.className = 'csk-sources__body'; + + for (const src of sources) { + const item = document.createElement('div'); + item.className = 'csk-source-item'; + + const name = document.createElement('div'); + name.className = 'csk-source-item__name'; + name.textContent = src.title || src.sourceName || '未知文档'; + + if (src.snippet) { + const snippet = document.createElement('div'); + snippet.className = 'csk-source-item__snippet'; + snippet.textContent = src.snippet; + item.appendChild(snippet); + } + + const meta = document.createElement('div'); + meta.className = 'csk-source-item__meta'; + const metaParts: string[] = []; + if (src.sourceName) metaParts.push(src.sourceName); + if (src.chunkIndex !== undefined) metaParts.push(`分块 #${src.chunkIndex}`); + if (src.score !== undefined) metaParts.push(`相关度 ${(src.score * 100).toFixed(0)}%`); + meta.textContent = metaParts.join(' · '); + + item.appendChild(name); + item.appendChild(meta); + body.appendChild(item); + } + + sourcesEl.appendChild(header); + sourcesEl.appendChild(body); + + // 插入到气泡和时间戳之间 + const timeEl = wrapper.querySelector('.csk-msg__time'); + if (timeEl) { + wrapper.insertBefore(sourcesEl, timeEl); + } else { + wrapper.appendChild(sourcesEl); + } +} + +// ==================== P2: 会话管理面板渲染 ==================== + +/** 会话列表项数据 */ +export interface HistoryItemData { + id: string; + chatId?: string; + messageCount?: number; + lastMessageTime?: string; + createdAt?: string; +} + +/** 渲染会话列表 */ +export function renderHistoryList( + listEl: HTMLElement, + items: HistoryItemData[], + onExport: (id: string) => void, + onDelete: (id: string) => void, + emptyText?: string +): void { + listEl.innerHTML = ''; + + if (items.length === 0) { + const empty = document.createElement('div'); + empty.className = 'csk-history-panel__empty'; + empty.innerHTML = ` +
💬
+
${emptyText || t('history_empty')}
+ `; + listEl.appendChild(empty); + return; + } + + for (const item of items) { + const el = document.createElement('div'); + el.className = 'csk-history-item'; + + const info = document.createElement('div'); + info.className = 'csk-history-item__info'; + + const idEl = document.createElement('div'); + idEl.className = 'csk-history-item__id'; + idEl.textContent = item.chatId || item.id; + + const metaEl = document.createElement('div'); + metaEl.className = 'csk-history-item__meta'; + const metaParts: string[] = []; + if (item.messageCount !== undefined) metaParts.push(`${item.messageCount} 条消息`); + if (item.lastMessageTime) metaParts.push(item.lastMessageTime); + else if (item.createdAt) metaParts.push(item.createdAt); + metaEl.textContent = metaParts.join(' · '); + + info.appendChild(idEl); + info.appendChild(metaEl); + + const actionsEl = document.createElement('div'); + actionsEl.className = 'csk-history-item__actions'; + + // 导出按钮 + const exportBtn = document.createElement('button'); + exportBtn.className = 'csk-history-action csk-history-action--export'; + exportBtn.setAttribute('title', t('history_export')); + exportBtn.innerHTML = ``; + exportBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onExport(item.id); + }); + + // 删除按钮 + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'csk-history-action csk-history-action--delete'; + deleteBtn.setAttribute('title', t('history_delete')); + deleteBtn.innerHTML = ``; + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onDelete(item.id); + }); + + actionsEl.appendChild(exportBtn); + actionsEl.appendChild(deleteBtn); + + el.appendChild(info); + el.appendChild(actionsEl); + listEl.appendChild(el); + } +} + /** 滚动消息区到底部 */ export function scrollToBottom(container: HTMLElement): void { container.scrollTop = container.scrollHeight; diff --git a/client/src/i18n.ts b/client/src/i18n.ts new file mode 100644 index 0000000..ed604c0 --- /dev/null +++ b/client/src/i18n.ts @@ -0,0 +1,152 @@ +/** + * 多语言国际化模块 - i18n 字典 + 翻译函数 + */ + +/** 语言包字典 */ +const dictionaries: Record> = { + 'zh-CN': { + // 头部 + title: 'AI 智能助手', + minimize: '最小化', + close: '关闭', + + // 输入区 + placeholder: '输入您的问题...', + send: '发送', + + // 消息 + loading: '正在思考...', + stream_interrupted: '回复被中断', + stream_unstable: '网络不稳定,内容可能不完整', + + // 知识库 + category_placeholder: '选择知识库分类', + category_all: '全部分类', + category_load_error: '加载分类失败', + source_title: '参考来源', + source_count: '{n} 条参考来源', + source_loading: '加载来源中...', + + // 清空/管理 + clear: '清空对话', + clear_confirm: '确定清空所有对话记录?', + + // 历史会话 + history_title: '历史会话', + history_empty: '暂无历史会话', + history_load_error: '加载会话列表失败', + history_delete_confirm: '确定删除该会话?', + history_export: '导出', + history_delete: '删除', + + // 错误提示 + error_network: '网络连接失败,请检查网络', + error_timeout: '请求超时,请稍后重试', + error_server: '服务器异常,请稍后重试', + error_cors: '跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', + error_auth: '鉴权失败,请联系管理员', + error_forbidden: '无访问权限,请联系管理员配置', + error_not_found: '请求的资源不存在', + error_rate_limit: '请求过于频繁,请稍后重试', + error_unavailable: '服务暂不可用,请稍后重试', + error_unknown: '请求发生未知错误', + error_send: '发送失败,请稍后重试', + error_stream_unsupported: '浏览器不支持流式读取', + }, + + 'en': { + // Header + title: 'AI Assistant', + minimize: 'Minimize', + close: 'Close', + + // Input + placeholder: 'Type your question...', + send: 'Send', + + // Messages + loading: 'Thinking...', + stream_interrupted: 'Response interrupted', + stream_unstable: 'Network unstable, content may be incomplete', + + // Knowledge base + 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/Management + clear: 'Clear chat', + clear_confirm: 'Clear all conversation history?', + + // 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', + + // Errors + 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 currentLocale = 'zh-CN'; + +/** + * 设置当前语言 + */ +export function setLocale(locale: string): void { + if (dictionaries[locale]) { + currentLocale = locale; + } else { + // 尝试匹配语言前缀(如 zh -> zh-CN) + const prefix = locale.split('-')[0]; + const matched = Object.keys(dictionaries).find(k => k.startsWith(prefix)); + if (matched) { + currentLocale = matched; + } + // 未匹配则保持默认 zh-CN + } +} + +/** + * 获取翻译文本 + * @param key 翻译 key + * @param params 插值参数,如 { n: 3 } 替换 {n} + */ +export function t(key: string, params?: Record): string { + const dict = dictionaries[currentLocale] || dictionaries['zh-CN']; + let text = dict[key] || dictionaries['zh-CN'][key] || key; + + // 简单插值替换:{n} → 实际值 + if (params) { + for (const [k, v] of Object.entries(params)) { + text = text.replace(`{${k}}`, String(v)); + } + } + + return text; +} + +/** + * 获取当前语言 + */ +export function getLocale(): string { + return currentLocale; +} diff --git a/client/src/index.ts b/client/src/index.ts index b386c28..eaa8b55 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -1,6 +1,11 @@ /** * ChatbotSDK 入口文件 * 单例模式,IIFE 挂载 window.ChatbotSDK + * + * 参数映射: + * integrateId → roleId(客服角色 ID) + * userId → accountId(客户账号 ID) + * chatId → 自动管理(从 /conversation/list 获取或自动生成) */ import { SDKConfig, ResolvedConfig, ChatbotSDKInstance } from './types'; import { parseConfig } from './config'; @@ -8,8 +13,9 @@ import { setDebug, logger } from './logger'; import { setApiConfig } from './api'; import { injectStyles, removeStyles } from './styles'; import { createLauncher, createChatWindow, enableDrag } from './dom'; -import { initChat, getMessages } from './chat'; +import { initChat, initChatHistory, getMessages, setCategory, loadHistoryConversations } from './chat'; import { clearMessages } from './storage'; +import { setLocale } from './i18n'; // ==================== 单例状态 ==================== @@ -21,6 +27,8 @@ let messagesContainer: HTMLElement | null = null; let inputEl: HTMLTextAreaElement | null = null; let sendBtn: HTMLElement | null = null; let clearBtn: HTMLElement | null = null; +let categorySelect: HTMLSelectElement | null = null; +let historyPanel: HTMLElement | null = null; let showLoadingFn: (() => HTMLElement) | null = null; let hideLoadingFn: (() => void) | null = null; let dragCleanup: (() => void) | null = null; @@ -36,81 +44,85 @@ function init(rawConfig: SDKConfig): void { // 1. 配置解析与校验 const parsed = parseConfig(rawConfig); - if (!parsed) { - return; // parseConfig 已输出错误 - } + if (!parsed) return; config = parsed; - // 2. 设置日志级别 + // 2. 设置国际化语言 + setLocale(config.locale); + + // 3. 设置日志级别 setDebug(config.debug); - // 3. 设置 API 配置 + // 4. 设置 API 配置 setApiConfig(config); - // 4. 注入样式 + // 5. 注入样式 injectStyles(config); - // 5. 创建悬浮按钮 + // 6. 创建悬浮按钮 launcherEl = createLauncher(config, toggle); document.body.appendChild(launcherEl); - // 6. 创建聊天弹窗 + // 7. 创建聊天弹窗 const dom = createChatWindow(config); windowEl = dom.window; messagesContainer = dom.messagesContainer; inputEl = dom.inputEl; sendBtn = dom.sendBtn; clearBtn = dom.clearBtn; + categorySelect = dom.categorySelect; + historyPanel = dom.historyPanel; showLoadingFn = dom.showLoading; hideLoadingFn = dom.hideLoading; document.body.appendChild(windowEl); - // 7. 启用拖拽 + // 8. 启用拖拽 const headerEl = windowEl.querySelector('.csk-header') as HTMLElement; if (headerEl) { dragCleanup = enableDrag(headerEl, windowEl); } - // 8. 初始化对话模块 + // 9. 初始化对话模块 initChat(config, { messagesContainer, inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading: showLoadingFn, hideLoading: hideLoadingFn, }); + // 10. 监听知识库分类切换事件 + windowEl.addEventListener('csk:categoryChange', ((e: CustomEvent) => { + setCategory(e.detail.categoryId); + }) as EventListener); + + // 11. 监听会话管理面板加载事件 + windowEl.addEventListener('csk:loadHistory', () => { + loadHistoryConversations(); + }); + isInitialized = true; - logger.info(`初始化完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + logger.lifecycleInit(config.integrateId, config.requestDomain); + + // 12. 异步初始化 chatId 和对话历史(不阻塞 UI) + initChatHistory().catch(err => { + logger.warn('chatId 初始化失败,将在发送消息时重试', err); + }); } /** 销毁 SDK 实例 */ function destroy(): void { - if (!isInitialized) { - return; - } + if (!isInitialized) return; - // 移除 DOM 元素 - if (launcherEl && launcherEl.parentNode) { - launcherEl.parentNode.removeChild(launcherEl); - launcherEl = null; - } - if (windowEl && windowEl.parentNode) { - windowEl.parentNode.removeChild(windowEl); - windowEl = null; - } + if (launcherEl && launcherEl.parentNode) { launcherEl.parentNode.removeChild(launcherEl); launcherEl = null; } + if (windowEl && windowEl.parentNode) { windowEl.parentNode.removeChild(windowEl); windowEl = null; } + if (dragCleanup) { dragCleanup(); dragCleanup = null; } - // 移除拖拽事件 - if (dragCleanup) { - dragCleanup(); - dragCleanup = null; - } - - // 移除样式 removeStyles(); - // 重置状态 const oldIntegrateId = config?.integrateId; config = null; isInitialized = false; @@ -118,47 +130,38 @@ function destroy(): void { inputEl = null; sendBtn = null; clearBtn = null; + categorySelect = null; + historyPanel = null; showLoadingFn = null; hideLoadingFn = null; - logger.info(`销毁实例 integrateId=${oldIntegrateId}`); + logger.lifecycleDestroy(oldIntegrateId || ''); } -/** 打开聊天窗口 */ function open(): void { if (!windowEl) return; windowEl.classList.remove('csk-window--hidden'); } -/** 关闭聊天窗口 */ function close(): void { if (!windowEl) return; windowEl.classList.add('csk-window--hidden'); } -/** 切换窗口显示/隐藏 */ function toggle(): void { if (!windowEl) return; if (windowEl.classList.contains('csk-window--hidden')) { open(); - // 聚焦输入框 - setTimeout(() => { - if (inputEl) inputEl.focus(); - }, 100); + setTimeout(() => { if (inputEl) inputEl.focus(); }, 100); } else { close(); } } -/** 清空当前会话历史 */ function clearHistory(): void { if (!config) return; - // 通过触发自定义事件,让 chat 模块处理 - if (clearBtn) { - clearBtn.click(); - } else if (confirm('确定清空所有对话记录?')) { - clearMessages(config.integrateId); - } + if (clearBtn) { clearBtn.click(); } + else if (confirm('确定清空所有对话记录?')) { clearMessages(config.integrateId); } } // ==================== 挂载到全局 ==================== @@ -172,7 +175,6 @@ const ChatbotSDK: ChatbotSDKInstance = { clearHistory, }; -// IIFE 自动挂载 if (typeof window !== 'undefined') { (window as unknown as Record).ChatbotSDK = ChatbotSDK; } diff --git a/client/src/logger.ts b/client/src/logger.ts index 71b9b67..4f556ed 100644 --- a/client/src/logger.ts +++ b/client/src/logger.ts @@ -1,5 +1,6 @@ /** * 日志模块 - 统一带 [ChatbotSDK] 前缀的控制台输出 + * 支持分级输出、结构化日志、性能计时 */ import { ResolvedConfig } from './types'; @@ -12,15 +13,18 @@ export function setDebug(enabled: boolean): void { debugEnabled = enabled; } +/** 性能计时器 */ +const timers: Record = {}; + export const logger = { - /** 普通信息日志 */ + /** 普通信息日志(受 debug 开关控制) */ info(msg: string, data?: unknown): void { if (debugEnabled) { console.log(PREFIX, msg, data !== undefined ? data : ''); } }, - /** 警告日志 */ + /** 警告日志(受 debug 开关控制) */ warn(msg: string, data?: unknown): void { if (debugEnabled) { console.warn(PREFIX, msg, data !== undefined ? data : ''); @@ -31,4 +35,68 @@ export const logger = { error(msg: string, data?: unknown): void { console.error(PREFIX, msg, data !== undefined ? data : ''); }, + + /** 开始计时 */ + time(label: string): void { + timers[label] = Date.now(); + }, + + /** 结束计时并输出日志 */ + timeEnd(label: string, prefix?: string): number { + const start = timers[label]; + if (start !== undefined) { + const duration = Date.now() - start; + delete timers[label]; + if (debugEnabled) { + const msg = prefix ? `${prefix} ${duration}ms` : `${label} ${duration}ms`; + console.log(PREFIX, msg); + } + return duration; + } + return 0; + }, + + /** 生命周期日志:init */ + lifecycleInit(integrateId: string, requestDomain: string): void { + this.info(`初始化完成 integrateId=${integrateId} requestDomain=${requestDomain}`); + }, + + /** 生命周期日志:destroy */ + lifecycleDestroy(integrateId: string): void { + this.info(`销毁实例 integrateId=${integrateId}`); + }, + + /** 生命周期日志:sendMessage */ + lifecycleSend(integrateId: string, length: number): void { + this.info(`发送消息 integrateId=${integrateId} length=${length}`); + this.time(`send_${integrateId}`); + }, + + /** 生命周期日志:收到回复 */ + lifecycleReply(integrateId: string, length: number): void { + const duration = this.timeEnd(`send_${integrateId}`, 'AI 回复'); + this.info(`AI 回复 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + + /** 生命周期日志:请求失败 */ + lifecycleError(integrateId: string, status: string, message: string): void { + this.timeEnd(`send_${integrateId}`); + this.error(`请求失败 integrateId=${integrateId} status=${status} message=${message}`); + }, + + /** 生命周期日志:清空会话 */ + lifecycleClear(integrateId: string): void { + this.info(`清空会话 integrateId=${integrateId}`); + }, + + /** 生命周期日志:流式回复完成 */ + lifecycleStreamDone(integrateId: string, length: number): void { + const duration = this.timeEnd(`send_${integrateId}`, '流式回复'); + this.info(`流式回复完成 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + + /** 生命周期日志:知识库切换 */ + lifecycleCategoryChange(categoryId: string | number): void { + this.info(`切换知识库分类 categoryId=${categoryId}`); + }, }; diff --git a/client/src/markdown.ts b/client/src/markdown.ts new file mode 100644 index 0000000..a20af3d --- /dev/null +++ b/client/src/markdown.ts @@ -0,0 +1,212 @@ +/** + * 轻量级 Markdown 渲染器 - 无外部依赖,XSS 安全 + * + * 支持:代码块、行内代码、标题、粗体、斜体、列表、链接、引用、段落 + * 策略:先转义 HTML,再转 Markdown 为安全 HTML 标签 + */ +import { escapeHtml } from './utils'; + +/** 代码块占位符前缀 */ +const CODE_BLOCK_PREFIX = '\x00CODEBLOCK_'; + +/** 行内代码占位符前缀 */ +const INLINE_CODE_PREFIX = '\x00INLINECODE_'; + +/** + * 渲染 Markdown 文本为安全 HTML + * @param text Markdown 源文本 + * @returns 安全 HTML 字符串 + */ +export function renderMarkdown(text: string): string { + if (!text || typeof text !== 'string') return ''; + + // 1. 提取代码块(防止内部 Markdown 被处理) + const codeBlocks: string[] = []; + let processed = text; + + // 提取围栏代码块 ``` + processed = processed.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => { + const idx = codeBlocks.length; + const escapedCode = escapeHtml(code.trimEnd()); + const langClass = lang ? ` class="language-${escapeHtml(lang)}"` : ''; + codeBlocks.push(`
${escapedCode}
`); + return `${CODE_BLOCK_PREFIX}${idx}\x00`; + }); + + // 2. 提取行内代码 + const inlineCodes: string[] = []; + processed = processed.replace(/`([^`\n]+)`/g, (_match, code) => { + const idx = inlineCodes.length; + inlineCodes.push(`${escapeHtml(code)}`); + return `${INLINE_CODE_PREFIX}${idx}\x00`; + }); + + // 3. 转义剩余 HTML(代码块和行内代码已安全处理) + processed = escapeHtml(processed); + + // 4. 还原代码块和行内代码占位符(它们已经是安全 HTML) + processed = restorePlaceholders(processed, CODE_BLOCK_PREFIX, codeBlocks); + processed = restorePlaceholders(processed, INLINE_CODE_PREFIX, inlineCodes); + + // 5. 逐行处理 Markdown 语法 + const lines = processed.split('\n'); + const result: string[] = []; + let inList = false; + let listType = ''; // 'ul' 或 'ol' + let inBlockquote = false; + let paragraphBuffer: string[] = []; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + + // 代码块已在占位符还原阶段处理,直接输出 + if (line.includes(CODE_BLOCK_PREFIX) || line.includes('
')) {
+      flushParagraph();
+      closeList();
+      closeBlockquote();
+      result.push(line);
+      continue;
+    }
+
+    // 标题
+    const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
+    if (headingMatch) {
+      flushParagraph();
+      closeList();
+      closeBlockquote();
+      const level = headingMatch[1].length;
+      result.push(`${headingMatch[2]}`);
+      continue;
+    }
+
+    // 引用
+    const quoteMatch = line.match(/^>\s?(.*)/);
+    if (quoteMatch) {
+      flushParagraph();
+      closeList();
+      if (!inBlockquote) {
+        inBlockquote = true;
+        result.push('
'); + } + result.push(`

${inlineFormat(quoteMatch[1])}

`); + continue; + } else if (inBlockquote) { + closeBlockquote(); + } + + // 无序列表 + const ulMatch = line.match(/^[\-\*]\s+(.+)/); + if (ulMatch) { + flushParagraph(); + closeBlockquote(); + if (!inList || listType !== 'ul') { + closeList(); + inList = true; + listType = 'ul'; + result.push('
    '); + } + result.push(`
  • ${inlineFormat(ulMatch[1])}
  • `); + continue; + } + + // 有序列表 + const olMatch = line.match(/^\d+\.\s+(.+)/); + if (olMatch) { + flushParagraph(); + closeBlockquote(); + if (!inList || listType !== 'ol') { + closeList(); + inList = true; + listType = 'ol'; + result.push('
      '); + } + result.push(`
    1. ${inlineFormat(olMatch[1])}
    2. `); + continue; + } + + // 空行 → 段落分隔 + if (line.trim() === '') { + flushParagraph(); + closeList(); + continue; + } + + // 水平线 + if (/^(\*{3,}|-{3,}|_{3,})$/.test(line.trim())) { + flushParagraph(); + closeList(); + closeBlockquote(); + result.push('
      '); + continue; + } + + // 普通文本 → 收集到段落缓冲 + closeList(); + closeBlockquote(); + paragraphBuffer.push(inlineFormat(line)); + } + + flushParagraph(); + closeList(); + closeBlockquote(); + + return result.join('\n'); + + // === 辅助函数 === + + /** 行内格式化:粗体、斜体、链接 */ + function inlineFormat(text: string): string { + // 粗体 **text** 或 __text__ + text = text.replace(/\*\*(.+?)\*\*/g, '$1'); + text = text.replace(/__(.+?)__/g, '$1'); + // 斜体 *text* 或 _text_ + text = text.replace(/\*(.+?)\*/g, '$1'); + text = text.replace(/(?$1'); + // 删除线 ~~text~~ + text = text.replace(/~~(.+?)~~/g, '$1'); + // 链接 [text](url) + text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, linkText, url) => { + // 只允许 http/https 链接,防止 javascript: 协议 + const safeUrl = /^https?:\/\//i.test(url) ? url : '#'; + return `${linkText}`; + }); + return text; + } + + /** 将段落缓冲输出为

      */ + function flushParagraph(): void { + if (paragraphBuffer.length > 0) { + result.push(`

      ${paragraphBuffer.join('
      ')}

      `); + paragraphBuffer = []; + } + } + + /** 关闭列表 */ + function closeList(): void { + if (inList) { + result.push(listType === 'ul' ? '
' : ''); + inList = false; + listType = ''; + } + } + + /** 关闭引用块 */ + function closeBlockquote(): void { + if (inBlockquote) { + result.push('
'); + inBlockquote = false; + } + } +} + +/** 还原占位符为安全 HTML */ +function restorePlaceholders(text: string, prefix: string, replacements: string[]): string { + return text.replace(new RegExp(escapeRegex(prefix) + '(\\d+)\x00', 'g'), (_m, idx) => { + return replacements[parseInt(idx)] || ''; + }); +} + +/** 转义正则特殊字符 */ +function escapeRegex(str: string): string { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} diff --git a/client/src/styles.ts b/client/src/styles.ts index 95f5207..90d1b38 100644 --- a/client/src/styles.ts +++ b/client/src/styles.ts @@ -1,5 +1,7 @@ /** * 样式注入模块 - CSS 自动注入,csk- 命名空间隔离 + * P1 新增:知识库下拉框、RAG 引用来源卡片、Markdown 渲染样式 + * P2 新增:会话管理面板样式 */ import { ResolvedConfig } from './types'; @@ -300,6 +302,366 @@ function getStyles(config: ResolvedConfig): string { color: #DC2626; } +/* ========== P1: 知识库分类下拉 ========== */ +.csk-category-bar { + display: flex; + align-items: center; + padding: 6px 12px; + border-top: 1px solid #E5E7EB; + background: #F9FAFB; + gap: 8px; +} +.csk-category-bar__label { + font-size: 12px; + color: #6B7280; + white-space: nowrap; +} +.csk-category-select { + flex: 1; + padding: 5px 8px; + border: 1px solid #E5E7EB; + border-radius: 6px; + font-size: 12px; + color: #374151; + background: #fff; + outline: none; + cursor: pointer; + font-family: inherit; + transition: border-color 0.2s; + max-width: 200px; +} +.csk-category-select:focus { + border-color: var(--csk-primary); +} + +/* ========== P1: RAG 引用来源卡片 ========== */ +.csk-sources { + margin-top: 8px; + border: 1px solid #E5E7EB; + border-radius: 8px; + overflow: hidden; + font-size: 12px; + max-width: 100%; +} +.csk-sources__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + background: #F9FAFB; + cursor: pointer; + user-select: none; + transition: background 0.15s; +} +.csk-sources__header:hover { + background: #F3F4F6; +} +.csk-sources__title { + display: flex; + align-items: center; + gap: 4px; + font-weight: 500; + color: #374151; +} +.csk-sources__arrow { + transition: transform 0.2s; + color: #9CA3AF; +} +.csk-sources--collapsed .csk-sources__arrow { + transform: rotate(-90deg); +} +.csk-sources__body { + border-top: 1px solid #E5E7EB; + padding: 0; +} +.csk-sources--collapsed .csk-sources__body { + display: none; +} +.csk-source-item { + padding: 8px 12px; + border-bottom: 1px solid #F3F4F6; + transition: background 0.15s; +} +.csk-source-item:last-child { + border-bottom: none; +} +.csk-source-item:hover { + background: #F9FAFB; +} +.csk-source-item__name { + font-weight: 500; + color: #1F2937; + margin-bottom: 2px; +} +.csk-source-item__snippet { + color: #6B7280; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.csk-source-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} + +/* ========== P1: Markdown 渲染样式 ========== */ +.csk-msg--ai .csk-msg__bubble .csk-md-p { + margin: 0 0 8px; +} +.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { + margin-bottom: 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1, +.csk-msg--ai .csk-msg__bubble .csk-md-h2, +.csk-msg--ai .csk-msg__bubble .csk-md-h3, +.csk-msg--ai .csk-msg__bubble .csk-md-h4, +.csk-msg--ai .csk-msg__bubble .csk-md-h5, +.csk-msg--ai .csk-msg__bubble .csk-md-h6 { + margin: 12px 0 6px; + font-weight: 600; + line-height: 1.3; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; } + +.csk-md-code-block { + background: #1E293B; + color: #E2E8F0; + padding: 12px 14px; + border-radius: 8px; + overflow-x: auto; + margin: 8px 0; + font-size: 13px; + line-height: 1.5; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-md-code-block code { + background: none; + padding: 0; + border-radius: 0; + font-size: inherit; + color: inherit; +} +.csk-md-inline-code { + background: #E5E7EB; + color: #DC2626; + padding: 1px 6px; + border-radius: 4px; + font-size: 13px; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul, +.csk-msg--ai .csk-msg__bubble .csk-md-ol { + padding-left: 20px; + margin: 6px 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul li, +.csk-msg--ai .csk-msg__bubble .csk-md-ol li { + margin-bottom: 4px; +} +.csk-md-blockquote { + border-left: 3px solid var(--csk-primary); + padding-left: 12px; + margin: 8px 0; + color: #6B7280; +} +.csk-md-link { + color: var(--csk-primary); + text-decoration: none; +} +.csk-md-link:hover { + text-decoration: underline; +} +.csk-md-hr { + border: none; + border-top: 1px solid #E5E7EB; + margin: 12px 0; +} + +/* ========== P2: 会话管理面板 ========== */ +.csk-history-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + border-radius: 6px; + transition: background 0.15s; +} +.csk-history-btn:hover { + background: rgba(255, 255, 255, 0.2); +} +.csk-history-panel { + position: absolute; + top: 48px; + left: 0; + right: 0; + bottom: 0; + background: #fff; + z-index: 10; + display: flex; + flex-direction: column; + overflow: hidden; +} +.csk-history-panel--hidden { + display: none; +} +.csk-history-panel__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + border-bottom: 1px solid #E5E7EB; + background: #F9FAFB; +} +.csk-history-panel__title { + font-size: 14px; + font-weight: 600; + color: #1F2937; +} +.csk-history-panel__back { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + border: 1px solid #E5E7EB; + border-radius: 6px; + background: #fff; + color: #374151; + font-size: 12px; + cursor: pointer; + transition: all 0.15s; +} +.csk-history-panel__back:hover { + background: #F3F4F6; +} +.csk-history-panel__list { + flex: 1; + overflow-y: auto; + padding: 8px; +} +.csk-history-panel__list::-webkit-scrollbar { + width: 4px; +} +.csk-history-panel__list::-webkit-scrollbar-thumb { + background: #E5E7EB; + border-radius: 2px; +} +.csk-history-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + border-radius: 8px; + cursor: pointer; + transition: background 0.15s; + margin-bottom: 4px; +} +.csk-history-item:hover { + background: #F3F4F6; +} +.csk-history-item__info { + flex: 1; + min-width: 0; +} +.csk-history-item__id { + font-size: 13px; + font-weight: 500; + color: #1F2937; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-history-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} +.csk-history-item__actions { + display: flex; + gap: 4px; + margin-left: 8px; + opacity: 0; + transition: opacity 0.15s; +} +.csk-history-item:hover .csk-history-item__actions { + opacity: 1; +} +.csk-history-action { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 12px; + transition: all 0.15s; +} +.csk-history-action--export { + background: #EFF6FF; + color: #2563EB; +} +.csk-history-action--export:hover { + background: #DBEAFE; +} +.csk-history-action--delete { + background: #FEF2F2; + color: #DC2626; +} +.csk-history-action--delete:hover { + background: #FEE2E2; +} +.csk-history-panel__empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + color: #9CA3AF; + font-size: 13px; + text-align: center; +} +.csk-history-panel__empty-icon { + font-size: 32px; + margin-bottom: 8px; + opacity: 0.5; +} +.csk-history-panel__loading { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + color: #9CA3AF; + font-size: 13px; +} +.csk-history-panel__loadmore { + display: block; + width: 100%; + padding: 10px; + border: none; + background: #F9FAFB; + color: #6B7280; + font-size: 12px; + cursor: pointer; + text-align: center; + transition: background 0.15s; +} +.csk-history-panel__loadmore:hover { + background: #F3F4F6; +} + /* ========== 移动端适配 ========== */ @media (max-width: 480px) { .csk-window { diff --git a/client/src/types.ts b/client/src/types.ts index ab5bda6..27cf73b 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -1,20 +1,23 @@ /** * ChatbotSDK 核心类型定义 + * + * 关键参数映射(SDK → 后端): + * integrateId → roleId(客服角色 ID,决定 AI 人设和知识库范围) + * userId → accountId(客户账号 ID,账号可绑定角色) + * chatId → 自动管理(从 /conversation/list 获取或自动生成,是对话唯一标识) */ /** SDK 初始化配置 */ export interface SDKConfig { // === 必传参数 === - /** 集成标识 → 后端 chatId 参数 + 数据隔离 key */ - integrateId: string; + /** 集成标识 → 后端 roleId 参数(客服角色 ID),决定 AI 人设和知识库检索范围 */ + integrateId: string | number; /** 后端 API 域名 */ requestDomain: string; // === 用户标识 === - /** 宿主用户标识 → 后端 accountId 参数 */ + /** 宿主用户标识 → 后端 accountId 参数(客户账号 ID),账号可绑定角色 */ userId?: string; - /** 客服角色 ID */ - roleId?: number; // === 知识库 === /** 默认知识库分类 ID */ @@ -49,22 +52,38 @@ export interface SDKConfig { /** 解析后的完整配置(所有可选字段已填充默认值) */ export interface ResolvedConfig { + /** 集成标识(同时也是 roleId,客服角色 ID) */ integrateId: string; + /** 后端 API 域名 */ requestDomain: string; + /** 客户账号 ID → 后端 accountId */ userId?: string; - roleId?: number; + /** 知识库分类 ID */ categoryId?: number; + /** 是否显示知识库切换 */ showCategorySwitch: boolean; + /** 弹窗标题 */ title: string; + /** 弹窗宽度 */ width: number; + /** 位置 */ position: 'left-bottom' | 'right-bottom'; + /** 主色调 */ primaryColor: string; + /** 悬浮按钮图标 */ launcherIcon: string; + /** 显示清空按钮 */ showClear: boolean; + /** 显示管理面板 */ showAdminPanel: boolean; + /** 流式输出 */ streaming: boolean; + /** 界面语言 */ locale: string; + /** 调试日志 */ debug: boolean; + /** 当前对话 ID(自动管理,从 /conversation/list 获取或自动生成) */ + chatId: string; } /** 聊天消息 */ @@ -91,10 +110,45 @@ export interface RagSource { snippet: string; } +/** 知识库分类节点(树形结构) */ +export interface CategoryNode { + id: string; + name: string; + parentId?: string; + children?: CategoryNode[]; +} + +/** 知识库分类平铺项 */ +export interface CategoryItem { + id: string; + name: string; + parentId?: string; +} + +/** 会话摘要 */ +export interface ConversationSummary { + id: string; + chatId: string; + accountId?: string; + roleId?: number; + messageCount?: number; + lastMessageTime?: number; + createdAt?: number; +} + +/** 会话详情 */ +export interface ConversationDetail { + id: string; + chatId: string; + accountId?: string; + messages: ChatMessage[]; +} + /** 本地缓存数据结构 */ export interface CacheData { messages: ChatMessage[]; updatedAt: number; + chatId?: string; } /** SDK 公开 API 接口 */ @@ -109,7 +163,7 @@ export interface ChatbotSDKInstance { close(): void; /** 切换窗口显示/隐藏 */ toggle(): void; - /** 清空当前会话历史 */ + /** 清空当前会话历史(生成新的 chatId) */ clearHistory(): void; } diff --git a/src/main/resources/static/sdk/chatbot-sdk.js b/src/main/resources/static/sdk/chatbot-sdk.js index 23eb255..8273324 100644 --- a/src/main/resources/static/sdk/chatbot-sdk.js +++ b/src/main/resources/static/sdk/chatbot-sdk.js @@ -7,14 +7,16 @@ var ChatbotSDK = (function () { function setDebug(enabled) { debugEnabled = enabled; } + /** 性能计时器 */ + const timers = {}; const logger = { - /** 普通信息日志 */ + /** 普通信息日志(受 debug 开关控制) */ info(msg, data) { if (debugEnabled) { console.log(PREFIX, msg, data !== undefined ? data : ''); } }, - /** 警告日志 */ + /** 警告日志(受 debug 开关控制) */ warn(msg, data) { if (debugEnabled) { console.warn(PREFIX, msg, data !== undefined ? data : ''); @@ -24,6 +26,60 @@ var ChatbotSDK = (function () { error(msg, data) { console.error(PREFIX, msg, data !== undefined ? data : ''); }, + /** 开始计时 */ + time(label) { + timers[label] = Date.now(); + }, + /** 结束计时并输出日志 */ + timeEnd(label, prefix) { + const start = timers[label]; + if (start !== undefined) { + const duration = Date.now() - start; + delete timers[label]; + if (debugEnabled) { + const msg = prefix ? `${prefix} ${duration}ms` : `${label} ${duration}ms`; + console.log(PREFIX, msg); + } + return duration; + } + return 0; + }, + /** 生命周期日志:init */ + lifecycleInit(integrateId, requestDomain) { + this.info(`初始化完成 integrateId=${integrateId} requestDomain=${requestDomain}`); + }, + /** 生命周期日志:destroy */ + lifecycleDestroy(integrateId) { + this.info(`销毁实例 integrateId=${integrateId}`); + }, + /** 生命周期日志:sendMessage */ + lifecycleSend(integrateId, length) { + this.info(`发送消息 integrateId=${integrateId} length=${length}`); + this.time(`send_${integrateId}`); + }, + /** 生命周期日志:收到回复 */ + lifecycleReply(integrateId, length) { + const duration = this.timeEnd(`send_${integrateId}`, 'AI 回复'); + this.info(`AI 回复 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + /** 生命周期日志:请求失败 */ + lifecycleError(integrateId, status, message) { + this.timeEnd(`send_${integrateId}`); + this.error(`请求失败 integrateId=${integrateId} status=${status} message=${message}`); + }, + /** 生命周期日志:清空会话 */ + lifecycleClear(integrateId) { + this.info(`清空会话 integrateId=${integrateId}`); + }, + /** 生命周期日志:流式回复完成 */ + lifecycleStreamDone(integrateId, length) { + const duration = this.timeEnd(`send_${integrateId}`, '流式回复'); + this.info(`流式回复完成 integrateId=${integrateId} length=${length} duration=${duration}ms`); + }, + /** 生命周期日志:知识库切换 */ + lifecycleCategoryChange(categoryId) { + this.info(`切换知识库分类 categoryId=${categoryId}`); + }, }; /** 默认悬浮按钮 SVG 图标(客服对话气泡) */ @@ -36,14 +92,15 @@ var ChatbotSDK = (function () { */ function parseConfig(raw) { var _a, _b, _c, _d, _e, _f; - // 校验必传参数:integrateId - if (!raw.integrateId || typeof raw.integrateId !== 'string' || raw.integrateId.trim() === '') { - logger.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + // 校验必传参数:integrateId(对应后端 roleId) + if (!raw.integrateId || (typeof raw.integrateId !== 'string' && typeof raw.integrateId !== 'number') + || (typeof raw.integrateId === 'string' && raw.integrateId.trim() === '')) { + logger.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'); return null; } // 校验必传参数:requestDomain if (!raw.requestDomain || typeof raw.requestDomain !== 'string' || raw.requestDomain.trim() === '') { - logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'); return null; } // 校验 requestDomain 是否为合法 URL 格式 @@ -54,12 +111,13 @@ var ChatbotSDK = (function () { logger.error(`requestDomain 不是合法的 URL 格式:${raw.requestDomain}。请提供完整的域名,如 https://api.example.com`); return null; } + // integrateId 统一转为字符串(后端 roleId 为 Long,但 query param 传字符串也可接收) + const integrateIdStr = String(raw.integrateId).trim(); // 填充默认值 const config = { - integrateId: raw.integrateId.trim(), + integrateId: integrateIdStr, requestDomain: raw.requestDomain.replace(/\/+$/, ''), // 去掉末尾斜杠 userId: raw.userId, - roleId: raw.roleId, categoryId: raw.categoryId, showCategorySwitch: (_a = raw.showCategorySwitch) !== null && _a !== void 0 ? _a : false, title: raw.title || 'AI 智能助手', @@ -72,11 +130,140 @@ var ChatbotSDK = (function () { streaming: (_e = raw.streaming) !== null && _e !== void 0 ? _e : true, locale: raw.locale || 'zh-CN', debug: (_f = raw.debug) !== null && _f !== void 0 ? _f : true, + chatId: '', // 初始为空,由 chatId 初始化流程填充 }; - logger.info(`配置解析完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + logger.info(`配置解析完成 integrateId(=roleId)=${config.integrateId} userId(=accountId)=${config.userId || '(未设置)'} requestDomain=${config.requestDomain}`); return config; } + /** + * 多语言国际化模块 - i18n 字典 + 翻译函数 + */ + /** 语言包字典 */ + const dictionaries = { + 'zh-CN': { + // 头部 + title: 'AI 智能助手', + minimize: '最小化', + close: '关闭', + // 输入区 + placeholder: '输入您的问题...', + send: '发送', + // 消息 + loading: '正在思考...', + stream_interrupted: '回复被中断', + stream_unstable: '网络不稳定,内容可能不完整', + // 知识库 + category_placeholder: '选择知识库分类', + category_all: '全部分类', + category_load_error: '加载分类失败', + source_title: '参考来源', + source_count: '{n} 条参考来源', + source_loading: '加载来源中...', + // 清空/管理 + clear: '清空对话', + clear_confirm: '确定清空所有对话记录?', + // 历史会话 + history_title: '历史会话', + history_empty: '暂无历史会话', + history_load_error: '加载会话列表失败', + history_delete_confirm: '确定删除该会话?', + history_export: '导出', + history_delete: '删除', + // 错误提示 + error_network: '网络连接失败,请检查网络', + error_timeout: '请求超时,请稍后重试', + error_server: '服务器异常,请稍后重试', + error_cors: '跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', + error_auth: '鉴权失败,请联系管理员', + error_forbidden: '无访问权限,请联系管理员配置', + error_not_found: '请求的资源不存在', + error_rate_limit: '请求过于频繁,请稍后重试', + error_unavailable: '服务暂不可用,请稍后重试', + error_unknown: '请求发生未知错误', + error_send: '发送失败,请稍后重试', + error_stream_unsupported: '浏览器不支持流式读取', + }, + 'en': { + // Header + title: 'AI Assistant', + minimize: 'Minimize', + close: 'Close', + // Input + placeholder: 'Type your question...', + send: 'Send', + // Messages + loading: 'Thinking...', + stream_interrupted: 'Response interrupted', + stream_unstable: 'Network unstable, content may be incomplete', + // Knowledge base + 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/Management + clear: 'Clear chat', + clear_confirm: 'Clear all conversation history?', + // 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', + // Errors + 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 currentLocale = 'zh-CN'; + /** + * 设置当前语言 + */ + function setLocale(locale) { + if (dictionaries[locale]) { + currentLocale = locale; + } + else { + // 尝试匹配语言前缀(如 zh -> zh-CN) + const prefix = locale.split('-')[0]; + const matched = Object.keys(dictionaries).find(k => k.startsWith(prefix)); + if (matched) { + currentLocale = matched; + } + // 未匹配则保持默认 zh-CN + } + } + /** + * 获取翻译文本 + * @param key 翻译 key + * @param params 插值参数,如 { n: 3 } 替换 {n} + */ + function t(key, params) { + const dict = dictionaries[currentLocale] || dictionaries['zh-CN']; + let text = dict[key] || dictionaries['zh-CN'][key] || key; + // 简单插值替换:{n} → 实际值 + if (params) { + for (const [k, v] of Object.entries(params)) { + text = text.replace(`{${k}}`, String(v)); + } + } + return text; + } + /** 请求超时时间(毫秒) */ const REQUEST_TIMEOUT = 30000; let currentConfig = null; @@ -84,6 +271,16 @@ var ChatbotSDK = (function () { function setApiConfig(config) { currentConfig = config; } + /** 更新当前 chatId(对话 ID) */ + function updateChatId(chatId) { + if (currentConfig) { + currentConfig.chatId = chatId; + } + } + /** 获取当前 chatId */ + function getChatId() { + return (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.chatId) || ''; + } /** 构建完整请求 URL,自动防御双斜杠 */ function buildUrl(path) { if (!currentConfig) { @@ -93,36 +290,72 @@ var ChatbotSDK = (function () { const cleanPath = path.startsWith('/') ? path : `/${path}`; return `${domain}${cleanPath}`; } - /** 构建同步对话请求 URL */ + /** + * 安全设置可选参数:仅当 value 非空时追加 + */ + function setIfPresent(params, key, value) { + if (value === undefined || value === null) + return; + if (typeof value === 'string' && value.trim() === '') + return; + params.set(key, String(value)); + } + // ==================== 对话接口 URL 构建 ==================== + /** + * 构建同步对话请求 URL + * - integrateId → roleId + * - userId → accountId + * - chatId → 自动管理的对话 ID + */ function buildChatUrl(message) { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig.integrateId); + params.set('chatId', currentConfig.chatId); + // integrateId 映射为 roleId + setIfPresent(params, 'roleId', currentConfig.integrateId); + // userId 映射为 accountId setIfPresent(params, 'accountId', currentConfig.userId); - setIfPresent(params, 'roleId', currentConfig.roleId); - setIfPresent(params, 'categoryId', currentConfig.categoryId); return buildUrl(`/ai/assistant_app/chat/sync?${params.toString()}`); } - /** 构建 SSE 流式请求 URL */ - function buildChatSSEUrl(message) { + /** + * 构建 SSE 流式请求 URL + */ + function buildChatSSEUrl(message, categoryId) { const params = new URLSearchParams(); params.set('message', message); - params.set('chatId', currentConfig.integrateId); + params.set('chatId', currentConfig.chatId); + setIfPresent(params, 'roleId', currentConfig.integrateId); setIfPresent(params, 'accountId', currentConfig.userId); - setIfPresent(params, 'roleId', currentConfig.roleId); - setIfPresent(params, 'categoryId', currentConfig.categoryId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); return buildUrl(`/ai/assistant_app/chat/sse?${params.toString()}`); } /** - * 安全设置可选参数:仅当 value 非空时追加,数字类型直接转字符串 + * 构建 RAG 增强流式请求 URL */ - function setIfPresent(params, key, value) { - if (value === undefined || value === null) - return; - if (typeof value === 'string' && value.trim() === '') - return; - params.set(key, String(value)); + function buildChatRAGSSEUrl(message, categoryId) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.chatId); + params.set('rewriteStrategy', 'REWRITE'); + setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'accountId', currentConfig.userId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); + return buildUrl(`/ai/assistant_app/chat/rag/sse?${params.toString()}`); + } + /** + * 构建 RAG 引用来源请求 URL + */ + function buildRagSourcesUrl(message, categoryId) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.chatId); + params.set('rewriteStrategy', 'REWRITE'); + setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'accountId', currentConfig.userId); + setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); + return buildUrl(`/ai/assistant_app/rag/sources?${params.toString()}`); } + // ==================== HTTP 基础封装 ==================== /** 带超时的 fetch 封装 */ async function safeFetch(url, options = {}, timeout = REQUEST_TIMEOUT) { const controller = new AbortController(); @@ -133,12 +366,12 @@ var ChatbotSDK = (function () { } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') { - throw new CskError('请求超时,请稍后重试', 'timeout'); + throw new CskError(t('error_timeout'), 'timeout'); } if (err instanceof TypeError && err.message.includes('Failed to fetch')) { - throw new CskError('跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', 'cors'); + throw new CskError(t('error_cors'), 'cors'); } - throw new CskError('网络连接失败,请检查网络', 'network'); + throw new CskError(t('error_network'), 'network'); } finally { clearTimeout(timer); @@ -152,77 +385,67 @@ var ChatbotSDK = (function () { this.type = type; } } - /** 根据 HTTP 状态码返回对应的中文错误消息 */ + /** 根据 HTTP 状态码返回对应的国际化错误消息 */ function getHttpErrorMessage(status) { switch (status) { - case 401: - return '鉴权失败,请联系管理员'; - case 403: - return '无访问权限,请联系管理员配置'; - case 404: - return '请求的资源不存在'; - case 429: - return '请求过于频繁,请稍后重试'; - case 500: - return '服务器异常,请稍后重试'; + case 401: return t('error_auth'); + case 403: return t('error_forbidden'); + case 404: return t('error_not_found'); + case 429: return t('error_rate_limit'); + case 500: return t('error_server'); case 502: - case 503: - return '服务暂不可用,请稍后重试'; - default: - return `请求失败(状态码 ${status})`; + case 503: return t('error_unavailable'); + default: return `${t('error_unknown')}(${status})`; } } + // ==================== 对话请求 ==================== /** * 同步对话请求 */ async function chatRequest(message) { const url = buildChatUrl(message); - const startTime = Date.now(); - logger.info(`发送消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig.integrateId, message.length); try { const response = await safeFetch(url); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); throw new CskError(errorMsg, `http_${response.status}`); } const text = await response.text(); - const duration = Date.now() - startTime; - logger.info(`AI 回复 integrateId=${currentConfig.integrateId} length=${text.length} duration=${duration}ms`); + logger.lifecycleReply(currentConfig.integrateId, text.length); return text; } catch (err) { - if (err instanceof CskError) { + if (err instanceof CskError) throw err; - } - logger.error(`请求异常 integrateId=${currentConfig.integrateId}`, err); - throw new CskError('请求发生未知错误', 'unknown'); + logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + throw new CskError(t('error_unknown'), 'unknown'); } } /** * SSE 流式对话请求 - * @param message 用户消息 - * @param onChunk 每次收到文本片段的回调 - * @param onDone 流结束时的回调 - * @param onError 发生错误时的回调 + * @param useRag 是否使用 RAG 增强对话 + * @param categoryId 知识库分类 ID */ - async function chatSSERequest(message, onChunk, onDone, onError) { + async function chatSSERequest(message, onChunk, onDone, onError, categoryId, useRag) { var _a; - const url = buildChatSSEUrl(message); - const startTime = Date.now(); + const url = useRag + ? buildChatRAGSSEUrl(message, categoryId) + : buildChatSSEUrl(message, categoryId); let totalText = ''; - logger.info(`发送流式消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + logger.lifecycleSend(currentConfig.integrateId, message.length); try { - const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); // SSE 超时更长 + const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.error(`流式请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); onError(new CskError(errorMsg, `http_${response.status}`)); return; } const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader(); if (!reader) { - onError(new CskError('浏览器不支持流式读取', 'stream_unsupported')); + onError(new CskError(t('error_stream_unsupported'), 'stream_unsupported')); return; } const decoder = new TextDecoder('utf-8', { stream: true }); @@ -230,22 +453,15 @@ var ChatbotSDK = (function () { try { while (true) { const { done, value } = await reader.read(); - if (done) { + if (done) break; - } - // 解码并追加到 buffer buffer += decoder.decode(value, { stream: true }); - // 按行解析 SSE 数据 const lines = buffer.split('\n'); - // 最后一行可能不完整,保留到下次 buffer = lines.pop() || ''; for (const line of lines) { const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith(':')) { - // 跳过空行和 SSE 注释 + if (!trimmed || trimmed.startsWith(':')) continue; - } - // 解析 "data: xxx" 格式 if (trimmed.startsWith('data:')) { const data = trimmed.substring(5).trim(); if (data) { @@ -254,17 +470,14 @@ var ChatbotSDK = (function () { } } else if (trimmed === '[DONE]') { - // 流结束标记(OpenAI 风格,此处做兼容) break; } else if (!trimmed.startsWith('event:') && !trimmed.startsWith('id:') && !trimmed.startsWith('retry:')) { - // 可能是 Flux 裸文本格式(无 data: 前缀) totalText += trimmed; onChunk(trimmed); } } } - // 处理 buffer 中剩余的数据 if (buffer.trim()) { const trimmed = buffer.trim(); if (trimmed.startsWith('data:')) { @@ -281,9 +494,8 @@ var ChatbotSDK = (function () { } } catch (readErr) { - // 流中断不丢已接收的文本 if (totalText.length > 0) { - onChunk('\n\n[网络不稳定,内容可能不完整]'); + onChunk('\n\n' + t('stream_unstable')); } else { throw readErr; @@ -292,8 +504,7 @@ var ChatbotSDK = (function () { finally { reader.releaseLock(); } - const duration = Date.now() - startTime; - logger.info(`流式回复完成 integrateId=${currentConfig.integrateId} length=${totalText.length} duration=${duration}ms`); + logger.lifecycleStreamDone(currentConfig.integrateId, totalText.length); onDone(); } catch (err) { @@ -301,11 +512,206 @@ var ChatbotSDK = (function () { onError(err); } else { - logger.error(`流式请求异常 integrateId=${currentConfig.integrateId}`, err); - onError(new CskError('网络连接失败,请检查网络', 'network')); + logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + onError(new CskError(t('error_network'), 'network')); } } } + // ==================== P1: 知识库分类 ==================== + /** + * 获取知识库分类树 + */ + async function fetchCategoryTree() { + const url = buildUrl('/category/tree'); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`加载分类树成功 count=${json.data.length}`); + return json.data; + } + return []; + } + catch (err) { + if (err instanceof CskError) + logger.error(`加载分类树失败: ${err.message}`); + else + logger.error('加载分类树失败', err); + return []; + } + } + /** + * 获取 RAG 引用来源 + */ + async function fetchRagSources(message, categoryId) { + const url = buildRagSourcesUrl(message, categoryId); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + if (json.success && Array.isArray(json.data)) { + logger.info(`获取引用来源 count=${json.data.length}`); + return json.data; + } + return []; + } + catch (err) { + logger.error('获取引用来源失败', err); + return []; + } + } + /** + * 获取会话列表 + */ + async function fetchConversationList(page = 1, size = 20, accountId, roleId) { + let path = `/conversation/list?page=${page}&size=${size}`; + if (accountId) + path += `&accountId=${encodeURIComponent(accountId)}`; + if (roleId) + path += `&roleId=${encodeURIComponent(roleId)}`; + const url = buildUrl(path); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + return { + list: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + pages: json.pages || 0, + }; + } + catch (err) { + logger.error('加载会话列表失败', err); + return { list: [], total: 0, pages: 0 }; + } + } + /** + * 获取会话消息 + */ + async function fetchConversationMessages(conversationId) { + const url = buildUrl(`/conversation/${conversationId}/messages`); + try { + const response = await safeFetch(url); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + return { + messages: json.success && Array.isArray(json.data) ? json.data : [], + total: json.total || 0, + }; + } + catch (err) { + logger.error('加载会话消息失败', err); + return { messages: [], total: 0 }; + } + } + /** + * 删除会话 + */ + async function deleteConversation(conversationId) { + const url = buildUrl(`/conversation/${conversationId}`); + try { + const response = await safeFetch(url, { method: 'DELETE' }); + if (!response.ok) + throw new CskError(getHttpErrorMessage(response.status), `http_${response.status}`); + const json = await response.json(); + logger.info(`删除会话 id=${conversationId} success=${json.success}`); + return json.success || false; + } + catch (err) { + logger.error('删除会话失败', err); + return false; + } + } + /** + * 导出会话 URL + */ + function getConversationExportUrl(conversationId) { + return buildUrl(`/conversation/${conversationId}/export`); + } + // ==================== chatId 自动初始化 ==================== + /** + * 初始化 chatId:查询后端已有会话,找到则复用,否则生成新的 + * + * 逻辑: + * 1. 先查 localStorage 缓存的 chatId(同一 integrateId + userId 可能复用) + * 2. 查 /conversation/list?accountId=X&roleId=Y 看是否有匹配的会话 + * 3. 有会话 → 使用最新会话的 conversationId 作为 chatId + * 4. 无会话 → 自动生成 chatId(格式:sdk_timestamp_random) + */ + async function initChatId() { + if (!currentConfig) + return ''; + // 1. 先尝试从 localStorage 恢复 + const cachedChatId = loadCachedChatId(currentConfig.integrateId, currentConfig.userId); + if (cachedChatId) { + currentConfig.chatId = cachedChatId; + logger.info(`从缓存恢复 chatId=${cachedChatId}`); + return cachedChatId; + } + // 2. 查询后端会话列表 + try { + const result = await fetchConversationList(1, 5, currentConfig.userId, currentConfig.integrateId); + if (result.list.length > 0) { + // 使用最新会话的 conversationId 作为 chatId + const latestConv = result.list[0]; + const chatId = latestConv.conversationId || latestConv.chatId || ''; + if (chatId) { + currentConfig.chatId = chatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, chatId); + logger.info(`从后端恢复会话 chatId=${chatId} messageCount=${latestConv.messageCount}`); + return chatId; + } + } + } + catch (err) { + logger.warn('查询后端会话列表失败,将生成新 chatId', err); + } + // 3. 生成新的 chatId + const newChatId = generateChatId(); + currentConfig.chatId = newChatId; + saveCachedChatId(currentConfig.integrateId, currentConfig.userId, newChatId); + logger.info(`生成新 chatId=${newChatId}`); + return newChatId; + } + /** 生成 chatId(格式:sdk_timestamp_random) */ + function generateChatId() { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; + } + /** localStorage key 格式 */ + function chatIdStorageKey(integrateId, userId) { + return `csk_chatId_${integrateId}${userId ? '_' + userId : ''}`; + } + /** 从 localStorage 加载 chatId */ + function loadCachedChatId(integrateId, userId) { + try { + return localStorage.getItem(chatIdStorageKey(integrateId, userId)) || ''; + } + catch (_a) { + return ''; + } + } + /** 保存 chatId 到 localStorage */ + function saveCachedChatId(integrateId, userId, chatId) { + try { + if (chatId) { + localStorage.setItem(chatIdStorageKey(integrateId, userId), chatId); + } + else { + localStorage.removeItem(chatIdStorageKey(integrateId, userId)); + } + } + catch (_a) { + // localStorage 不可用则忽略 + } + } let styleElement = null; /** CSS 变量:将配置中的主题色转换为 CSS 自定义属性 */ @@ -601,6 +1007,366 @@ var ChatbotSDK = (function () { color: #DC2626; } +/* ========== P1: 知识库分类下拉 ========== */ +.csk-category-bar { + display: flex; + align-items: center; + padding: 6px 12px; + border-top: 1px solid #E5E7EB; + background: #F9FAFB; + gap: 8px; +} +.csk-category-bar__label { + font-size: 12px; + color: #6B7280; + white-space: nowrap; +} +.csk-category-select { + flex: 1; + padding: 5px 8px; + border: 1px solid #E5E7EB; + border-radius: 6px; + font-size: 12px; + color: #374151; + background: #fff; + outline: none; + cursor: pointer; + font-family: inherit; + transition: border-color 0.2s; + max-width: 200px; +} +.csk-category-select:focus { + border-color: var(--csk-primary); +} + +/* ========== P1: RAG 引用来源卡片 ========== */ +.csk-sources { + margin-top: 8px; + border: 1px solid #E5E7EB; + border-radius: 8px; + overflow: hidden; + font-size: 12px; + max-width: 100%; +} +.csk-sources__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + background: #F9FAFB; + cursor: pointer; + user-select: none; + transition: background 0.15s; +} +.csk-sources__header:hover { + background: #F3F4F6; +} +.csk-sources__title { + display: flex; + align-items: center; + gap: 4px; + font-weight: 500; + color: #374151; +} +.csk-sources__arrow { + transition: transform 0.2s; + color: #9CA3AF; +} +.csk-sources--collapsed .csk-sources__arrow { + transform: rotate(-90deg); +} +.csk-sources__body { + border-top: 1px solid #E5E7EB; + padding: 0; +} +.csk-sources--collapsed .csk-sources__body { + display: none; +} +.csk-source-item { + padding: 8px 12px; + border-bottom: 1px solid #F3F4F6; + transition: background 0.15s; +} +.csk-source-item:last-child { + border-bottom: none; +} +.csk-source-item:hover { + background: #F9FAFB; +} +.csk-source-item__name { + font-weight: 500; + color: #1F2937; + margin-bottom: 2px; +} +.csk-source-item__snippet { + color: #6B7280; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.csk-source-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} + +/* ========== P1: Markdown 渲染样式 ========== */ +.csk-msg--ai .csk-msg__bubble .csk-md-p { + margin: 0 0 8px; +} +.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { + margin-bottom: 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1, +.csk-msg--ai .csk-msg__bubble .csk-md-h2, +.csk-msg--ai .csk-msg__bubble .csk-md-h3, +.csk-msg--ai .csk-msg__bubble .csk-md-h4, +.csk-msg--ai .csk-msg__bubble .csk-md-h5, +.csk-msg--ai .csk-msg__bubble .csk-md-h6 { + margin: 12px 0 6px; + font-weight: 600; + line-height: 1.3; +} +.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; } +.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; } + +.csk-md-code-block { + background: #1E293B; + color: #E2E8F0; + padding: 12px 14px; + border-radius: 8px; + overflow-x: auto; + margin: 8px 0; + font-size: 13px; + line-height: 1.5; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-md-code-block code { + background: none; + padding: 0; + border-radius: 0; + font-size: inherit; + color: inherit; +} +.csk-md-inline-code { + background: #E5E7EB; + color: #DC2626; + padding: 1px 6px; + border-radius: 4px; + font-size: 13px; + font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul, +.csk-msg--ai .csk-msg__bubble .csk-md-ol { + padding-left: 20px; + margin: 6px 0; +} +.csk-msg--ai .csk-msg__bubble .csk-md-ul li, +.csk-msg--ai .csk-msg__bubble .csk-md-ol li { + margin-bottom: 4px; +} +.csk-md-blockquote { + border-left: 3px solid var(--csk-primary); + padding-left: 12px; + margin: 8px 0; + color: #6B7280; +} +.csk-md-link { + color: var(--csk-primary); + text-decoration: none; +} +.csk-md-link:hover { + text-decoration: underline; +} +.csk-md-hr { + border: none; + border-top: 1px solid #E5E7EB; + margin: 12px 0; +} + +/* ========== P2: 会话管理面板 ========== */ +.csk-history-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + border-radius: 6px; + transition: background 0.15s; +} +.csk-history-btn:hover { + background: rgba(255, 255, 255, 0.2); +} +.csk-history-panel { + position: absolute; + top: 48px; + left: 0; + right: 0; + bottom: 0; + background: #fff; + z-index: 10; + display: flex; + flex-direction: column; + overflow: hidden; +} +.csk-history-panel--hidden { + display: none; +} +.csk-history-panel__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + border-bottom: 1px solid #E5E7EB; + background: #F9FAFB; +} +.csk-history-panel__title { + font-size: 14px; + font-weight: 600; + color: #1F2937; +} +.csk-history-panel__back { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 10px; + border: 1px solid #E5E7EB; + border-radius: 6px; + background: #fff; + color: #374151; + font-size: 12px; + cursor: pointer; + transition: all 0.15s; +} +.csk-history-panel__back:hover { + background: #F3F4F6; +} +.csk-history-panel__list { + flex: 1; + overflow-y: auto; + padding: 8px; +} +.csk-history-panel__list::-webkit-scrollbar { + width: 4px; +} +.csk-history-panel__list::-webkit-scrollbar-thumb { + background: #E5E7EB; + border-radius: 2px; +} +.csk-history-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + border-radius: 8px; + cursor: pointer; + transition: background 0.15s; + margin-bottom: 4px; +} +.csk-history-item:hover { + background: #F3F4F6; +} +.csk-history-item__info { + flex: 1; + min-width: 0; +} +.csk-history-item__id { + font-size: 13px; + font-weight: 500; + color: #1F2937; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-history-item__meta { + font-size: 11px; + color: #9CA3AF; + margin-top: 2px; +} +.csk-history-item__actions { + display: flex; + gap: 4px; + margin-left: 8px; + opacity: 0; + transition: opacity 0.15s; +} +.csk-history-item:hover .csk-history-item__actions { + opacity: 1; +} +.csk-history-action { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 12px; + transition: all 0.15s; +} +.csk-history-action--export { + background: #EFF6FF; + color: #2563EB; +} +.csk-history-action--export:hover { + background: #DBEAFE; +} +.csk-history-action--delete { + background: #FEF2F2; + color: #DC2626; +} +.csk-history-action--delete:hover { + background: #FEE2E2; +} +.csk-history-panel__empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + color: #9CA3AF; + font-size: 13px; + text-align: center; +} +.csk-history-panel__empty-icon { + font-size: 32px; + margin-bottom: 8px; + opacity: 0.5; +} +.csk-history-panel__loading { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + color: #9CA3AF; + font-size: 13px; +} +.csk-history-panel__loadmore { + display: block; + width: 100%; + padding: 10px; + border: none; + background: #F9FAFB; + color: #6B7280; + font-size: 12px; + cursor: pointer; + text-align: center; + transition: background 0.15s; +} +.csk-history-panel__loadmore:hover { + background: #F3F4F6; +} + /* ========== 移动端适配 ========== */ @media (max-width: 480px) { .csk-window { @@ -658,6 +1424,17 @@ var ChatbotSDK = (function () { return v.toString(16); }); } + /** XSS 转义 - 防止用户输入中的 HTML 注入 */ + function escapeHtml(text) { + const map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + }; + return text.replace(/[&<>"']/g, (ch) => map[ch] || ch); + } /** 防抖函数 */ function debounce(fn, delay) { let timer = null; @@ -715,10 +1492,15 @@ var ChatbotSDK = (function () { titleEl.textContent = config.title; const actions = document.createElement('div'); actions.className = 'csk-header__actions'; + // 历史会话按钮(P2) + const historyBtn = document.createElement('button'); + historyBtn.className = 'csk-history-btn'; + historyBtn.setAttribute('title', t('history_title')); + historyBtn.innerHTML = ``; // 最小化按钮 const minimizeBtn = document.createElement('button'); minimizeBtn.className = 'csk-header__btn csk-header__btn--minimize'; - minimizeBtn.setAttribute('title', '最小化'); + minimizeBtn.setAttribute('title', t('minimize')); minimizeBtn.innerHTML = ``; minimizeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); @@ -726,11 +1508,12 @@ var ChatbotSDK = (function () { // 关闭按钮 const closeBtn = document.createElement('button'); closeBtn.className = 'csk-header__btn csk-header__btn--close'; - closeBtn.setAttribute('title', '关闭'); + closeBtn.setAttribute('title', t('close')); closeBtn.innerHTML = ``; closeBtn.addEventListener('click', () => { windowEl.classList.add('csk-window--hidden'); }); + actions.appendChild(historyBtn); actions.appendChild(minimizeBtn); actions.appendChild(closeBtn); header.appendChild(titleEl); @@ -739,35 +1522,93 @@ var ChatbotSDK = (function () { const messagesContainer = document.createElement('div'); messagesContainer.id = 'csk-messages'; messagesContainer.className = 'csk-messages'; + // === 会话管理面板(P2,默认隐藏) === + const historyPanel = document.createElement('div'); + historyPanel.className = 'csk-history-panel csk-history-panel--hidden'; + historyPanel.innerHTML = ` +
+ ${t('history_title')} + +
+
+ `; + messagesContainer.appendChild(historyPanel); + // 历史面板返回按钮 + const backBtn = historyPanel.querySelector('#csk-history-back'); + if (backBtn) { + backBtn.addEventListener('click', () => { + historyPanel.classList.add('csk-history-panel--hidden'); + }); + } + // 历史按钮点击 + historyBtn.addEventListener('click', (e) => { + e.stopPropagation(); + const isHidden = historyPanel.classList.contains('csk-history-panel--hidden'); + historyPanel.classList.toggle('csk-history-panel--hidden'); + if (isHidden) { + // 触发自定义事件,通知加载会话列表 + windowEl.dispatchEvent(new CustomEvent('csk:loadHistory')); + } + }); + // === 知识库分类下拉框(P1) === + let categorySelect = null; + if (config.showCategorySwitch) { + const categoryBar = document.createElement('div'); + categoryBar.className = 'csk-category-bar'; + const categoryLabel = document.createElement('span'); + categoryLabel.className = 'csk-category-bar__label'; + categoryLabel.textContent = '📚'; + categorySelect = document.createElement('select'); + categorySelect.id = 'csk-category-select'; + categorySelect.className = 'csk-category-select'; + categorySelect.innerHTML = ``; + // onChange 触发自定义事件 + categorySelect.addEventListener('change', () => { + const selectedId = categorySelect.value; + windowEl.dispatchEvent(new CustomEvent('csk:categoryChange', { + detail: { categoryId: selectedId ? Number(selectedId) : undefined } + })); + }); + categoryBar.appendChild(categoryLabel); + categoryBar.appendChild(categorySelect); + // 插入到 messages 和 inputArea 之间 + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + windowEl.appendChild(categoryBar); + } + else { + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + } // === 输入区 === const inputArea = document.createElement('div'); inputArea.className = 'csk-input-area'; const inputEl = document.createElement('textarea'); inputEl.id = 'csk-input'; inputEl.className = 'csk-input'; - inputEl.setAttribute('placeholder', '输入您的问题...'); + inputEl.setAttribute('placeholder', t('placeholder')); inputEl.setAttribute('rows', '1'); inputEl.setAttribute('autofocus', ''); const sendBtn = document.createElement('button'); sendBtn.id = 'csk-send-btn'; sendBtn.className = 'csk-send-btn'; - sendBtn.setAttribute('title', '发送'); + sendBtn.setAttribute('title', t('send')); sendBtn.setAttribute('disabled', 'true'); sendBtn.innerHTML = ``; inputArea.appendChild(inputEl); inputArea.appendChild(sendBtn); - // === 组装 === - windowEl.appendChild(header); - windowEl.appendChild(messagesContainer); windowEl.appendChild(inputArea); // 清空按钮(可选) let clearBtn = null; if (config.showClear) { clearBtn = document.createElement('button'); clearBtn.className = 'csk-clear-btn'; - clearBtn.textContent = '清空对话'; + clearBtn.textContent = t('clear'); clearBtn.style.display = 'none'; // 初始隐藏,有消息后才显示 - // 插入到 messages 之后、inputArea 之前 + // 插入到 categoryBar/inputArea 之前 windowEl.insertBefore(clearBtn, inputArea); } // === Loading 动画 === @@ -800,6 +1641,8 @@ var ChatbotSDK = (function () { inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading, hideLoading, }; @@ -864,13 +1707,19 @@ var ChatbotSDK = (function () { container.appendChild(wrapper); return wrapper; } - /** 渲染 AI 消息气泡 */ - function renderAIBubble(container, text, timestamp) { + /** 渲染 AI 消息气泡(支持 Markdown) */ + function renderAIBubble(container, text, timestamp, renderMd) { const wrapper = document.createElement('div'); wrapper.className = 'csk-msg csk-msg--ai'; const bubble = document.createElement('div'); bubble.className = 'csk-msg__bubble'; - bubble.textContent = text; + // 支持 Markdown 渲染,传入渲染函数则使用,否则纯文本 + if (renderMd) { + bubble.innerHTML = renderMd(text); + } + else { + bubble.textContent = text; + } const time = document.createElement('div'); time.className = 'csk-msg__time'; time.textContent = formatTime(timestamp); @@ -894,6 +1743,132 @@ var ChatbotSDK = (function () { container.appendChild(wrapper); return { wrapper, bubble }; } + // ==================== P1: RAG 引用来源渲染 ==================== + /** 渲染 RAG 引用来源卡片 */ + function renderSources(wrapper, sources) { + // 移除已有的来源卡片 + const existing = wrapper.querySelector('.csk-sources'); + if (existing) + existing.remove(); + if (!sources || sources.length === 0) + return; + const sourcesEl = document.createElement('div'); + sourcesEl.className = 'csk-sources csk-sources--collapsed'; + // 头部 + const header = document.createElement('div'); + header.className = 'csk-sources__header'; + const titleSpan = document.createElement('span'); + titleSpan.className = 'csk-sources__title'; + titleSpan.textContent = `📚 ${t('source_count', { n: sources.length })}`; + const arrow = document.createElement('span'); + arrow.className = 'csk-sources__arrow'; + arrow.textContent = '▼'; + header.appendChild(titleSpan); + header.appendChild(arrow); + // 点击折叠/展开 + header.addEventListener('click', () => { + sourcesEl.classList.toggle('csk-sources--collapsed'); + }); + // 内容 + const body = document.createElement('div'); + body.className = 'csk-sources__body'; + for (const src of sources) { + const item = document.createElement('div'); + item.className = 'csk-source-item'; + const name = document.createElement('div'); + name.className = 'csk-source-item__name'; + name.textContent = src.title || src.sourceName || '未知文档'; + if (src.snippet) { + const snippet = document.createElement('div'); + snippet.className = 'csk-source-item__snippet'; + snippet.textContent = src.snippet; + item.appendChild(snippet); + } + const meta = document.createElement('div'); + meta.className = 'csk-source-item__meta'; + const metaParts = []; + if (src.sourceName) + metaParts.push(src.sourceName); + if (src.chunkIndex !== undefined) + metaParts.push(`分块 #${src.chunkIndex}`); + if (src.score !== undefined) + metaParts.push(`相关度 ${(src.score * 100).toFixed(0)}%`); + meta.textContent = metaParts.join(' · '); + item.appendChild(name); + item.appendChild(meta); + body.appendChild(item); + } + sourcesEl.appendChild(header); + sourcesEl.appendChild(body); + // 插入到气泡和时间戳之间 + const timeEl = wrapper.querySelector('.csk-msg__time'); + if (timeEl) { + wrapper.insertBefore(sourcesEl, timeEl); + } + else { + wrapper.appendChild(sourcesEl); + } + } + /** 渲染会话列表 */ + function renderHistoryList(listEl, items, onExport, onDelete, emptyText) { + listEl.innerHTML = ''; + if (items.length === 0) { + const empty = document.createElement('div'); + empty.className = 'csk-history-panel__empty'; + empty.innerHTML = ` +
💬
+
${t('history_empty')}
+ `; + listEl.appendChild(empty); + return; + } + for (const item of items) { + const el = document.createElement('div'); + el.className = 'csk-history-item'; + const info = document.createElement('div'); + info.className = 'csk-history-item__info'; + const idEl = document.createElement('div'); + idEl.className = 'csk-history-item__id'; + idEl.textContent = item.chatId || item.id; + const metaEl = document.createElement('div'); + metaEl.className = 'csk-history-item__meta'; + const metaParts = []; + if (item.messageCount !== undefined) + metaParts.push(`${item.messageCount} 条消息`); + if (item.lastMessageTime) + metaParts.push(item.lastMessageTime); + else if (item.createdAt) + metaParts.push(item.createdAt); + metaEl.textContent = metaParts.join(' · '); + info.appendChild(idEl); + info.appendChild(metaEl); + const actionsEl = document.createElement('div'); + actionsEl.className = 'csk-history-item__actions'; + // 导出按钮 + const exportBtn = document.createElement('button'); + exportBtn.className = 'csk-history-action csk-history-action--export'; + exportBtn.setAttribute('title', t('history_export')); + exportBtn.innerHTML = ``; + exportBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onExport(item.id); + }); + // 删除按钮 + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'csk-history-action csk-history-action--delete'; + deleteBtn.setAttribute('title', t('history_delete')); + deleteBtn.innerHTML = ``; + deleteBtn.addEventListener('click', (e) => { + e.stopPropagation(); + onDelete(item.id); + }); + actionsEl.appendChild(exportBtn); + actionsEl.appendChild(deleteBtn); + el.appendChild(info); + el.appendChild(actionsEl); + listEl.appendChild(el); + } + } /** 滚动消息区到底部 */ function scrollToBottom(container) { container.scrollTop = container.scrollHeight; @@ -972,15 +1947,208 @@ var ChatbotSDK = (function () { } } + /** + * 轻量级 Markdown 渲染器 - 无外部依赖,XSS 安全 + * + * 支持:代码块、行内代码、标题、粗体、斜体、列表、链接、引用、段落 + * 策略:先转义 HTML,再转 Markdown 为安全 HTML 标签 + */ + /** 代码块占位符前缀 */ + const CODE_BLOCK_PREFIX = '\x00CODEBLOCK_'; + /** 行内代码占位符前缀 */ + const INLINE_CODE_PREFIX = '\x00INLINECODE_'; + /** + * 渲染 Markdown 文本为安全 HTML + * @param text Markdown 源文本 + * @returns 安全 HTML 字符串 + */ + function renderMarkdown(text) { + if (!text || typeof text !== 'string') + return ''; + // 1. 提取代码块(防止内部 Markdown 被处理) + const codeBlocks = []; + let processed = text; + // 提取围栏代码块 ``` + processed = processed.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => { + const idx = codeBlocks.length; + const escapedCode = escapeHtml(code.trimEnd()); + const langClass = lang ? ` class="language-${escapeHtml(lang)}"` : ''; + codeBlocks.push(`
${escapedCode}
`); + return `${CODE_BLOCK_PREFIX}${idx}\x00`; + }); + // 2. 提取行内代码 + const inlineCodes = []; + processed = processed.replace(/`([^`\n]+)`/g, (_match, code) => { + const idx = inlineCodes.length; + inlineCodes.push(`${escapeHtml(code)}`); + return `${INLINE_CODE_PREFIX}${idx}\x00`; + }); + // 3. 转义剩余 HTML(代码块和行内代码已安全处理) + processed = escapeHtml(processed); + // 4. 还原代码块和行内代码占位符(它们已经是安全 HTML) + processed = restorePlaceholders(processed, CODE_BLOCK_PREFIX, codeBlocks); + processed = restorePlaceholders(processed, INLINE_CODE_PREFIX, inlineCodes); + // 5. 逐行处理 Markdown 语法 + const lines = processed.split('\n'); + const result = []; + let inList = false; + let listType = ''; // 'ul' 或 'ol' + let inBlockquote = false; + let paragraphBuffer = []; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + // 代码块已在占位符还原阶段处理,直接输出 + if (line.includes(CODE_BLOCK_PREFIX) || line.includes('
')) {
+                flushParagraph();
+                closeList();
+                closeBlockquote();
+                result.push(line);
+                continue;
+            }
+            // 标题
+            const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
+            if (headingMatch) {
+                flushParagraph();
+                closeList();
+                closeBlockquote();
+                const level = headingMatch[1].length;
+                result.push(`${headingMatch[2]}`);
+                continue;
+            }
+            // 引用
+            const quoteMatch = line.match(/^>\s?(.*)/);
+            if (quoteMatch) {
+                flushParagraph();
+                closeList();
+                if (!inBlockquote) {
+                    inBlockquote = true;
+                    result.push('
'); + } + result.push(`

${inlineFormat(quoteMatch[1])}

`); + continue; + } + else if (inBlockquote) { + closeBlockquote(); + } + // 无序列表 + const ulMatch = line.match(/^[\-\*]\s+(.+)/); + if (ulMatch) { + flushParagraph(); + closeBlockquote(); + if (!inList || listType !== 'ul') { + closeList(); + inList = true; + listType = 'ul'; + result.push('
    '); + } + result.push(`
  • ${inlineFormat(ulMatch[1])}
  • `); + continue; + } + // 有序列表 + const olMatch = line.match(/^\d+\.\s+(.+)/); + if (olMatch) { + flushParagraph(); + closeBlockquote(); + if (!inList || listType !== 'ol') { + closeList(); + inList = true; + listType = 'ol'; + result.push('
      '); + } + result.push(`
    1. ${inlineFormat(olMatch[1])}
    2. `); + continue; + } + // 空行 → 段落分隔 + if (line.trim() === '') { + flushParagraph(); + closeList(); + continue; + } + // 水平线 + if (/^(\*{3,}|-{3,}|_{3,})$/.test(line.trim())) { + flushParagraph(); + closeList(); + closeBlockquote(); + result.push('
      '); + continue; + } + // 普通文本 → 收集到段落缓冲 + closeList(); + closeBlockquote(); + paragraphBuffer.push(inlineFormat(line)); + } + flushParagraph(); + closeList(); + closeBlockquote(); + return result.join('\n'); + // === 辅助函数 === + /** 行内格式化:粗体、斜体、链接 */ + function inlineFormat(text) { + // 粗体 **text** 或 __text__ + text = text.replace(/\*\*(.+?)\*\*/g, '$1'); + text = text.replace(/__(.+?)__/g, '$1'); + // 斜体 *text* 或 _text_ + text = text.replace(/\*(.+?)\*/g, '$1'); + text = text.replace(/(?$1'); + // 删除线 ~~text~~ + text = text.replace(/~~(.+?)~~/g, '$1'); + // 链接 [text](url) + text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, linkText, url) => { + // 只允许 http/https 链接,防止 javascript: 协议 + const safeUrl = /^https?:\/\//i.test(url) ? url : '#'; + return `${linkText}`; + }); + return text; + } + /** 将段落缓冲输出为

      */ + function flushParagraph() { + if (paragraphBuffer.length > 0) { + result.push(`

      ${paragraphBuffer.join('
      ')}

      `); + paragraphBuffer = []; + } + } + /** 关闭列表 */ + function closeList() { + if (inList) { + result.push(listType === 'ul' ? '
' : ''); + inList = false; + listType = ''; + } + } + /** 关闭引用块 */ + function closeBlockquote() { + if (inBlockquote) { + result.push('
'); + inBlockquote = false; + } + } + } + /** 还原占位符为安全 HTML */ + function restorePlaceholders(text, prefix, replacements) { + return text.replace(new RegExp(escapeRegex(prefix) + '(\\d+)\x00', 'g'), (_m, idx) => { + return replacements[parseInt(idx)] || ''; + }); + } + /** 转义正则特殊字符 */ + function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + let config$1 = null; let messages = []; let messagesContainer$1 = null; let inputEl$1 = null; let sendBtn$1 = null; let clearBtn$1 = null; + let categorySelect$1 = null; + let historyPanel$1 = null; let showLoadingFn$1 = null; let hideLoadingFn$1 = null; let isSending = false; + /** 当前选中的知识库分类 ID */ + let currentCategoryId; + /** 当前是否使用 RAG 对话 */ + let useRag = false; /** * 初始化对话模块 */ @@ -990,41 +2158,84 @@ var ChatbotSDK = (function () { inputEl$1 = dom.inputEl; sendBtn$1 = dom.sendBtn; clearBtn$1 = dom.clearBtn; + categorySelect$1 = dom.categorySelect; + historyPanel$1 = dom.historyPanel; showLoadingFn$1 = dom.showLoading; hideLoadingFn$1 = dom.hideLoading; + // 初始化知识库分类 + currentCategoryId = cfg.categoryId; + useRag = !!cfg.categoryId || !!cfg.showCategorySwitch; // 绑定发送事件 bindSendEvents(); - // 恢复历史消息 - const history = loadMessages(cfg.integrateId); - if (history.length > 0) { - messages = history; - renderHistory(); + // 加载知识库分类下拉框 + if (cfg.showCategorySwitch && categorySelect$1) { + loadCategories(); + } + } + /** + * 初始化 chatId 并加载对话历史 + * 异步流程:查后端会话 → 恢复 chatId → 加载历史消息 + */ + async function initChatHistory() { + if (!config$1 || !messagesContainer$1) + return; + // 1. 初始化 chatId(从后端获取已有会话或自动生成) + await initChatId(); + // 2. 尝试从后端加载对话历史 + await loadHistoryFromBackend(); + // 3. 如果后端无历史,尝试从 localStorage 恢复 + if (messages.length === 0) { + const cached = loadMessages(config$1.integrateId); + if (cached.length > 0) { + messages = cached; + renderHistory(); + logger.info(`从本地缓存恢复 ${cached.length} 条消息`); + } + } + } + /** + * 从后端加载对话历史 + */ + async function loadHistoryFromBackend() { + if (!config$1 || !messagesContainer$1) + return; + const chatId = getChatId(); + if (!chatId) + return; + try { + const result = await fetchConversationMessages(chatId); + if (result.messages.length > 0) { + // 将后端消息转换为 ChatMessage 格式 + messages = result.messages.map((msg, idx) => ({ + id: uuid(), + role: msg.messageType === 'USER' ? 'user' : 'ai', + content: msg.content, + timestamp: new Date(msg.createTime).getTime(), + })); + renderHistory(); + logger.info(`从后端加载 ${messages.length} 条历史消息`); + // 同步到 localStorage + saveMessages(config$1.integrateId, messages); + } + } + catch (err) { + logger.warn('从后端加载历史消息失败', err); } } /** 绑定发送相关事件 */ function bindSendEvents() { if (!inputEl$1 || !sendBtn$1) return; - // 发送按钮点击 - sendBtn$1.addEventListener('click', () => { - handleSend(); - }); - // 输入框键盘事件:回车发送 / Shift+Enter 换行 + sendBtn$1.addEventListener('click', () => handleSend()); inputEl$1.addEventListener('keydown', (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }); - // 输入框内容变化时启用/禁用发送按钮 - inputEl$1.addEventListener('input', () => { - updateSendBtnState(); - }); - // 清空按钮 + inputEl$1.addEventListener('input', () => updateSendBtnState()); if (clearBtn$1) { - clearBtn$1.addEventListener('click', () => { - handleClear(); - }); + clearBtn$1.addEventListener('click', () => handleClear()); } } /** 更新发送按钮状态 */ @@ -1046,30 +2257,23 @@ var ChatbotSDK = (function () { const text = inputEl$1.value.trim(); if (text === '') return; - // 清空输入框 inputEl$1.value = ''; updateSendBtnState(); - // 自动调整 textarea 高度 inputEl$1.style.height = 'auto'; isSending = true; updateSendBtnState(); + // 确保 chatId 已初始化 + if (!config$1.chatId) { + await initChatId(); + } // 1. 渲染用户气泡 const userTimestamp = now(); - if (messagesContainer$1) { + if (messagesContainer$1) renderUserBubble(messagesContainer$1, text, userTimestamp); - } - const userMsg = { - id: uuid(), - role: 'user', - content: text, - timestamp: userTimestamp, - }; + const userMsg = { id: uuid(), role: 'user', content: text, timestamp: userTimestamp }; messages.push(userMsg); - // 显示清空按钮 - if (clearBtn$1 && messages.length > 0) { + if (clearBtn$1 && messages.length > 0) clearBtn$1.style.display = 'inline-flex'; - } - // 滚动到底部 if (messagesContainer$1) scrollToBottom(messagesContainer$1); // 2. 显示 loading @@ -1081,40 +2285,31 @@ var ChatbotSDK = (function () { try { let aiContent; const aiTimestamp = now(); + const shouldUseRag = useRag && (currentCategoryId !== undefined || config$1.categoryId !== undefined); if (config$1.streaming) { - // 流式输出:气泡由 sendStreamMessage 内部的 onChunk 回调创建 - aiContent = await sendStreamMessage(text, aiTimestamp); + aiContent = await sendStreamMessage(text, aiTimestamp, shouldUseRag); } else { - // 同步请求:需要在此渲染 AI 气泡 aiContent = await chatRequest(text); } - // 4. 隐藏 loading(流式模式在 onChunk 中已隐藏,此处做兜底) if (hideLoadingFn$1) hideLoadingFn$1(); - // 5. 非流式模式:在此渲染 AI 气泡;流式模式气泡已在 stream 回调中创建 if (!config$1.streaming && messagesContainer$1) { - renderAIBubble(messagesContainer$1, aiContent, aiTimestamp); + renderAIBubble(messagesContainer$1, aiContent, aiTimestamp, renderMarkdown); } - const aiMsg = { - id: uuid(), - role: 'ai', - content: aiContent, - timestamp: aiTimestamp, - }; + const aiMsg = { id: uuid(), role: 'ai', content: aiContent, timestamp: aiTimestamp }; messages.push(aiMsg); - // 6. 保存到 localStorage saveMessages(config$1.integrateId, messages); - // 7. 滚动到底部 if (messagesContainer$1) scrollToBottom(messagesContainer$1); + // RAG 引用来源 + if (shouldUseRag) + fetchAndRenderSources(text, aiMsg); } catch (err) { - // 隐藏 loading if (hideLoadingFn$1) hideLoadingFn$1(); - // 渲染错误提示 - const errMsg = err instanceof CskError ? err.message : '发送失败,请稍后重试'; + const errMsg = err instanceof CskError ? err.message : t('error_send'); if (messagesContainer$1) { const errorBubble = document.createElement('div'); errorBubble.className = 'csk-msg csk-msg--ai'; @@ -1133,93 +2328,190 @@ var ChatbotSDK = (function () { } } /** 流式发送消息 */ - async function sendStreamMessage(text, aiTimestamp) { + async function sendStreamMessage(text, aiTimestamp, shouldUseRag) { return new Promise((resolve, reject) => { let bubbleEl = null; - let wrapperEl = null; let accumulated = ''; let streamStarted = false; - chatSSERequest(text, - // onChunk - (chunk) => { + chatSSERequest(text, (chunk) => { accumulated += chunk; if (!streamStarted && messagesContainer$1) { - // 隐藏 loading,创建空 AI 气泡 if (hideLoadingFn$1) hideLoadingFn$1(); - const { wrapper, bubble } = createEmptyAIBubble(messagesContainer$1, aiTimestamp); - wrapperEl = wrapper; + const { bubble } = createEmptyAIBubble(messagesContainer$1, aiTimestamp); bubbleEl = bubble; streamStarted = true; } - if (bubbleEl) { + if (bubbleEl) bubbleEl.textContent = accumulated; - } if (messagesContainer$1) scrollToBottom(messagesContainer$1); - }, - // onDone - () => { - // 如果流没有产生任何内容,回退同步请求 + }, () => { if (!streamStarted && accumulated === '') { - chatRequest(text) - .then((content) => resolve(content)) - .catch(reject); + chatRequest(text).then(resolve).catch(reject); return; } + if (bubbleEl && accumulated) + bubbleEl.innerHTML = renderMarkdown(accumulated); resolve(accumulated); - }, - // onError - (error) => { + }, (error) => { if (accumulated.length > 0) { - // 有部分内容,保留并添加提示 - if (bubbleEl) { - bubbleEl.textContent = accumulated + '\n\n[回复被中断]'; - } + if (bubbleEl) + bubbleEl.innerHTML = renderMarkdown(accumulated + '\n\n' + t('stream_interrupted')); resolve(accumulated); } else { reject(error); } - }); + }, currentCategoryId, shouldUseRag); }); } + /** 获取并渲染 RAG 引用来源 */ + async function fetchAndRenderSources(message, aiMsg) { + try { + const sources = await fetchRagSources(message, currentCategoryId); + if (sources.length > 0) { + const ragSources = sources.map(s => { + var _a, _b; + return ({ + documentId: s.documentId || '', + title: s.title || '', + sourceName: s.sourceName || '', + chunkIndex: (_a = s.chunkIndex) !== null && _a !== void 0 ? _a : 0, + score: (_b = s.score) !== null && _b !== void 0 ? _b : 0, + snippet: s.snippet || '', + }); + }); + aiMsg.sources = ragSources; + if (messagesContainer$1) { + const lastAiMsg = messagesContainer$1.querySelector('.csk-msg--ai:last-of-type'); + if (lastAiMsg) + renderSources(lastAiMsg, ragSources); + } + if (config$1) + saveMessages(config$1.integrateId, messages); + } + } + catch (err) { + logger.warn('获取引用来源失败', err); + } + } + /** 加载知识库分类到下拉框 */ + async function loadCategories() { + if (!categorySelect$1) + return; + try { + const tree = await fetchCategoryTree(); + if (tree.length === 0) + return; + categorySelect$1.innerHTML = ``; + const addOptions = (nodes, indent = 0) => { + for (const node of nodes) { + const option = document.createElement('option'); + option.value = String(node.id); + option.textContent = `${' '.repeat(indent)}${node.name}`; + if (currentCategoryId !== undefined && String(node.id) === String(currentCategoryId)) + option.selected = true; + categorySelect$1.appendChild(option); + if (node.children && node.children.length > 0) + addOptions(node.children, indent + 1); + } + }; + addOptions(tree); + logger.info(`知识库分类加载成功 count=${tree.length}`); + } + catch (err) { + logger.error(t('category_load_error'), err); + } + } /** 渲染历史消息 */ function renderHistory() { if (!messagesContainer$1) return; - // 清空容器 - messagesContainer$1.innerHTML = ''; + const historyPanelEl = messagesContainer$1.querySelector('.csk-history-panel'); + const msgs = messagesContainer$1.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); for (const msg of messages) { if (msg.role === 'user') { renderUserBubble(messagesContainer$1, msg.content, msg.timestamp); } else { - renderAIBubble(messagesContainer$1, msg.content, msg.timestamp); + const wrapper = renderAIBubble(messagesContainer$1, msg.content, msg.timestamp, renderMarkdown); + if (msg.sources && msg.sources.length > 0) + renderSources(wrapper, msg.sources); } } scrollToBottom(messagesContainer$1); - // 显示清空按钮 - if (clearBtn$1 && messages.length > 0) { + if (clearBtn$1 && messages.length > 0) clearBtn$1.style.display = 'inline-flex'; + if (historyPanelEl && !messagesContainer$1.contains(historyPanelEl)) { + messagesContainer$1.appendChild(historyPanelEl); } } - /** 清空对话历史 */ + /** 清空对话历史(生成新 chatId) */ function handleClear() { if (!config$1) return; - if (!confirm('确定清空所有对话记录?')) { + if (!confirm(t('clear_confirm'))) return; - } messages = []; if (messagesContainer$1) { - messagesContainer$1.innerHTML = ''; + const msgs = messagesContainer$1.querySelectorAll('.csk-msg, .csk-loading'); + msgs.forEach(el => el.remove()); } - if (clearBtn$1) { + if (clearBtn$1) clearBtn$1.style.display = 'none'; - } clearMessages(config$1.integrateId); - logger.info(`清空会话 integrateId=${config$1.integrateId}`); + // 生成新的 chatId,开始新会话 + const newId = generateNewChatId(); + updateChatId(newId); + saveCachedChatId(config$1.integrateId, config$1.userId, newId); + logger.lifecycleClear(config$1.integrateId); + logger.info(`新 chatId=${newId}`); + } + /** 生成新 chatId */ + function generateNewChatId() { + const random = typeof crypto !== 'undefined' && crypto.randomUUID + ? crypto.randomUUID().substring(0, 8) + : Math.random().toString(36).substring(2, 10); + return `sdk_${Date.now()}_${random}`; + } + /** 设置当前知识库分类 */ + function setCategory(categoryId) { + currentCategoryId = categoryId; + useRag = categoryId !== undefined; + logger.lifecycleCategoryChange(categoryId !== null && categoryId !== void 0 ? categoryId : '全部'); + } + // ==================== 会话管理面板 ==================== + /** 加载会话列表并渲染 */ + async function loadHistoryConversations() { + if (!historyPanel$1 || !config$1) + return; + const listEl = historyPanel$1.querySelector('#csk-history-list'); + if (!listEl) + return; + listEl.innerHTML = `
加载中...
`; + try { + const result = await fetchConversationList(1, 50, config$1.userId, config$1.integrateId); + const items = result.list.map(c => ({ + id: c.conversationId || c.chatId || '', + chatId: c.conversationId || c.chatId || '', + messageCount: c.messageCount, + lastMessageTime: c.lastMessageTime, + createdAt: c.firstMessageTime || c.createdAt, + })); + renderHistoryList(listEl, items, (id) => { window.open(getConversationExportUrl(id), '_blank'); }, async (id) => { + if (!confirm(t('history_delete_confirm'))) + return; + const ok = await deleteConversation(id); + if (ok) + loadHistoryConversations(); + }); + } + catch (err) { + logger.error(t('history_load_error'), err); + listEl.innerHTML = `
${t('history_load_error')}
`; + } } // ==================== 单例状态 ==================== @@ -1231,6 +2523,8 @@ var ChatbotSDK = (function () { let inputEl = null; let sendBtn = null; let clearBtn = null; + let categorySelect = null; + let historyPanel = null; let showLoadingFn = null; let hideLoadingFn = null; let dragCleanup = null; @@ -1243,52 +2537,67 @@ var ChatbotSDK = (function () { } // 1. 配置解析与校验 const parsed = parseConfig(rawConfig); - if (!parsed) { - return; // parseConfig 已输出错误 - } + if (!parsed) + return; config = parsed; - // 2. 设置日志级别 + // 2. 设置国际化语言 + setLocale(config.locale); + // 3. 设置日志级别 setDebug(config.debug); - // 3. 设置 API 配置 + // 4. 设置 API 配置 setApiConfig(config); - // 4. 注入样式 + // 5. 注入样式 injectStyles(config); - // 5. 创建悬浮按钮 + // 6. 创建悬浮按钮 launcherEl = createLauncher(config, toggle); document.body.appendChild(launcherEl); - // 6. 创建聊天弹窗 + // 7. 创建聊天弹窗 const dom = createChatWindow(config); windowEl = dom.window; messagesContainer = dom.messagesContainer; inputEl = dom.inputEl; sendBtn = dom.sendBtn; clearBtn = dom.clearBtn; + categorySelect = dom.categorySelect; + historyPanel = dom.historyPanel; showLoadingFn = dom.showLoading; hideLoadingFn = dom.hideLoading; document.body.appendChild(windowEl); - // 7. 启用拖拽 + // 8. 启用拖拽 const headerEl = windowEl.querySelector('.csk-header'); if (headerEl) { dragCleanup = enableDrag(headerEl, windowEl); } - // 8. 初始化对话模块 + // 9. 初始化对话模块 initChat(config, { messagesContainer, inputEl, sendBtn, clearBtn, + categorySelect, + historyPanel, showLoading: showLoadingFn, hideLoading: hideLoadingFn, }); + // 10. 监听知识库分类切换事件 + windowEl.addEventListener('csk:categoryChange', ((e) => { + setCategory(e.detail.categoryId); + })); + // 11. 监听会话管理面板加载事件 + windowEl.addEventListener('csk:loadHistory', () => { + loadHistoryConversations(); + }); isInitialized = true; - logger.info(`初始化完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + logger.lifecycleInit(config.integrateId, config.requestDomain); + // 12. 异步初始化 chatId 和对话历史(不阻塞 UI) + initChatHistory().catch(err => { + logger.warn('chatId 初始化失败,将在发送消息时重试', err); + }); } /** 销毁 SDK 实例 */ function destroy() { - if (!isInitialized) { + if (!isInitialized) return; - } - // 移除 DOM 元素 if (launcherEl && launcherEl.parentNode) { launcherEl.parentNode.removeChild(launcherEl); launcherEl = null; @@ -1297,14 +2606,11 @@ var ChatbotSDK = (function () { windowEl.parentNode.removeChild(windowEl); windowEl = null; } - // 移除拖拽事件 if (dragCleanup) { dragCleanup(); dragCleanup = null; } - // 移除样式 removeStyles(); - // 重置状态 const oldIntegrateId = config === null || config === void 0 ? void 0 : config.integrateId; config = null; isInitialized = false; @@ -1312,43 +2618,37 @@ var ChatbotSDK = (function () { inputEl = null; sendBtn = null; clearBtn = null; + categorySelect = null; + historyPanel = null; showLoadingFn = null; hideLoadingFn = null; - logger.info(`销毁实例 integrateId=${oldIntegrateId}`); + logger.lifecycleDestroy(oldIntegrateId || ''); } - /** 打开聊天窗口 */ function open() { if (!windowEl) return; windowEl.classList.remove('csk-window--hidden'); } - /** 关闭聊天窗口 */ function close() { if (!windowEl) return; windowEl.classList.add('csk-window--hidden'); } - /** 切换窗口显示/隐藏 */ function toggle() { if (!windowEl) return; if (windowEl.classList.contains('csk-window--hidden')) { open(); - // 聚焦输入框 - setTimeout(() => { - if (inputEl) - inputEl.focus(); - }, 100); + setTimeout(() => { if (inputEl) + inputEl.focus(); }, 100); } else { close(); } } - /** 清空当前会话历史 */ function clearHistory() { if (!config) return; - // 通过触发自定义事件,让 chat 模块处理 if (clearBtn) { clearBtn.click(); } @@ -1365,7 +2665,6 @@ var ChatbotSDK = (function () { toggle, clearHistory, }; - // IIFE 自动挂载 if (typeof window !== 'undefined') { window.ChatbotSDK = ChatbotSDK; } diff --git a/src/main/resources/static/sdk/chatbot-sdk.js.map b/src/main/resources/static/sdk/chatbot-sdk.js.map index e3a9868..ac22c50 100644 --- a/src/main/resources/static/sdk/chatbot-sdk.js.map +++ b/src/main/resources/static/sdk/chatbot-sdk.js.map @@ -1 +1 @@ -{"version":3,"file":"chatbot-sdk.js","sources":["../src/logger.ts","../src/config.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["config","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chatbot-sdk.js","sources":["../src/logger.ts","../src/config.ts","../src/i18n.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/markdown.ts","../src/chat.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null],"names":["config","messagesContainer","inputEl","sendBtn","clearBtn","categorySelect","historyPanel","showLoadingFn","hideLoadingFn"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/sdk/chatbot-sdk.min.js b/src/main/resources/static/sdk/chatbot-sdk.min.js index 0826a35..90e850f 100644 --- a/src/main/resources/static/sdk/chatbot-sdk.min.js +++ b/src/main/resources/static/sdk/chatbot-sdk.min.js @@ -1,2 +1,2 @@ -var ChatbotSDK=function(){"use strict";const n="[ChatbotSDK]";let e=!0;const t={info(t,r){e&&console.log(n,t,void 0!==r?r:"")},warn(t,r){e&&console.warn(n,t,void 0!==r?r:"")},error(e,t){console.error(n,e,void 0!==t?t:"")}};let r=null;function o(n){if(!r)throw new Error("API 配置未初始化");return`${r.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function i(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function s(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new a("请求超时,请稍后重试","timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new a("跨域请求被拦截,请联系管理员将当前域名加入 API 白名单","cors");throw new a("网络连接失败,请检查网络","network")}finally{clearTimeout(o)}}class a extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function c(n){switch(n){case 401:return"鉴权失败,请联系管理员";case 403:return"无访问权限,请联系管理员配置";case 404:return"请求的资源不存在";case 429:return"请求过于频繁,请稍后重试";case 500:return"服务器异常,请稍后重试";case 502:case 503:return"服务暂不可用,请稍后重试";default:return`请求失败(状态码 ${n})`}}async function l(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n),l=Date.now();t.info(`发送消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(e);if(!n.ok){const e=c(n.status);throw t.error(`请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),new a(e,`http_${n.status}`)}const o=await n.text(),i=Date.now()-l;return t.info(`AI 回复 integrateId=${r.integrateId} length=${o.length} duration=${i}ms`),o}catch(n){if(n instanceof a)throw n;throw t.error(`请求异常 integrateId=${r.integrateId}`,n),new a("请求发生未知错误","unknown")}}async function d(n,e,l,d){var u;const m=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),i(e,"accountId",r.userId),i(e,"roleId",r.roleId),i(e,"categoryId",r.categoryId),o(`/ai/assistant_app/chat/sse?${e.toString()}`)}(n),p=Date.now();let g="";t.info(`发送流式消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(m,{},6e4);if(!n.ok){const e=c(n.status);return t.error(`流式请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),void d(new a(e,`http_${n.status}`))}const o=null===(u=n.body)||void 0===u?void 0:u.getReader();if(!o)return void d(new a("浏览器不支持流式读取","stream_unsupported"));const i=new TextDecoder("utf-8",{stream:!0});let h="";try{for(;;){const{done:n,value:t}=await o.read();if(n)break;h+=i.decode(t,{stream:!0});const r=h.split("\n");h=r.pop()||"";for(const n of r){const t=n.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const n=t.substring(5).trim();n&&(g+=n,e(n))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(g+=t,e(t))}}}if(h.trim()){const n=h.trim();if(n.startsWith("data:")){const t=n.substring(5).trim();t&&(g+=t,e(t))}else"[DONE]"!==n&&(g+=n,e(n))}}catch(n){if(!(g.length>0))throw n;e("\n\n[网络不稳定,内容可能不完整]")}finally{o.releaseLock()}const f=Date.now()-p;t.info(`流式回复完成 integrateId=${r.integrateId} length=${g.length} duration=${f}ms`),l()}catch(n){n instanceof a?d(n):(t.error(`流式请求异常 integrateId=${r.integrateId}`,n),d(new a("网络连接失败,请检查网络","network")))}}let u=null;function m(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),i=r(parseInt(t[2],16)+e),s=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function p(n){document.querySelector("style[data-csk-sdk]")||(u=document.createElement("style"),u.setAttribute("data-csk-sdk",""),u.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${m(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(u))}function g(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})}function h(){return Date.now()}function f(n,e){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===n.position?"left":"right"),t.setAttribute("title",n.title),t.setAttribute("aria-label",n.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=n.launcherIcon;const r=function(n,e){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,r),t=null},e)}}(e,300);return t.addEventListener("click",r),t.addEventListener("keydown",n=>{"Enter"!==n.key&&" "!==n.key||(n.preventDefault(),r())}),t}function x(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function k(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=b(t),r.appendChild(o),r.appendChild(i),n.appendChild(r),r}function w(n){n.scrollTop=n.scrollHeight}function b(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function y(n){return`csk_history_${n}`}function v(n){try{localStorage.removeItem(y(n))}catch(n){t.warn("清空会话历史失败",n)}}let I=null,C=[],E=null,_=null,$=null,D=null,L=null,A=null,N=!1;function S(n,e){I=n,E=e.messagesContainer,_=e.inputEl,$=e.sendBtn,D=e.clearBtn,L=e.showLoading,A=e.hideLoading,function(){if(!_||!$)return;$.addEventListener("click",()=>{B()}),_.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),B())}),_.addEventListener("input",()=>{F()}),D&&D.addEventListener("click",()=>{!function(){if(!I)return;if(!confirm("确定清空所有对话记录?"))return;C=[],E&&(E.innerHTML="");D&&(D.style.display="none");v(I.integrateId),t.info(`清空会话 integrateId=${I.integrateId}`)}()})}();const r=function(n){try{const e=localStorage.getItem(y(n));if(!e)return[];const r=JSON.parse(e);return r&&Array.isArray(r.messages)?(t.info(`加载历史消息 integrateId=${n} count=${r.messages.length}`),r.messages):[]}catch(n){return t.warn("加载会话历史失败",n),[]}}(n.integrateId);r.length>0&&(C=r,function(){if(!E)return;E.innerHTML="";for(const n of C)"user"===n.role?x(E,n.content,n.timestamp):k(E,n.content,n.timestamp);w(E),D&&C.length>0&&(D.style.display="inline-flex")}())}function F(){if(!$||!_)return;_.value.trim().length>0&&!N?$.removeAttribute("disabled"):$.setAttribute("disabled","true")}async function B(){if(!_||!I||N)return;const n=_.value.trim();if(""===n)return;_.value="",F(),_.style.height="auto",N=!0,F();const e=h();E&&x(E,n,e);const r={id:g(),role:"user",content:n,timestamp:e};C.push(r),D&&C.length>0&&(D.style.display="inline-flex"),E&&w(E),L&&L(),E&&w(E);try{let e;const r=h();e=I.streaming?await async function(n,e){return new Promise((t,r)=>{let o=null,i=null,s="",a=!1;d(n,n=>{if(s+=n,!a&&E){A&&A();const{wrapper:n,bubble:t}=function(n,e){const t=document.createElement("div");t.className="csk-msg csk-msg--ai";const r=document.createElement("div");r.className="csk-msg__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=b(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(E,e);i=n,o=t,a=!0}o&&(o.textContent=s),E&&w(E)},()=>{a||""!==s?t(s):l(n).then(n=>t(n)).catch(r)},n=>{s.length>0?(o&&(o.textContent=s+"\n\n[回复被中断]"),t(s)):r(n)})})}(n,r):await l(n),A&&A(),!I.streaming&&E&&k(E,e,r);const o={id:g(),role:"ai",content:e,timestamp:r};C.push(o),function(n,e){try{let r=e;r.length>200&&(r=r.slice(50),t.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${r.length} 条`));const o={messages:r,updatedAt:Date.now()};localStorage.setItem(y(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?t.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):t.error("保存会话历史失败",n)}}(I.integrateId,C),E&&w(E)}catch(n){A&&A();const e=n instanceof a?n.message:"发送失败,请稍后重试";if(E){const n=document.createElement("div");n.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${e}`,n.appendChild(t),E.appendChild(n)}t.error(`发送失败 integrateId=${I.integrateId}`,n)}finally{N=!1,F()}}let M=null,q=!1,T=null,H=null,z=null,j=null,U=null,W=null,K=null,O=null,P=null;function R(){H&&H.classList.remove("csk-window--hidden")}function J(){H&&H.classList.add("csk-window--hidden")}function X(){H&&(H.classList.contains("csk-window--hidden")?(R(),setTimeout(()=>{j&&j.focus()},100)):J())}const Y={init:function(n){if(q)return void t.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const o=function(n){var e,r,o,i,s,a;if(!n.integrateId||"string"!=typeof n.integrateId||""===n.integrateId.trim())return t.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return t.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return t.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:n.integrateId.trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,roleId:n.roleId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(r=n.width)&&void 0!==r?r:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'\n \n \n',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(i=n.showAdminPanel)&&void 0!==i&&i,streaming:null===(s=n.streaming)||void 0===s||s,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a};return t.info(`配置解析完成 integrateId=${c.integrateId} requestDomain=${c.requestDomain}`),c}(n);if(!o)return;var i;M=o,i=M.debug,e=i,function(n){r=n}(M),p(M),T=f(M,X),document.body.appendChild(T);const s=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const i=document.createElement("button");i.className="csk-header__btn csk-header__btn--minimize",i.setAttribute("title","最小化"),i.innerHTML='',i.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const s=document.createElement("button");s.className="csk-header__btn csk-header__btn--close",s.setAttribute("title","关闭"),s.innerHTML='',s.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(i),o.appendChild(s),t.appendChild(r),t.appendChild(o);const a=document.createElement("div");a.id="csk-messages",a.className="csk-messages";const c=document.createElement("div");c.className="csk-input-area";const l=document.createElement("textarea");l.id="csk-input",l.className="csk-input",l.setAttribute("placeholder","输入您的问题..."),l.setAttribute("rows","1"),l.setAttribute("autofocus","");const d=document.createElement("button");d.id="csk-send-btn",d.className="csk-send-btn",d.setAttribute("title","发送"),d.setAttribute("disabled","true"),d.innerHTML='',c.appendChild(l),c.appendChild(d),e.appendChild(t),e.appendChild(a),e.appendChild(c);let u=null;n.showClear&&(u=document.createElement("button"),u.className="csk-clear-btn",u.textContent="清空对话",u.style.display="none",e.insertBefore(u,c));let m=null;return{window:e,messagesContainer:a,inputEl:l,sendBtn:d,clearBtn:u,showLoading:function(){if(m)return m.style.display="flex",m;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n
\n
\n
\n ',a.appendChild(n),m=n,n},hideLoading:function(){m&&m.parentNode&&(m.parentNode.removeChild(m),m=null)}}}(M);H=s.window,z=s.messagesContainer,j=s.inputEl,U=s.sendBtn,W=s.clearBtn,K=s.showLoading,O=s.hideLoading,document.body.appendChild(H);const a=H.querySelector(".csk-header");a&&(P=function(n,e){let t=!1,r=0,o=0,i=0,s=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();i=r-a.left,s=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",l)},c=n=>{if(!t)return;const r=n.clientX-i,o=n.clientY-s,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},l=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)}}(a,H)),S(M,{messagesContainer:z,inputEl:j,sendBtn:U,clearBtn:W,showLoading:K,hideLoading:O}),q=!0,t.info(`初始化完成 integrateId=${M.integrateId} requestDomain=${M.requestDomain}`)},destroy:function(){if(!q)return;T&&T.parentNode&&(T.parentNode.removeChild(T),T=null),H&&H.parentNode&&(H.parentNode.removeChild(H),H=null),P&&(P(),P=null),u&&u.parentNode&&(u.parentNode.removeChild(u),u=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==M?void 0:M.integrateId;M=null,q=!1,z=null,j=null,U=null,W=null,K=null,O=null,t.info(`销毁实例 integrateId=${n}`)},open:R,close:J,toggle:X,clearHistory:function(){M&&(W?W.click():confirm("确定清空所有对话记录?")&&v(M.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=Y),Y}(); +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,o){const s=t[r];if(void 0!==s){const i=Date.now()-s;if(delete t[r],e){const e=o?`${o} ${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 o={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",placeholder:"输入您的问题...",send:"发送",loading:"正在思考...",stream_interrupted:"回复被中断",stream_unstable:"网络不稳定,内容可能不完整",category_placeholder:"选择知识库分类",category_all:"全部分类",category_load_error:"加载分类失败",source_title:"参考来源",source_count:"{n} 条参考来源",source_loading:"加载来源中...",clear:"清空对话",clear_confirm:"确定清空所有对话记录?",history_title:"历史会话",history_empty:"暂无历史会话",history_load_error:"加载会话列表失败",history_delete_confirm:"确定删除该会话?",history_export:"导出",history_delete:"删除",error_network:"网络连接失败,请检查网络",error_timeout:"请求超时,请稍后重试",error_server:"服务器异常,请稍后重试",error_cors:"跨域请求被拦截,请联系管理员将当前域名加入 API 白名单",error_auth:"鉴权失败,请联系管理员",error_forbidden:"无访问权限,请联系管理员配置",error_not_found:"请求的资源不存在",error_rate_limit:"请求过于频繁,请稍后重试",error_unavailable:"服务暂不可用,请稍后重试",error_unknown:"请求发生未知错误",error_send:"发送失败,请稍后重试",error_stream_unsupported:"浏览器不支持流式读取"},en:{title:"AI Assistant",minimize:"Minimize",close:"Close",placeholder:"Type your question...",send:"Send",loading:"Thinking...",stream_interrupted:"Response interrupted",stream_unstable:"Network unstable, content may be incomplete",category_placeholder:"Select category",category_all:"All categories",category_load_error:"Failed to load categories",source_title:"Sources",source_count:"{n} source(s)",source_loading:"Loading sources...",clear:"Clear chat",clear_confirm:"Clear all conversation history?",history_title:"History",history_empty:"No conversations yet",history_load_error:"Failed to load conversations",history_delete_confirm:"Delete this conversation?",history_export:"Export",history_delete:"Delete",error_network:"Network connection failed",error_timeout:"Request timed out, please try again",error_server:"Server error, please try again later",error_cors:"CORS request blocked. Please contact admin to whitelist your domain",error_auth:"Authentication failed, please contact admin",error_forbidden:"Access denied, please contact admin",error_not_found:"Resource not found",error_rate_limit:"Too many requests, please try again later",error_unavailable:"Service temporarily unavailable",error_unknown:"Unknown request error",error_send:"Failed to send, please try again",error_stream_unsupported:"Browser does not support streaming"}};let s="zh-CN";function i(n,e){let t=(o[s]||o["zh-CN"])[n]||o["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){if(!a)throw new Error("API 配置未初始化");return`${a.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}function l(n,e,t){null!=t&&("string"==typeof t&&""===t.trim()||n.set(e,String(t)))}async function d(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new u(i("error_timeout"),"timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new u(i("error_cors"),"cors");throw new u(i("error_network"),"network")}finally{clearTimeout(o)}}class u extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function p(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 m(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",a.chatId),l(e,"roleId",a.integrateId),l(e,"accountId",a.userId),c(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n);r.lifecycleSend(a.integrateId,n.length);try{const n=await d(e);if(!n.ok){const e=p(n.status);throw r.lifecycleError(a.integrateId,String(n.status),e),new u(e,`http_${n.status}`)}const t=await n.text();return r.lifecycleReply(a.integrateId,t.length),t}catch(n){if(n instanceof u)throw n;throw r.lifecycleError(a.integrateId,"unknown",String(n)),new u(i("error_unknown"),"unknown")}}async function h(n,e,t,o,s,m){var h;const g=m?function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),t.set("rewriteStrategy","REWRITE"),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(n,s):function(n,e){const t=new URLSearchParams;return t.set("message",n),t.set("chatId",a.chatId),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/chat/sse?${t.toString()}`)}(n,s);let k="";r.lifecycleSend(a.integrateId,n.length);try{const n=await d(g,{},6e4);if(!n.ok){const e=p(n.status);return r.lifecycleError(a.integrateId,String(n.status),e),void o(new u(e,`http_${n.status}`))}const s=null===(h=n.body)||void 0===h?void 0:h.getReader();if(!s)return void o(new u(i("error_stream_unsupported"),"stream_unsupported"));const c=new TextDecoder("utf-8",{stream:!0});let l="";try{for(;;){const{done:n,value:t}=await s.read();if(n)break;l+=c.decode(t,{stream:!0});const r=l.split("\n");l=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(l.trim()){const n=l.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{s.releaseLock()}r.lifecycleStreamDone(a.integrateId,k.length),t()}catch(n){n instanceof u?o(n):(r.lifecycleError(a.integrateId,"unknown",String(n)),o(new u(i("error_network"),"network")))}}async function g(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"),l(t,"roleId",a.integrateId),l(t,"accountId",a.userId),l(t,"categoryId",null!=e?e:a.categoryId),c(`/ai/assistant_app/rag/sources?${t.toString()}`)}(n,e);try{const n=await d(t);if(!n.ok)throw new u(p(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 k(n=1,e=20,t,o){let s=`/conversation/list?page=${n}&size=${e}`;t&&(s+=`&accountId=${encodeURIComponent(t)}`),o&&(s+=`&roleId=${encodeURIComponent(o)}`);const i=c(s);try{const n=await d(i);if(!n.ok)throw new u(p(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 f(){if(!a)return"";const n=function(n,e){try{return localStorage.getItem(y(n,e))||""}catch(n){return""}}(a.integrateId,a.userId);if(n)return a.chatId=n,r.info(`从缓存恢复 chatId=${n}`),n;try{const n=await k(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,b(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,b(a.integrateId,a.userId,e),r.info(`生成新 chatId=${e}`),e}function y(n,e){return`csk_chatId_${n}${e?"_"+e:""}`}function b(n,e,t){try{t?localStorage.setItem(y(n,e),t):localStorage.removeItem(y(n,e))}catch(n){}}let x=null;function _(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),s=r(parseInt(t[2],16)+e),i=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function w(n){document.querySelector("style[data-csk-sdk]")||(x=document.createElement("style"),x.setAttribute("data-csk-sdk",""),x.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${_(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n border-top: 1px solid #E5E7EB;\n background: #F9FAFB;\n gap: 8px;\n}\n.csk-category-bar__label {\n font-size: 12px;\n color: #6B7280;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 5px 8px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n font-size: 12px;\n color: #374151;\n background: #fff;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s;\n max-width: 200px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F9FAFB;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover {\n background: #F3F4F6;\n}\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 4px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n}\n.csk-sources--collapsed .csk-sources__arrow {\n transform: rotate(-90deg);\n}\n.csk-sources__body {\n border-top: 1px solid #E5E7EB;\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body {\n display: none;\n}\n.csk-source-item {\n padding: 8px 12px;\n border-bottom: 1px solid #F3F4F6;\n transition: background 0.15s;\n}\n.csk-source-item:last-child {\n border-bottom: none;\n}\n.csk-source-item:hover {\n background: #F9FAFB;\n}\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 2px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.4;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.csk-source-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p {\n margin: 0 0 8px;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child {\n margin-bottom: 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1,\n.csk-msg--ai .csk-msg__bubble .csk-md-h2,\n.csk-msg--ai .csk-msg__bubble .csk-md-h3,\n.csk-msg--ai .csk-msg__bubble .csk-md-h4,\n.csk-msg--ai .csk-msg__bubble .csk-md-h5,\n.csk-msg--ai .csk-msg__bubble .csk-md-h6 {\n margin: 12px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; }\n\n.csk-md-code-block {\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 8px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.5;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-md-code-block code {\n background: none;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n color: inherit;\n}\n.csk-md-inline-code {\n background: #E5E7EB;\n color: #DC2626;\n padding: 1px 6px;\n border-radius: 4px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', monospace;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol {\n padding-left: 20px;\n margin: 6px 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul li,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol li {\n margin-bottom: 4px;\n}\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding-left: 12px;\n margin: 8px 0;\n color: #6B7280;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n}\n.csk-md-link:hover {\n text-decoration: underline;\n}\n.csk-md-hr {\n border: none;\n border-top: 1px solid #E5E7EB;\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-history-panel {\n position: absolute;\n top: 48px;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n z-index: 10;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.csk-history-panel--hidden {\n display: none;\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n background: #F9FAFB;\n}\n.csk-history-panel__title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n}\n.csk-history-panel__back {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n.csk-history-panel__back:hover {\n background: #F3F4F6;\n}\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n}\n.csk-history-panel__list::-webkit-scrollbar {\n width: 4px;\n}\n.csk-history-panel__list::-webkit-scrollbar-thumb {\n background: #E5E7EB;\n border-radius: 2px;\n}\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 4px;\n}\n.csk-history-item:hover {\n background: #F3F4F6;\n}\n.csk-history-item__info {\n flex: 1;\n min-width: 0;\n}\n.csk-history-item__id {\n font-size: 13px;\n font-weight: 500;\n color: #1F2937;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-history-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 2px;\n}\n.csk-history-item__actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.csk-history-item:hover .csk-history-item__actions {\n opacity: 1;\n}\n.csk-history-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export {\n background: #EFF6FF;\n color: #2563EB;\n}\n.csk-history-action--export:hover {\n background: #DBEAFE;\n}\n.csk-history-action--delete {\n background: #FEF2F2;\n color: #DC2626;\n}\n.csk-history-action--delete:hover {\n background: #FEE2E2;\n}\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n color: #9CA3AF;\n font-size: 13px;\n}\n.csk-history-panel__loadmore {\n display: block;\n width: 100%;\n padding: 10px;\n border: none;\n background: #F9FAFB;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n transition: background 0.15s;\n}\n.csk-history-panel__loadmore:hover {\n background: #F3F4F6;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(x))}function v(){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 E(n){const e={"&":"&","<":"<",">":">",'"':""","'":"'"};return n.replace(/[&<>"']/g,n=>e[n]||n)}function I(){return Date.now()}function C(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 $(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const s=document.createElement("div");return s.className="csk-msg__time",s.textContent=N(t),r.appendChild(o),r.appendChild(s),n.appendChild(r),r}function S(n,e,t,r){const o=document.createElement("div");o.className="csk-msg csk-msg--ai";const s=document.createElement("div");s.className="csk-msg__bubble",r?s.innerHTML=r(e):s.textContent=e;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=N(t),o.appendChild(s),o.appendChild(i),n.appendChild(o),o}function A(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 o=document.createElement("div");o.className="csk-sources__header";const s=document.createElement("span");s.className="csk-sources__title",s.textContent=`📚 ${i("source_count",{n:e.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",o.appendChild(s),o.appendChild(a),o.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const c=document.createElement("div");c.className="csk-sources__body";for(const 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 o=[];n.sourceName&&o.push(n.sourceName),void 0!==n.chunkIndex&&o.push(`分块 #${n.chunkIndex}`),void 0!==n.score&&o.push(`相关度 ${(100*n.score).toFixed(0)}%`),r.textContent=o.join(" · "),e.appendChild(t),e.appendChild(r),c.appendChild(e)}r.appendChild(o),r.appendChild(c);const l=n.querySelector(".csk-msg__time");l?n.insertBefore(r,l):n.appendChild(r)}function F(n){n.scrollTop=n.scrollHeight}function N(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function L(n){return`csk_history_${n}`}function D(n,e){try{let t=e;t.length>200&&(t=t.slice(50),r.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const o={messages:t,updatedAt:Date.now()};localStorage.setItem(L(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?r.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):r.error("保存会话历史失败",n)}}function B(n){try{localStorage.removeItem(L(n))}catch(n){r.warn("清空会话历史失败",n)}}const M="\0CODEBLOCK_",z="\0INLINECODE_";function T(n){if(!n||"string"!=typeof n)return"";const e=[];let t=n;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(n,t,r)=>{const o=e.length,s=E(r.trimEnd()),i=t?` class="language-${E(t)}"`:"";return e.push(`
${s}
`),`${M}${o}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(n,e)=>{const t=r.length;return r.push(`${E(e)}`),`${z}${t}\0`}),t=E(t),t=q(t,M,e),t=q(t,z,r);const o=t.split("\n"),s=[];let i=!1,a="",c=!1,l=[];for(let n=0;n')){u(),p(),m(),s.push(e);continue}const t=e.match(/^(#{1,6})\s+(.+)/);if(t){u(),p(),m();const n=t[1].length;s.push(`${t[2]}`);continue}const r=e.match(/^>\s?(.*)/);if(r){u(),p(),c||(c=!0,s.push('
')),s.push(`

${d(r[1])}

`);continue}c&&m();const h=e.match(/^[\-\*]\s+(.+)/);if(h){u(),m(),i&&"ul"===a||(p(),i=!0,a="ul",s.push('
    ')),s.push(`
  • ${d(h[1])}
  • `);continue}const g=e.match(/^\d+\.\s+(.+)/);g?(u(),m(),i&&"ol"===a||(p(),i=!0,a="ol",s.push('
      ')),s.push(`
    1. ${d(g[1])}
    2. `)):""!==e.trim()?/^(\*{3,}|-{3,}|_{3,})$/.test(e.trim())?(u(),p(),m(),s.push('
      ')):(p(),m(),l.push(d(e))):(u(),p())}return u(),p(),m(),s.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 u(){l.length>0&&(s.push(`

      ${l.join("
      ")}

      `),l=[])}function p(){i&&(s.push("ul"===a?"
":""),i=!1,a="")}function m(){c&&(s.push("
"),c=!1)}}function q(n,e,t){return n.replace(new RegExp(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(n,e)=>t[parseInt(e)]||"")}let j,H=null,R=[],U=null,P=null,O=null,W=null,K=null,V=null,J=null,X=null,Y=!1,G=!1;function Q(n,e){H=n,U=e.messagesContainer,P=e.inputEl,O=e.sendBtn,W=e.clearBtn,K=e.categorySelect,V=e.historyPanel,J=e.showLoading,X=e.hideLoading,j=n.categoryId,G=!!n.categoryId||!!n.showCategorySwitch,function(){if(!P||!O)return;O.addEventListener("click",()=>en()),P.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),en())}),P.addEventListener("input",()=>nn()),W&&W.addEventListener("click",()=>function(){if(!H)return;if(!confirm(i("clear_confirm")))return;if(R=[],U){U.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove())}W&&(W.style.display="none");B(H.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}`}();e=n,a&&(a.chatId=e),b(H.integrateId,H.userId,n),r.lifecycleClear(H.integrateId),r.info(`新 chatId=${n}`);var e}())}(),n.showCategorySwitch&&K&&async function(){if(!K)return;try{const n=await async function(){const n=c("/category/tree");try{const e=await d(n);if(!e.ok)throw new u(p(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 u?r.error(`加载分类树失败: ${n.message}`):r.error("加载分类树失败",n),[]}}();if(0===n.length)return;K.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!==j&&String(r.id)===String(j)&&(n.selected=!0),K.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 Z(){if(H&&U&&(await f(),await async function(){if(!H||!U)return;const n=(null==a?void 0:a.chatId)||"";if(!n)return;try{const e=await async function(n){const e=c(`/conversation/${n}/messages`);try{const n=await d(e);if(!n.ok)throw new u(p(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}}}(n);e.messages.length>0&&(R=e.messages.map((n,e)=>({id:v(),role:"USER"===n.messageType?"user":"ai",content:n.content,timestamp:new Date(n.createTime).getTime()})),tn(),r.info(`从后端加载 ${R.length} 条历史消息`),D(H.integrateId,R))}catch(n){r.warn("从后端加载历史消息失败",n)}}(),0===R.length)){const n=function(n){try{const e=localStorage.getItem(L(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),[]}}(H.integrateId);n.length>0&&(R=n,tn(),r.info(`从本地缓存恢复 ${n.length} 条消息`))}}function nn(){if(!O||!P)return;P.value.trim().length>0&&!Y?O.removeAttribute("disabled"):O.setAttribute("disabled","true")}async function en(){if(!P||!H||Y)return;const n=P.value.trim();if(""===n)return;P.value="",nn(),P.style.height="auto",Y=!0,nn(),H.chatId||await f();const e=I();U&&$(U,n,e);const t={id:v(),role:"user",content:n,timestamp:e};R.push(t),W&&R.length>0&&(W.style.display="inline-flex"),U&&F(U),J&&J(),U&&F(U);try{let e;const t=I(),o=G&&(void 0!==j||void 0!==H.categoryId);e=H.streaming?await async function(n,e,t){return new Promise((r,o)=>{let s=null,a="",c=!1;h(n,n=>{if(a+=n,!c&&U){X&&X();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__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=N(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(U,e);s=n,c=!0}s&&(s.textContent=a),U&&F(U)},()=>{c||""!==a?(s&&a&&(s.innerHTML=T(a)),r(a)):m(n).then(r).catch(o)},n=>{a.length>0?(s&&(s.innerHTML=T(a+"\n\n"+i("stream_interrupted"))),r(a)):o(n)},j,t)})}(n,t,o):await m(n),X&&X(),!H.streaming&&U&&S(U,e,t,T);const s={id:v(),role:"ai",content:e,timestamp:t};R.push(s),D(H.integrateId,R),U&&F(U),o&&async function(n,e){try{const t=await g(n,j);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,U){const e=U.querySelector(".csk-msg--ai:last-of-type");e&&A(e,n)}H&&D(H.integrateId,R)}}catch(n){r.warn("获取引用来源失败",n)}}(n,s)}catch(n){X&&X();const e=n instanceof u?n.message:i("error_send");if(U){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),U.appendChild(n)}r.error(`发送失败 integrateId=${H.integrateId}`,n)}finally{Y=!1,nn()}}function tn(){if(!U)return;const n=U.querySelector(".csk-history-panel");U.querySelectorAll(".csk-msg, .csk-loading").forEach(n=>n.remove());for(const n of R)if("user"===n.role)$(U,n.content,n.timestamp);else{const e=S(U,n.content,n.timestamp,T);n.sources&&n.sources.length>0&&A(e,n.sources)}F(U),W&&R.length>0&&(W.style.display="inline-flex"),n&&!U.contains(n)&&U.appendChild(n)}async function rn(){if(!V||!H)return;const n=V.querySelector("#csk-history-list");if(n){n.innerHTML='
加载中...
';try{const e=await k(1,50,H.userId,H.integrateId);!function(n,e,t,r){if(n.innerHTML="",0===e.length){const e=document.createElement("div");return e.className="csk-history-panel__empty",e.innerHTML=`\n
💬
\n
${i("history_empty")}
\n `,void n.appendChild(e)}for(const o of e){const e=document.createElement("div");e.className="csk-history-item";const s=document.createElement("div");s.className="csk-history-item__info";const a=document.createElement("div");a.className="csk-history-item__id",a.textContent=o.chatId||o.id;const c=document.createElement("div");c.className="csk-history-item__meta";const l=[];void 0!==o.messageCount&&l.push(`${o.messageCount} 条消息`),o.lastMessageTime?l.push(o.lastMessageTime):o.createdAt&&l.push(o.createdAt),c.textContent=l.join(" · "),s.appendChild(a),s.appendChild(c);const d=document.createElement("div");d.className="csk-history-item__actions";const u=document.createElement("button");u.className="csk-history-action csk-history-action--export",u.setAttribute("title",i("history_export")),u.innerHTML='',u.addEventListener("click",n=>{n.stopPropagation(),t(o.id)});const p=document.createElement("button");p.className="csk-history-action csk-history-action--delete",p.setAttribute("title",i("history_delete")),p.innerHTML='',p.addEventListener("click",n=>{n.stopPropagation(),r(o.id)}),d.appendChild(u),d.appendChild(p),e.appendChild(s),e.appendChild(d),n.appendChild(e)}}(n,e.list.map(n=>({id:n.conversationId||n.chatId||"",chatId:n.conversationId||n.chatId||"",messageCount:n.messageCount,lastMessageTime:n.lastMessageTime,createdAt:n.firstMessageTime||n.createdAt})),n=>{window.open(c(`/conversation/${n}/export`),"_blank")},async n=>{if(!confirm(i("history_delete_confirm")))return;await async function(n){const e=c(`/conversation/${n}`);try{const t=await d(e,{method:"DELETE"});if(!t.ok)throw new u(p(t.status),`http_${t.status}`);const o=await t.json();return r.info(`删除会话 id=${n} success=${o.success}`),o.success||!1}catch(n){return r.error("删除会话失败",n),!1}}(n)&&rn()})}catch(e){r.error(i("history_load_error"),e),n.innerHTML=`
${i("history_load_error")}
`}}}let on=null,sn=!1,an=null,cn=null,ln=null,dn=null,un=null,pn=null,mn=null,hn=null,gn=null,kn=null,fn=null;function yn(){cn&&cn.classList.remove("csk-window--hidden")}function bn(){cn&&cn.classList.add("csk-window--hidden")}function xn(){cn&&(cn.classList.contains("csk-window--hidden")?(yn(),setTimeout(()=>{dn&&dn.focus()},100)):bn())}const _n={init:function(n){if(sn)return void r.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const t=function(n){var e,t,o,s,i,a;if(!n.integrateId||"string"!=typeof n.integrateId&&"number"!=typeof n.integrateId||"string"==typeof n.integrateId&&""===n.integrateId.trim())return r.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return r.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return r.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:String(n.integrateId).trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(t=n.width)&&void 0!==t?t:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'\n \n \n',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(s=n.showAdminPanel)&&void 0!==s&&s,streaming:null===(i=n.streaming)||void 0===i||i,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a,chatId:""};return r.info(`配置解析完成 integrateId(=roleId)=${c.integrateId} userId(=accountId)=${c.userId||"(未设置)"} requestDomain=${c.requestDomain}`),c}(n);if(!t)return;var c;on=t,function(n){if(o[n])s=n;else{const e=n.split("-")[0],t=Object.keys(o).find(n=>n.startsWith(e));t&&(s=t)}}(on.locale),c=on.debug,e=c,function(n){a=n}(on),w(on),an=C(on,xn),document.body.appendChild(an);const l=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const s=document.createElement("button");s.className="csk-history-btn",s.setAttribute("title",i("history_title")),s.innerHTML='';const a=document.createElement("button");a.className="csk-header__btn csk-header__btn--minimize",a.setAttribute("title",i("minimize")),a.innerHTML='',a.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const c=document.createElement("button");c.className="csk-header__btn csk-header__btn--close",c.setAttribute("title",i("close")),c.innerHTML='',c.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(s),o.appendChild(a),o.appendChild(c),t.appendChild(r),t.appendChild(o);const l=document.createElement("div");l.id="csk-messages",l.className="csk-messages";const d=document.createElement("div");d.className="csk-history-panel csk-history-panel--hidden",d.innerHTML=`\n
\n ${i("history_title")}\n \n
\n
\n `,l.appendChild(d);const u=d.querySelector("#csk-history-back");u&&u.addEventListener("click",()=>{d.classList.add("csk-history-panel--hidden")}),s.addEventListener("click",n=>{n.stopPropagation();const t=d.classList.contains("csk-history-panel--hidden");d.classList.toggle("csk-history-panel--hidden"),t&&e.dispatchEvent(new CustomEvent("csk:loadHistory"))});let p=null;if(n.showCategorySwitch){const n=document.createElement("div");n.className="csk-category-bar";const r=document.createElement("span");r.className="csk-category-bar__label",r.textContent="📚",p=document.createElement("select"),p.id="csk-category-select",p.className="csk-category-select",p.innerHTML=``,p.addEventListener("change",()=>{const n=p.value;e.dispatchEvent(new CustomEvent("csk:categoryChange",{detail:{categoryId:n?Number(n):void 0}}))}),n.appendChild(r),n.appendChild(p),e.appendChild(t),e.appendChild(l),e.appendChild(n)}else e.appendChild(t),e.appendChild(l);const m=document.createElement("div");m.className="csk-input-area";const h=document.createElement("textarea");h.id="csk-input",h.className="csk-input",h.setAttribute("placeholder",i("placeholder")),h.setAttribute("rows","1"),h.setAttribute("autofocus","");const g=document.createElement("button");g.id="csk-send-btn",g.className="csk-send-btn",g.setAttribute("title",i("send")),g.setAttribute("disabled","true"),g.innerHTML='',m.appendChild(h),m.appendChild(g),e.appendChild(m);let k=null;n.showClear&&(k=document.createElement("button"),k.className="csk-clear-btn",k.textContent=i("clear"),k.style.display="none",e.insertBefore(k,m));let f=null;return{window:e,messagesContainer:l,inputEl:h,sendBtn:g,clearBtn:k,categorySelect:p,historyPanel:d,showLoading:function(){if(f)return f.style.display="flex",f;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n
\n
\n
\n ',l.appendChild(n),f=n,n},hideLoading:function(){f&&f.parentNode&&(f.parentNode.removeChild(f),f=null)}}}(on);cn=l.window,ln=l.messagesContainer,dn=l.inputEl,un=l.sendBtn,pn=l.clearBtn,mn=l.categorySelect,hn=l.historyPanel,gn=l.showLoading,kn=l.hideLoading,document.body.appendChild(cn);const d=cn.querySelector(".csk-header");d&&(fn=function(n,e){let t=!1,r=0,o=0,s=0,i=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();s=r-a.left,i=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",l)},c=n=>{if(!t)return;const r=n.clientX-s,o=n.clientY-i,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},l=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l)}}(d,cn)),Q(on,{messagesContainer:ln,inputEl:dn,sendBtn:un,clearBtn:pn,categorySelect:mn,historyPanel:hn,showLoading:gn,hideLoading:kn}),cn.addEventListener("csk:categoryChange",n=>{var e;e=n.detail.categoryId,j=e,G=void 0!==e,r.lifecycleCategoryChange(null!=e?e:"全部")}),cn.addEventListener("csk:loadHistory",()=>{rn()}),sn=!0,r.lifecycleInit(on.integrateId,on.requestDomain),Z().catch(n=>{r.warn("chatId 初始化失败,将在发送消息时重试",n)})},destroy:function(){if(!sn)return;an&&an.parentNode&&(an.parentNode.removeChild(an),an=null),cn&&cn.parentNode&&(cn.parentNode.removeChild(cn),cn=null),fn&&(fn(),fn=null),x&&x.parentNode&&(x.parentNode.removeChild(x),x=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==on?void 0:on.integrateId;on=null,sn=!1,ln=null,dn=null,un=null,pn=null,mn=null,hn=null,gn=null,kn=null,r.lifecycleDestroy(n||"")},open:yn,close:bn,toggle:xn,clearHistory:function(){on&&(pn?pn.click():confirm("确定清空所有对话记录?")&&B(on.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=_n),_n}(); //# sourceMappingURL=chatbot-sdk.min.js.map diff --git a/src/main/resources/static/sdk/chatbot-sdk.min.js.map b/src/main/resources/static/sdk/chatbot-sdk.min.js.map index bba685b..c00e342 100644 --- a/src/main/resources/static/sdk/chatbot-sdk.min.js.map +++ b/src/main/resources/static/sdk/chatbot-sdk.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chatbot-sdk.min.js","sources":["../src/logger.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts","../src/config.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","debugEnabled","logger","info","msg","data","console","log","undefined","warn","error","currentConfig","buildUrl","path","Error","requestDomain","replace","startsWith","setIfPresent","params","key","value","trim","set","String","async","safeFetch","url","options","timeout","controller","AbortController","timer","setTimeout","abort","fetch","Object","assign","signal","mode","credentials","err","DOMException","name","CskError","TypeError","message","includes","clearTimeout","constructor","type","super","this","getHttpErrorMessage","status","chatRequest","URLSearchParams","integrateId","userId","roleId","categoryId","toString","buildChatUrl","startTime","Date","now","length","response","ok","errorMsg","text","duration","chatSSERequest","onChunk","onDone","onError","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","_a","body","getReader","decoder","TextDecoder","stream","buffer","done","read","decode","lines","split","pop","line","trimmed","substring","readErr","releaseLock","styleElement","cssVars","config","darker","hex","amount","match","clamp","v","Math","max","min","r","parseInt","g","b","padStart","adjustColor","primaryColor","width","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","crypto","randomUUID","c","random","createLauncher","onClick","launcher","id","className","position","title","innerHTML","launcherIcon","debouncedClick","fn","delay","args","apply","debounce","addEventListener","e","preventDefault","renderUserBubble","container","timestamp","wrapper","bubble","time","formatTime","renderAIBubble","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","clearMessages","localStorage","removeItem","messages","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn","isSending","initChat","cfg","dom","showLoading","hideLoading","handleSend","shiftKey","updateSendBtnState","confirm","style","display","handleClear","bindSendEvents","history","raw","getItem","JSON","parse","Array","isArray","loadMessages","role","content","renderHistory","removeAttribute","height","userTimestamp","userMsg","push","aiContent","aiTimestamp","streaming","Promise","resolve","reject","bubbleEl","wrapperEl","accumulated","streamStarted","chunk","createEmptyAIBubble","then","catch","sendStreamMessage","aiMsg","slice","updatedAt","setItem","stringify","saveMessages","errMsg","errorBubble","color","isInitialized","launcherEl","windowEl","dragCleanup","open","classList","remove","close","add","toggle","contains","focus","ChatbotSDK","init","rawConfig","parsed","URL","_g","showCategorySwitch","_b","showClear","_c","showAdminPanel","_d","_e","locale","debug","_f","parseConfig","enabled","setApiConfig","header","titleEl","actions","minimizeBtn","closeBtn","inputArea","insertBefore","loadingEl","window","el","parentNode","removeChild","createChatWindow","headerEl","dragging","startX","startY","offsetX","offsetY","onMouseDown","clientX","clientY","rect","getBoundingClientRect","left","top","onMouseMove","onMouseUp","x","y","maxX","innerWidth","offsetWidth","maxY","innerHeight","offsetHeight","right","bottom","removeEventListener","enableDrag","destroy","querySelectorAll","forEach","oldIntegrateId","clearHistory","click"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"chatbot-sdk.min.js","sources":["../src/logger.ts","../src/i18n.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/markdown.ts","../src/chat.ts","../src/index.ts","../src/config.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null],"names":["PREFIX","debugEnabled","timers","logger","info","msg","data","console","log","undefined","warn","error","time","label","Date","now","timeEnd","prefix","start","duration","lifecycleInit","integrateId","requestDomain","this","lifecycleDestroy","lifecycleSend","length","lifecycleReply","lifecycleError","status","message","lifecycleClear","lifecycleStreamDone","lifecycleCategoryChange","categoryId","dictionaries","title","minimize","close","placeholder","send","loading","stream_interrupted","stream_unstable","category_placeholder","category_all","category_load_error","source_title","source_count","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","error_auth","error_forbidden","error_not_found","error_rate_limit","error_unavailable","error_unknown","error_send","error_stream_unsupported","en","currentLocale","t","key","params","text","k","v","Object","entries","replace","String","currentConfig","buildUrl","path","Error","startsWith","setIfPresent","value","trim","set","async","safeFetch","url","options","timeout","controller","AbortController","timer","setTimeout","abort","fetch","assign","signal","mode","credentials","err","DOMException","name","CskError","TypeError","includes","clearTimeout","constructor","type","super","getHttpErrorMessage","chatRequest","URLSearchParams","chatId","userId","toString","buildChatUrl","response","ok","errorMsg","chatSSERequest","onChunk","onDone","onError","useRag","buildChatRAGSSEUrl","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","_a","body","getReader","decoder","TextDecoder","stream","buffer","done","read","decode","lines","split","pop","line","trimmed","substring","readErr","releaseLock","fetchRagSources","buildRagSourcesUrl","json","success","Array","isArray","fetchConversationList","page","size","accountId","roleId","encodeURIComponent","list","total","pages","initChatId","cachedChatId","localStorage","getItem","chatIdStorageKey","loadCachedChatId","result","latestConv","conversationId","saveCachedChatId","messageCount","newChatId","random","crypto","randomUUID","Math","generateChatId","setItem","removeItem","styleElement","cssVars","config","darker","hex","amount","match","clamp","max","min","r","parseInt","g","b","padStart","adjustColor","primaryColor","width","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","c","escapeHtml","map","ch","createLauncher","onClick","launcher","id","className","position","innerHTML","launcherIcon","debouncedClick","fn","delay","args","apply","debounce","addEventListener","e","preventDefault","renderUserBubble","container","timestamp","wrapper","bubble","formatTime","renderAIBubble","renderMd","renderSources","sources","existing","remove","sourcesEl","header","titleSpan","n","arrow","classList","toggle","src","item","sourceName","snippet","meta","metaParts","push","chunkIndex","score","toFixed","join","timeEl","insertBefore","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","saveMessages","messages","slice","updatedAt","JSON","stringify","clearMessages","CODE_BLOCK_PREFIX","INLINE_CODE_PREFIX","renderMarkdown","codeBlocks","processed","_match","lang","code","idx","escapedCode","trimEnd","langClass","inlineCodes","restorePlaceholders","inList","listType","inBlockquote","paragraphBuffer","i","flushParagraph","closeList","closeBlockquote","headingMatch","level","quoteMatch","inlineFormat","ulMatch","olMatch","test","_m","linkText","replacements","RegExp","currentCategoryId","messagesContainer","inputEl","sendBtn","clearBtn","categorySelect","historyPanel","showLoadingFn","hideLoadingFn","isSending","initChat","cfg","dom","showLoading","hideLoading","showCategorySwitch","handleSend","shiftKey","updateSendBtnState","confirm","querySelectorAll","forEach","el","style","display","newId","generateNewChatId","handleClear","bindSendEvents","tree","fetchCategoryTree","addOptions","nodes","indent","node","option","repeat","selected","children","loadCategories","initChatHistory","fetchConversationMessages","role","messageType","content","createTime","getTime","renderHistory","loadHistoryFromBackend","cached","raw","parse","loadMessages","removeAttribute","height","userTimestamp","userMsg","aiContent","aiTimestamp","shouldUseRag","streaming","Promise","resolve","reject","bubbleEl","accumulated","streamStarted","chunk","createEmptyAIBubble","then","catch","sendStreamMessage","aiMsg","ragSources","s","documentId","_b","lastAiMsg","fetchAndRenderSources","errMsg","errorBubble","color","historyPanelEl","contains","loadHistoryConversations","listEl","items","onExport","onDelete","empty","idEl","metaEl","lastMessageTime","createdAt","actionsEl","exportBtn","stopPropagation","deleteBtn","renderHistoryList","firstMessageTime","window","open","method","deleteConversation","isInitialized","launcherEl","windowEl","dragCleanup","add","focus","ChatbotSDK","init","rawConfig","parsed","URL","_g","showClear","_c","showAdminPanel","_d","_e","locale","debug","_f","parseConfig","enabled","matched","keys","find","setLocale","setApiConfig","titleEl","actions","historyBtn","minimizeBtn","closeBtn","backBtn","isHidden","dispatchEvent","CustomEvent","categoryBar","categoryLabel","selectedId","detail","Number","inputArea","loadingEl","parentNode","removeChild","createChatWindow","headerEl","dragging","startX","startY","offsetX","offsetY","onMouseDown","clientX","clientY","rect","getBoundingClientRect","left","top","onMouseMove","onMouseUp","x","y","maxX","innerWidth","offsetWidth","maxY","innerHeight","offsetHeight","right","bottom","removeEventListener","enableDrag","destroy","oldIntegrateId","clearHistory","click"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/sdk/test.html b/src/main/resources/static/sdk/test.html index 91b8688..72fc6c2 100644 --- a/src/main/resources/static/sdk/test.html +++ b/src/main/resources/static/sdk/test.html @@ -8,22 +8,19 @@ *{margin:0;padding:0;box-sizing:border-box} body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans SC",sans-serif;background:#F0F2F5;min-height:100vh} .page{display:flex;height:100vh} -/* 左侧面板 */ -.panel{width:360px;min-width:360px;background:#fff;border-right:1px solid #E5E7EB;display:flex;flex-direction:column;overflow:hidden} +.panel{width:380px;min-width:380px;background:#fff;border-right:1px solid #E5E7EB;display:flex;flex-direction:column;overflow:hidden} .panel-header{padding:20px;border-bottom:1px solid #F3F4F6} .panel-header h1{font-size:20px;color:#111827;margin-bottom:4px} .panel-header p{font-size:12px;color:#9CA3AF} .panel-body{flex:1;overflow-y:auto;padding:20px} .panel-body::-webkit-scrollbar{width:4px} .panel-body::-webkit-scrollbar-thumb{background:#E5E7EB;border-radius:2px} -/* 表单 */ .fg{margin-bottom:14px} .fg label{display:block;font-size:12px;font-weight:500;color:#374151;margin-bottom:4px} .fg input,.fg select{width:100%;padding:8px 10px;border:1px solid #D1D5DB;border-radius:6px;font-size:13px;outline:none;transition:border-color .2s,box-shadow .2s;font-family:inherit} .fg input:focus,.fg select:focus{border-color:#4F46E5;box-shadow:0 0 0 3px rgba(79,70,229,.1)} .fg-row{display:grid;grid-template-columns:1fr 1fr;gap:10px} .fg .hint{font-size:11px;color:#9CA3AF;margin-top:3px} -/* 按钮 */ .btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:10px 18px;border:none;border-radius:8px;font-size:13px;font-weight:500;cursor:pointer;transition:all .2s;font-family:inherit} .btn-primary{background:#4F46E5;color:#fff}.btn-primary:hover{background:#4338CA} .btn-danger{background:#FFF1F0;color:#CF1322}.btn-danger:hover{background:#FFE4E0} @@ -32,66 +29,78 @@ body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans S .btn-full{width:100%} .actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px} .divider{border:none;border-top:1px solid #F3F4F6;margin:16px 0} -/* 右侧 */ .main{flex:1;display:flex;flex-direction:column;overflow:hidden} .toolbar{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:#fff;border-bottom:1px solid #E5E7EB} .toolbar h2{font-size:15px;font-weight:600;color:#111827} -/* 用例区 */ +.toolbar-tabs{display:flex;gap:4px} +.toolbar-tab{padding:6px 14px;border:1px solid #E5E7EB;border-radius:6px;background:#fff;color:#6B7280;font-size:12px;cursor:pointer;transition:all .2s} +.toolbar-tab--active{background:#4F46E5;color:#fff;border-color:#4F46E5} +.toolbar-tab:hover:not(.toolbar-tab--active){background:#F9FAFB} .cases{flex:1;overflow-y:auto;padding:20px} .cases::-webkit-scrollbar{width:4px} .cases::-webkit-scrollbar-thumb{background:#E5E7EB;border-radius:2px} .case{background:#fff;border:1px solid #E5E7EB;border-radius:10px;margin-bottom:14px;overflow:hidden} .case-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#FAFBFC;border-bottom:1px solid #F3F4F6} .case-title{font-size:13px;font-weight:600;color:#111827} +.case-badge{font-size:10px;font-weight:600;padding:2px 6px;border-radius:4px;margin-left:8px} +.badge-p0{background:#DBEAFE;color:#1D4ED8} +.badge-p1{background:#FEF3C7;color:#92400E} +.badge-p2{background:#F3E8FF;color:#7C3AED} .case-body{padding:16px} .case-desc{font-size:12px;color:#6B7280;margin-bottom:10px;line-height:1.5} -/* 日志 */ .logs{background:#1F2937;color:#D1D5DB;font-size:12px;line-height:1.7;padding:14px;border-radius:6px;max-height:260px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;font-family:'SF Mono','Consolas','Menlo',monospace} .logs::-webkit-scrollbar{width:4px} .logs::-webkit-scrollbar-thumb{background:#4B5563;border-radius:2px} .log-line--pass{color:#6EE7B7}.log-line--fail{color:#FCA5A5}.log-line--info{color:#93C5FD}.log-line--warn{color:#FCD34D} -/* 状态标签 */ .tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;padding:3px 10px;border-radius:12px} .tag--idle{background:#F3F4F6;color:#6B7280} .tag--running{background:#DBEAFE;color:#1D4ED8} .tag--pass{background:#D1FAE5;color:#065F46} .tag--fail{background:#FEE2E2;color:#991B1B} -/* 概览 */ -.overview{display:grid;grid-template-columns:1fr 1fr 1fr 1fr 1fr;gap:10px;margin-bottom:16px} +.overview{display:grid;grid-template-columns:1fr 1fr 1fr 1fr 1fr 1fr;gap:10px;margin-bottom:16px} .card-stat{background:#fff;border:1px solid #E5E7EB;border-radius:8px;padding:14px;text-align:center} .card-stat .num{font-size:28px;font-weight:700} .card-stat .lbl{font-size:11px;color:#6B7280;margin-top:2px} .num--ok{color:#059669}.num--err{color:#DC2626}.num--total{color:#4F46E5} -/* 底部 */ .footer{padding:10px 20px;background:#fff;border-top:1px solid #E5E7EB;display:flex;align-items:center;justify-content:space-between;font-size:11px;color:#9CA3AF} +.mapping-note{background:#FFFBEB;border:1px solid #FDE68A;border-radius:8px;padding:10px 14px;margin-bottom:14px;font-size:11px;color:#92400E;line-height:1.6} +.mapping-note b{color:#78350F}
-

🧪 ChatbotSDK 测试面板

-

P0 核心链路 · 交互式验证

+

P0 核心 · P1 体验增强 · P2 运营完善

-
⭕ SDK 未加载 ⭕ API 未测
+ +
+ 📋 参数映射(SDK → 后端)
+ integrateId → roleId(客服角色 ID)
+ userId → accountId(客户账号 ID)
+ chatId → 自动管理(从 /conversation/list 获取或自动生成) +
+
- - + + +
对应后端 AiController 的 roleId 参数
- - + + +
对应后端 AiController 的 accountId 参数
@@ -118,6 +127,16 @@ body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans S
+
+ + +
+
+
+
+ + +
@@ -140,585 +159,199 @@ body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans S
💡 操作提示
- 1. 点击「初始化 SDK」→ 右下角出现悬浮按钮
- 2. 点击悬浮按钮 → 打开聊天弹窗
- 3. 在弹窗里输入问题 → 回车发送
- 4. 观察 AI 回复(流式/同步)
- 5. 等待 30s 后刷新页面 → 历史恢复 + 1. integrateId 填写客服角色 ID(数字,对应后端 roleId)
+ 2. userId 填写客户账号 ID(对应后端 accountId)
+ 3. chatId 自动管理:从 /conversation/list 获取或自动生成
+ 4. 对话历史从后端加载(点击头部时钟图标查看)
+ 5. AI 回复支持 Markdown 渲染
+ 6. 开启 showCategorySwitch 可选择知识库分类
-

📋 测试用例

- +
+
+ + + + +
+ +
- -
-
12
总用例数
+
22
总用例数
0
通过
0
失败
0
API 调用
-
平均延迟
+
0
跳过
- -
- -
- +
-