diff --git a/CLAUDE.md b/CLAUDE.md index 11c1208..09aab59 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -174,6 +174,25 @@ catch (e) { toast('操作失败', 'error') } - 消息反馈: `/feedback/*`(`MessageFeedbackController`) - 敏感词管理: `/sensitive-word/*`(`SensitiveWordController`) - FAQ 管理: `/faq/*`(`FaqController`) +- SDK 认证: `/open-api/auth/*`(`AuthController`,Token 换取) +- API Key 角色绑定: `/api-key/{id}/roles`(`ApiKeyController`,admin 角色) + +### Filter 优先级 + +| 优先级 | Filter | 路径 | 说明 | +|--------|--------|------|------| +| `HIGHEST + 1` | `SdkAuthFilter` | `/ai/**` | SDK JWT 鉴权 | +| `HIGHEST + 2` | `ApiKeyAuthFilter` | `/open-api/**` | API Key 鉴权 | +| SecurityFilterChain 内 | `JwtAuthFilter` | 管理接口 | 管理后台 JWT | + +### SDK 鉴权架构 + +采用两段式鉴权:客户端后端用 API Key 换取短期 JWT Token → SDK 携带 Token 请求 `/ai/**` → SdkAuthFilter 校验放行。SDK JWT 密钥独立于管理后台 JWT(`jwt.sdk-secret`)。 + +- API Key 支持绑定客服角色列表(`role_ids` JSONB 字段),Token 换取时优先返回绑定的角色 +- 未绑定角色的 API Key 返回所有启用角色(向后兼容) +- JWT Token 中 `sub` 为 apiKeyId,`rids` 为允许的角色 ID 列表 +- 第三方系统接入指南详见 `SDK-INTEGRATION.md` ## P0 阶段新增功能 diff --git a/SDK-INTEGRATION.md b/SDK-INTEGRATION.md new file mode 100644 index 0000000..8243cf8 --- /dev/null +++ b/SDK-INTEGRATION.md @@ -0,0 +1,472 @@ +# Chat SDK 第三方系统集成指南 + +> 本文档说明第三方系统如何接入 AI 智能客服的 Chat SDK,完成从创建 API Key 到嵌入对话组件的全流程。 + +--- + +## 目录 + +1. [集成架构总览](#1-集成架构总览) +2. [第一步:创建 API Key](#2-第一步创建-api-key) +3. [第二步:绑定客服角色(可选)](#3-第二步绑定客服角色可选) +4. [第三步:后端换取 SDK Token](#4-第三步后端换取-sdk-token) +5. [第四步:前端嵌入 Chat SDK](#5-第四步前端嵌入-chat-sdk) + - [5.5 角色切换](#55-角色切换) +6. [API 接口参考](#6-api-接口参考) +7. [SDK 配置参数参考](#7-sdk-配置参数参考) +8. [错误码与排查](#8-错误码与排查) +9. [安全建议](#9-安全建议) + +--- + +## 1. 集成架构总览 + +``` +┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐ +│ 第三方前端 │ │ 第三方后端 │ │ AI 客服后端 │ +│ (嵌入 SDK) │ │ (你的服务) │ │ (本系统) │ +│ │ │ │ │ │ +│ Chat SDK ──────┼─────┼──────────────────┼─────┼─► /ai/** 对话 │ +│ ↑ token │ │ │ │ │ +│ │ │ ① 携带 API Key │ │ ② 返回 JWT Token│ +│ │ │ POST /open-api/ │─────┼─► /auth/token │ +│ │ │ auth/token │ │ │ +└─────────────────┘ └──────────────────┘ └──────────────────┘ +``` + +**两段式鉴权流程:** + +1. **管理后台**:管理员创建 API Key,可选绑定客服角色 +2. **第三方后端**:用 API Key 换取短期 JWT Token + 可用角色列表 +3. **第三方前端**:Chat SDK 携带 JWT Token 请求 `/ai/**` 接口进行对话 + +--- + +## 2. 第一步:创建 API Key + +在管理后台「系统设置 → API Key 管理」页面创建。 + +### 管理后台操作 + +1. 登录管理后台 `http://localhost:9090/index.html` +2. 进入「系统设置 → API Key 管理」 +3. 点击「+ 新建 API Key」 +4. 填写名称、描述、频率限制等参数 +5. **(可选)** 在创建弹窗中勾选需要绑定的客服角色 +6. 创建后**立即复制保存 Key**,关闭后无法再次查看 + +### API Key 格式 + +``` +sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(sk_ 前缀 + 32 位 UUID) +``` + +--- + +## 3. 第二步:绑定客服角色(可选) + +客服角色决定 AI 的人设、知识库范围和 MCP 工具权限。 + +### 角色绑定规则 + +| role_ids 状态 | Token 换取行为 | +|---|---| +| 空数组 `[]`(默认) | 返回**所有**启用的客服角色(向后兼容) | +| 非空 `[1, 2, 3]` | 仅返回绑定的角色 | + +### 通过管理后台绑定 + +在 API Key 列表中点击「绑定角色」按钮,勾选需要的角色后保存。 + +### 通过 API 绑定 + +```bash +PUT /api-key/{keyId}/roles +Content-Type: application/json +Authorization: Bearer {管理后台 JWT Token} + +{ + "roleIds": [1, 2, 3] +} +``` + +响应: + +```json +{ + "success": true, + "message": "角色绑定更新成功" +} +``` + +--- + +## 4. 第三步:后端换取 SDK Token + +**⚠️ 重要:Token 换取必须在第三方后端完成,不可在前端暴露 API Key。** + +### 请求 + +```bash +POST /open-api/auth/token +Content-Type: application/json +X-API-Key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +{ + "ttl": 7200 +} +``` + +| 参数 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `X-API-Key` | Header | 是 | 创建的 API Key | +| `ttl` | Body | 否 | Token 有效期(秒),默认 7200(2 小时),范围 [300, 86400] | + +### 成功响应 + +```json +{ + "success": true, + "token": "eyJhbGciOiJIUzI1NiJ9...", + "expiresIn": 7200, + "roles": [ + { "id": "1", "key": "general", "name": "通用客服" }, + { "id": "2", "key": "finance", "name": "财务顾问" } + ] +} +``` + +| 字段 | 说明 | +|---|---| +| `token` | SDK JWT Token,传给前端使用 | +| `expiresIn` | 过期时间(秒) | +| `roles` | 可用客服角色列表,前端用于展示角色选择器 | + +### 错误响应 + +| HTTP 状态码 | 说明 | +|---|---| +| 401 | API Key 无效或已禁用 | +| 403 | 无可用客服角色 | + +--- + +## 5. 第四步:前端嵌入 Chat SDK + +### 使用测试面板快速验证 + +访问 `http://localhost:9090/sdk/test.html` 打开测试面板: + +1. 在「🔐 SDK Token 鉴权」区域输入 API Key +2. 点击「获取 Token」按钮自动换取(或手动粘贴已有的 Token) +3. Token 获取成功后,integrateId 会自动填充为第一个可用角色 +4. 点击「🚀 初始化 SDK」即可测试对话功能 + +测试面板支持所有 P0/P1/P2 测试用例的自动化运行,包括 API 连通性验证。 + +### 5.1 引入 SDK + +```html + +``` + +### 5.2 初始化 + +```javascript +const chatbot = ChatbotSDK.init({ + // ========== 必填参数 ========== + integrateId: '1', // 客服角色 ID(从 Token 换取接口的 roles 中选择) + requestDomain: 'https://your-domain.com', // AI 客服后端域名 + + // ========== 鉴权参数(推荐) ========== + token: 'eyJhbGciOiJIUzI1NiJ9...', // 后端换取的 SDK Token + roles: [ // 可用角色列表(传多个时 SDK header 显示角色切换下拉框) + { id: '1', key: 'general', name: '通用客服' }, + { id: '2', key: 'finance', name: '财务顾问' } + ], + + // ========== 可选参数 ========== + userId: 'user_12345', // 用户标识(用于会话隔离) + title: 'AI 智能助手', // 对话窗口标题 + theme: 'light', // 主题:light / dark + primaryColor: '#4F46E5', // 主题色(十六进制) + streaming: true, // 启用流式回复(默认 true) + enableRag: true, // 启用 RAG 知识库检索(默认 true) + quickReplies: ['如何退款?', '联系人工客服'], // 快捷问题 + position: 'right-bottom', // 悬浮按钮位置:right-bottom / left-bottom + width: 380, // 窗口宽度(px) + height: 520, // 窗口高度(px) + debug: true, // 控制台调试日志 + + // ========== 回调函数 ========== + onReady: function() { console.log('SDK 就绪'); }, + onMessage: function(msg) { console.log('收到消息', msg); }, + onError: function(err) { console.error('SDK 错误', err); } +}); +``` + +### 5.3 SDK 方法 + +```javascript +// 销毁实例(移除 DOM 和事件监听) +chatbot.destroy(); +``` + +### 5.4 不使用 Token 的兼容模式 + +如果暂时不接入后端 Token 换取,可直接使用兼容模式(**不推荐用于生产环境**): + +```javascript +ChatbotSDK.init({ + integrateId: '1', // 直接指定角色 ID + requestDomain: 'https://your-domain.com' + // 不传 token 和 roles +}); +``` + +兼容模式下,`integrateId` 直接作为 `roleId` 传递给后端,无需 Token 换取步骤。由于不传 `roles`,SDK 不会显示角色选择器,用户只能使用初始指定的单一角色。 + +### 5.5 角色切换 + +当 `roles` 数组长度 > 1 时,SDK 会在聊天窗口头部自动显示角色选择下拉框,用户可随时切换当前使用的客服角色。 + +**触发条件:** +- `ChatbotSDK.init()` 时传入的 `roles` 数组包含 2 个及以上角色 + +**切换行为:** +1. 自动保存当前对话到 localStorage(与旧角色关联) +2. 清空当前消息列表 +3. 生成新的 `chatId`(与新角色关联) +4. 尝试从 localStorage 恢复新角色的缓存消息 +5. 异步从后端加载新角色的历史会话 + +**示例:** + +```javascript +// 1. 后端换取 Token,获取可用角色列表 +const data = await fetch('/api/chatbot/token').then(r => r.json()); + +// 2. 初始化 SDK,传入角色列表 +ChatbotSDK.init({ + integrateId: data.roles[0].id, // 默认使用第一个角色 + requestDomain: 'https://your-domain.com', + token: data.token, + roles: data.roles, // 传入多个角色 → header 显示角色选择器 + userId: 'current_user_id' +}); +``` + +**安全说明:** +- 角色切换由 SDK 前端发起,后端 `SdkAuthFilter` 会校验 JWT Token 中的 `rids` claim,确保用户只能切换到被授权的角色 +- 切换角色不需要重新换取 Token,JWT 中已包含允许的角色 ID 列表 + +--- + +## 6. API 接口参考 + +### 6.1 Token 换取 + +``` +POST /open-api/auth/token +``` + +详见 [第三步:后端换取 SDK Token](#4-第三步后端换取-sdk-token)。 + +### 6.2 对话接口(SDK 内部调用,无需手动对接) + +| 接口 | 方法 | 说明 | +|---|---|---| +| `/ai/assistant_app/chat/sync` | GET | 同步对话(返回完整文本) | +| `/ai/assistant_app/chat/sse` | GET | SSE 流式对话 | +| `/ai/assistant_app/chat/rag/sse` | GET | RAG 增强流式对话 | +| `/ai/assistant_app/rag/sources` | GET | 获取 RAG 引用来源 | +| `/ai/sdk/conversation/list` | GET | 会话列表 | +| `/ai/sdk/conversation/{id}/messages` | GET | 会话消息 | +| `/ai/sdk/conversation/{id}` | DELETE | 删除会话 | +| `/ai/sdk/conversation/{id}/export` | GET | 导出会话 | +| `/category/tree` | GET | 知识库分类树 | +| `/feedback` | POST | 消息反馈 | + +**通用请求参数(对话接口):** + +| 参数 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `message` | Query | 是 | 用户消息 | +| `chatId` | Query | 是 | 会话 ID(SDK 自动管理) | +| `roleId` | Query | 否 | 客服角色 ID | +| `accountId` | Query | 否 | 用户标识 | +| `categoryId` | Query | 否 | 知识库分类 ID | +| `rewriteStrategy` | Query | 否 | RAG 查询重写策略:REWRITE / TRANSLATION / COMPRESSION / MULTI_QUERY | + +**认证方式:** 所有 `/ai/**` 请求自动在 Header 中携带 `Authorization: Bearer {token}`。 + +### 6.3 管理接口(需要管理后台 JWT) + +| 接口 | 方法 | 说明 | +|---|---|---| +| `/api-key/list` | GET | API Key 列表(admin) | +| `/api-key` | POST | 创建 API Key(admin) | +| `/api-key/{id}/revoke` | PUT | 吊销 API Key(admin) | +| `/api-key/{id}/enable` | PUT | 启用 API Key(admin) | +| `/api-key/{id}` | DELETE | 删除 API Key(admin) | +| `/api-key/{id}/roles` | PUT | 更新角色绑定(admin) | +| `/role/list` | GET | 客服角色列表(admin) | +| `/role/all` | GET | 全部角色含停用(admin) | + +--- + +## 7. SDK 配置参数参考 + +| 参数 | 类型 | 默认值 | 说明 | +|---|---|---|---| +| `integrateId` | String/Number | **必填** | 客服角色 ID | +| `requestDomain` | String | **必填** | 后端域名 | +| `token` | String | - | SDK JWT Token(推荐) | +| `roles` | Array | - | 角色列表 `[{id, key, name}]`,长度 > 1 时 header 显示切换下拉框 | +| `userId` | String | - | 用户标识(会话隔离) | +| `categoryId` | String | - | 默认知识库分类 ID | +| `showCategorySwitch` | Boolean | false | 显示分类切换器 | +| `title` | String | 'AI 智能助手' | 窗口标题 | +| `width` | Number | 380 | 窗口宽度(px) | +| `height` | Number | 520 | 窗口高度(px,最小 300) | +| `position` | String | 'right-bottom' | 悬浮按钮位置 | +| `primaryColor` | String | '#4F46E5' | 主题色 | +| `launcherTheme` | String | - | 按钮主题:dream-purple / mint-tech / coral-peach / sky-blue | +| `launcherIcon` | String | (内置) | 自定义悬浮按钮 SVG | +| `theme` | String | 'light' | 界面主题:light / dark | +| `streaming` | Boolean | true | 流式回复 | +| `enableRag` | Boolean | true | RAG 知识库检索 | +| `rewriteStrategy` | String | 'REWRITE' | 查询重写策略 | +| `quickReplies` | String[] | [] | 快捷问题列表 | +| `showClear` | Boolean | true | 显示清空按钮 | +| `showAdminPanel` | Boolean | false | 显示管理入口 | +| `showTeaser` | Boolean | true | 显示提示气泡 | +| `teaserText` | String | '' | 提示气泡文本 | +| `sound` | Boolean | false | 消息提示音 | +| `notification` | Boolean | false | 浏览器通知 | +| `locale` | String | 'zh-CN' | 语言:zh-CN / en | +| `debug` | Boolean | true | 调试日志 | +| `onReady` | Function | - | SDK 就绪回调 | +| `onMessage` | Function | - | 消息回调 | +| `onError` | Function | - | 错误回调 | + +--- + +## 8. 错误码与排查 + +### Token 换取阶段 + +| 错误 | 原因 | 解决方案 | +|---|---|---| +| 401 `API Key 鉴权失败` | X-API-Key 无效或缺失 | 检查 Header 是否正确携带 | +| 401 `API Key 已被禁用` | Key 被吊销 | 在管理后台重新启用或创建新 Key | +| 401 `API Key 已过期` | Key 超过有效期 | 创建新的 API Key | +| 403 `无可用客服角色` | 未绑定角色且系统无启用角色 | 在管理后台创建并启用客服角色 | + +### SDK 对话阶段 + +| HTTP 状态码 | SDK 提示 | 原因 | +|---|---|---| +| 401 | 鉴权失败 | Token 过期或无效,需重新换取 | +| 403 | 无访问权限 | roleId 不在 Token 允许范围内 | +| 429 | 请求过于频繁 | 超过 API Key 频率限制 | +| 500 | 服务器异常 | 后端错误,查看服务端日志 | +| 502/503 | 服务暂不可用 | 后端未启动或正在部署 | + +### 常见问题 + +**Q: Token 过期后怎么办?** +A: Token 默认 2 小时过期。建议在第三方后端实现 Token 缓存和自动刷新逻辑:检测到 401 时重新调用 `/open-api/auth/token` 换取新 Token。 + +**Q: 如何让用户只能使用特定角色?** +A: 在 API Key 上绑定角色(`PUT /api-key/{id}/roles`),SDK 初始化时只传入绑定的角色 ID。 + +**Q: 多个第三方系统可以用同一个 API Key 吗?** +A: 可以,但建议每个系统使用独立的 API Key,便于独立管控频率限制和角色权限。 + +--- + +## 9. 安全建议 + +1. **API Key 仅在后端使用**:永远不要将 API Key 暴露到前端代码中 +2. **Token 短有效期**:生产环境建议 TTL 设为 1-2 小时,配合自动刷新 +3. **角色最小权限**:只绑定必要的客服角色,避免授予过多权限 +4. **频率限制**:根据业务量设置合理的 rateLimit(默认 60 次/分钟) +5. **HTTPS**:生产环境必须使用 HTTPS,防止 Token 被中间人截获 +6. **定期轮换 Key**:定期吊销旧 Key 并创建新 Key + +--- + +## 附录:完整对接示例(Node.js) + +```javascript +// ==================== 第三方后端示例 ==================== +const express = require('express'); +const app = express(); + +const AI_DOMAIN = 'https://your-ai-domain.com'; +const API_KEY = 'sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; + +// Token 缓存 +let cachedToken = null; +let tokenExpireAt = 0; + +// 换取 Token(带缓存) +async function getSdkToken() { + if (cachedToken && Date.now() < tokenExpireAt) { + return cachedToken; + } + + const res = await fetch(`${AI_DOMAIN}/open-api/auth/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': API_KEY + }, + body: JSON.stringify({ ttl: 7200 }) + }); + + const data = await res.json(); + if (!data.success) throw new Error(data.message); + + cachedToken = data.token; + tokenExpireAt = Date.now() + (data.expiresIn - 300) * 1000; // 提前 5 分钟刷新 + return { token: data.token, roles: data.roles }; +} + +// 给前端提供 Token +app.get('/api/chatbot/token', async (req, res) => { + try { + const data = await getSdkToken(); + res.json({ success: true, ...data }); + } catch (e) { + res.status(500).json({ success: false, message: e.message }); + } +}); + +app.listen(3000); +``` + +```html + + + +``` diff --git a/client/README.md b/client/README.md index 2cb55be..06f65af 100644 --- a/client/README.md +++ b/client/README.md @@ -85,7 +85,7 @@ SDK 产物位于 `client/dist/` 目录: | `width` | `number` | ❌ | `380` | P0 | 弹窗宽度(px) | | `position` | `string` | ❌ | `"right-bottom"` | P0 | 悬浮按钮位置 | | `primaryColor` | `string` | ❌ | `"#4F46E5"` | P0 | 主色调 | -| `launcherIcon` | `string` | ❌ | SVG 图标 | P0 | 悬浮按钮图标 | +| `launcherIcon` | `string` | ❌ | 极光粒子图标 | P0 | 悬浮按钮图标(可传 URL 或 SVG 字符串),默认使用极光粒子动画图标 | | `showClear` | `boolean` | ❌ | `true` | P0 | 是否显示清空按钮 | | `quickReplies` | `string[]` | ❌ | `[]` | P1 | 欢迎态快捷问题芯片,点击即自动发送 | | `theme` | `string` | ❌ | `"light"` | P2 | 主题模式:`"light"` / `"dark"` | diff --git a/client/dist/chatbot-sdk.js b/client/dist/chatbot-sdk.js index 64a87ea..76466c6 100644 --- a/client/dist/chatbot-sdk.js +++ b/client/dist/chatbot-sdk.js @@ -96,97 +96,13 @@ var ChatbotSDK = (function () { }, }; - /** 默认悬浮按钮 SVG 图标(赛博机器人:对话气泡 + 机器人面孔 + 天线能量灯 + 眨眼动效) */ - const DEFAULT_LAUNCHER_ICON = ` - - - - - - - - - - - - - - - -`; - // ==================== 马卡龙色系玻璃质感图标 ==================== - /** - * 生成玻璃质感机器人 SVG 图标 - * 包含:圆润机器人头部 + 眨眼动效 + 跳动气泡 + 高光反射层 - */ - function buildGlassIcon(eyeColor, smileColor, bubbleColor) { - return ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; - } - /** 梦幻紫粉主题图标 */ - const GLASS_ICON_DREAM_PURPLE = buildGlassIcon('rgba(139,92,246,0.6)', // 眼睛:紫色 - 'rgba(139,92,246,0.45)', // 微笑 - 'rgba(240,171,252,0.85)' // 气泡:粉紫 - ); - /** 薄荷青绿主题图标 */ - const GLASS_ICON_MINT_TECH = buildGlassIcon('rgba(16,185,129,0.6)', // 眼睛:翠绿 - 'rgba(16,185,129,0.45)', // 微笑 - 'rgba(110,231,183,0.85)' // 气泡:薄荷 - ); - /** 珊瑚蜜桃主题图标 */ - const GLASS_ICON_CORAL_PEACH = buildGlassIcon('rgba(244,63,94,0.55)', // 眼睛:珊瑚红 - 'rgba(244,63,94,0.4)', // 微笑 - 'rgba(253,186,116,0.85)' // 气泡:蜜桃 - ); - /** 天空蓝紫主题图标 */ - const GLASS_ICON_SKY_BLUE = buildGlassIcon('rgba(56,189,248,0.6)', // 眼睛:天蓝 - 'rgba(56,189,248,0.45)', // 微笑 - 'rgba(167,139,250,0.85)' // 气泡:淡紫 - ); - /** 主题 → 默认主色映射(当用户未指定 primaryColor 时自动使用) */ - const THEME_PRIMARY_COLORS = { - 'dream-purple': '#A78BFA', - 'mint-tech': '#34D399', - 'coral-peach': '#FB7185', - 'sky-blue': '#7DD3FC', - }; + /** 默认悬浮按钮图标 — E5 梦幻拖尾·全粒子:极光旋转渐变底 + 20 颗粒子系统 */ + const DEFAULT_LAUNCHER_ICON = ``; /** * 解析并校验用户传入的配置,填充默认值 */ function parseConfig(raw) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; // 校验必传参数:integrateId(对应后端 roleId) if (!raw.integrateId || (typeof raw.integrateId !== 'string' && typeof raw.integrateId !== 'number') || (typeof raw.integrateId === 'string' && raw.integrateId.trim() === '')) { @@ -202,30 +118,15 @@ var ChatbotSDK = (function () { try { new URL(raw.requestDomain); } - catch (_m) { + catch (_o) { logger.error(`requestDomain 不是合法的 URL 格式:${raw.requestDomain}。请提供完整的域名,如 https://api.example.com`); return null; } // integrateId 统一转为字符串(后端 roleId 为 Long,但 query param 传字符串也可接收) const integrateIdStr = String(raw.integrateId).trim(); - // 解析 launcherTheme:根据主题自动选择图标和默认主色 - const launcherTheme = raw.launcherTheme || undefined; - let resolvedLauncherIcon = raw.launcherIcon || DEFAULT_LAUNCHER_ICON; - let resolvedPrimaryColor = raw.primaryColor || '#4F46E5'; - if (launcherTheme && !raw.launcherIcon) { - // 有主题且未自定义图标 → 使用主题专属玻璃质感图标 - const themeIconsMap = { - 'dream-purple': GLASS_ICON_DREAM_PURPLE, - 'mint-tech': GLASS_ICON_MINT_TECH, - 'coral-peach': GLASS_ICON_CORAL_PEACH, - 'sky-blue': GLASS_ICON_SKY_BLUE, - }; - resolvedLauncherIcon = themeIconsMap[launcherTheme] || DEFAULT_LAUNCHER_ICON; - // 若未自定义主色 → 使用主题默认色 - if (!raw.primaryColor) { - resolvedPrimaryColor = THEME_PRIMARY_COLORS[launcherTheme] || '#4F46E5'; - } - } + // 解析图标:用户传入优先,否则使用默认极光粒子图标 + const resolvedLauncherIcon = raw.launcherIcon || DEFAULT_LAUNCHER_ICON; + const resolvedPrimaryColor = raw.primaryColor || '#4F46E5'; // 填充默认值 const config = { integrateId: integrateIdStr, @@ -238,7 +139,6 @@ var ChatbotSDK = (function () { height: Math.max(300, (_c = raw.height) !== null && _c !== void 0 ? _c : 520), position: raw.position === 'left-bottom' ? 'left-bottom' : 'right-bottom', primaryColor: resolvedPrimaryColor, - launcherTheme: launcherTheme, launcherIcon: resolvedLauncherIcon, showClear: (_d = raw.showClear) !== null && _d !== void 0 ? _d : true, showAdminPanel: (_e = raw.showAdminPanel) !== null && _e !== void 0 ? _e : false, @@ -248,16 +148,19 @@ var ChatbotSDK = (function () { theme: raw.theme === 'dark' ? 'dark' : 'light', showTeaser: (_f = raw.showTeaser) !== null && _f !== void 0 ? _f : true, teaserText: (typeof raw.teaserText === 'string' && raw.teaserText.trim()) || '', - streaming: (_g = raw.streaming) !== null && _g !== void 0 ? _g : true, - enableRag: (_h = raw.enableRag) !== null && _h !== void 0 ? _h : true, + resizable: (_g = raw.resizable) !== null && _g !== void 0 ? _g : true, + streaming: (_h = raw.streaming) !== null && _h !== void 0 ? _h : true, + enableRag: (_j = raw.enableRag) !== null && _j !== void 0 ? _j : true, rewriteStrategy: raw.rewriteStrategy || 'REWRITE', locale: raw.locale || 'zh-CN', - debug: (_j = raw.debug) !== null && _j !== void 0 ? _j : true, - sound: (_k = raw.sound) !== null && _k !== void 0 ? _k : false, - notification: (_l = raw.notification) !== null && _l !== void 0 ? _l : false, + debug: (_k = raw.debug) !== null && _k !== void 0 ? _k : true, + sound: (_l = raw.sound) !== null && _l !== void 0 ? _l : false, + notification: (_m = raw.notification) !== null && _m !== void 0 ? _m : false, onError: typeof raw.onError === 'function' ? raw.onError : undefined, onReady: typeof raw.onReady === 'function' ? raw.onReady : undefined, onMessage: typeof raw.onMessage === 'function' ? raw.onMessage : undefined, + token: raw.token, + roles: raw.roles, chatId: '', // 初始为空,由 chatId 初始化流程填充 }; logger.info(`配置解析完成 integrateId(=roleId)=${config.integrateId} userId(=accountId)=${config.userId || '(未设置)'} requestDomain=${config.requestDomain}`); @@ -275,6 +178,7 @@ var ChatbotSDK = (function () { minimize: '最小化', close: '关闭', status_online: '在线', + role_selector_label: '服务角色', // 欢迎空状态 welcome_title: '你好,我是 AI 智能助手', welcome_desc: '有什么可以帮你的吗?在下方输入框开始提问吧~', @@ -320,6 +224,7 @@ var ChatbotSDK = (function () { // 提示气泡 teaser_text: '有什么可以帮你的吗?', new_msg_announce: '收到新消息', + resize: '拖拽缩放窗口', // 错误提示 error_network: '网络连接失败,请检查网络', error_timeout: '请求超时,请稍后重试', @@ -340,6 +245,7 @@ var ChatbotSDK = (function () { minimize: 'Minimize', close: 'Close', status_online: 'Online', + role_selector_label: 'Service', // Welcome welcome_title: 'Hi, I am your AI assistant', welcome_desc: 'How can I help you? Type your question below to get started.', @@ -385,6 +291,7 @@ var ChatbotSDK = (function () { // Teaser teaser_text: 'How can I help you?', new_msg_announce: 'New message received', + resize: 'Resize window', // Errors error_network: 'Network connection failed', error_timeout: 'Request timed out, please try again', @@ -439,10 +346,26 @@ var ChatbotSDK = (function () { /** 请求超时时间(毫秒) */ const REQUEST_TIMEOUT = 30000; let currentConfig = null; + /** 运行时动态设置的角色 ID(通过角色选择器切换),优先于 currentConfig.integrateId */ + let activeIntegrateId = null; /** 设置当前配置 */ function setApiConfig(config) { currentConfig = config; } + /** 清空当前配置(销毁 SDK 时调用) */ + function clearApiConfig() { + currentConfig = null; + activeIntegrateId = null; + } + /** 设置当前活跃角色 ID(角色切换时调用),影响后续所有 API 调用的 roleId 参数 */ + function setActiveRoleId(roleId) { + activeIntegrateId = roleId; + } + /** 获取当前有效的 integrateId(优先使用运行时设置,回退到配置默认值) */ + function getActiveIntegrateId() { + var _a; + return (_a = activeIntegrateId !== null && activeIntegrateId !== void 0 ? activeIntegrateId : currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.integrateId) !== null && _a !== void 0 ? _a : ''; + } /** 更新当前 chatId(对话 ID) */ function updateChatId(chatId) { if (currentConfig) { @@ -484,7 +407,7 @@ var ChatbotSDK = (function () { params.set('message', message); params.set('chatId', currentConfig.chatId); // integrateId 映射为 roleId - setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); // userId 映射为 accountId setIfPresent(params, 'accountId', currentConfig.userId); return buildUrl(`/ai/assistant_app/chat/sync?${params.toString()}`); @@ -496,7 +419,7 @@ var ChatbotSDK = (function () { const params = new URLSearchParams(); params.set('message', message); params.set('chatId', currentConfig.chatId); - setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); setIfPresent(params, 'accountId', currentConfig.userId); setIfPresent(params, 'categoryId', categoryId !== null && categoryId !== void 0 ? categoryId : currentConfig.categoryId); return buildUrl(`/ai/assistant_app/chat/sse?${params.toString()}`); @@ -509,7 +432,7 @@ var ChatbotSDK = (function () { params.set('message', message); params.set('chatId', currentConfig.chatId); params.set('rewriteStrategy', currentConfig.rewriteStrategy || 'REWRITE'); - setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); 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()}`); @@ -522,7 +445,7 @@ var ChatbotSDK = (function () { params.set('message', message); params.set('chatId', currentConfig.chatId); params.set('rewriteStrategy', currentConfig.rewriteStrategy || 'REWRITE'); - setIfPresent(params, 'roleId', currentConfig.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); 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()}`); @@ -542,7 +465,26 @@ var ChatbotSDK = (function () { } } try { - const response = await fetch(url, Object.assign(Object.assign({}, options), { signal: controller.signal, mode: 'cors', credentials: 'include' })); + // 注入 SDK Token 认证头(仅对 /ai/ 路径注入,避免将 SDK Token 发送到管理接口) + const headers = {}; + if (options.headers) { + if (options.headers instanceof Headers) { + options.headers.forEach((value, key) => { headers[key] = value; }); + } + else if (Array.isArray(options.headers)) { + options.headers.forEach(([key, value]) => { headers[key] = value; }); + } + else { + Object.assign(headers, options.headers); + } + } + if ((currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.token) && url.includes('/ai/')) { + headers['Authorization'] = `Bearer ${currentConfig.token}`; + } + const response = await fetch(url, Object.assign(Object.assign({}, options), { headers, signal: controller.signal, mode: 'cors', credentials: 'include' })); + if (response.status === 401 && url.includes('/ai/')) { + logger.error('SDK 认证失败:Token 缺失或已过期,请重新调用 /open-api/auth/token 换取 Token'); + } return response; } catch (err) { @@ -589,22 +531,22 @@ var ChatbotSDK = (function () { */ async function chatRequest(message) { const url = buildChatUrl(message); - logger.lifecycleSend(currentConfig.integrateId, message.length); + logger.lifecycleSend(getActiveIntegrateId(), message.length); try { const response = await safeFetch(url); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); + logger.lifecycleError(getActiveIntegrateId(), String(response.status), errorMsg); throw new CskError(errorMsg, `http_${response.status}`); } const text = await response.text(); - logger.lifecycleReply(currentConfig.integrateId, text.length); + logger.lifecycleReply(getActiveIntegrateId(), text.length); return text; } catch (err) { if (err instanceof CskError) throw err; - logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + logger.lifecycleError(getActiveIntegrateId(), 'unknown', String(err)); throw new CskError(t('error_unknown'), 'unknown'); } } @@ -619,12 +561,12 @@ var ChatbotSDK = (function () { ? buildChatRAGSSEUrl(message, categoryId) : buildChatSSEUrl(message, categoryId); let totalText = ''; - logger.lifecycleSend(currentConfig.integrateId, message.length); + logger.lifecycleSend(getActiveIntegrateId(), message.length); try { const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2, signal); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.lifecycleError(currentConfig.integrateId, String(response.status), errorMsg); + logger.lifecycleError(getActiveIntegrateId(), String(response.status), errorMsg); onError(new CskError(errorMsg, `http_${response.status}`)); return; } @@ -693,7 +635,7 @@ var ChatbotSDK = (function () { finally { reader.releaseLock(); } - logger.lifecycleStreamDone(currentConfig.integrateId, totalText.length); + logger.lifecycleStreamDone(getActiveIntegrateId(), totalText.length); onDone(); } catch (err) { @@ -706,7 +648,7 @@ var ChatbotSDK = (function () { onError(err); } else { - logger.lifecycleError(currentConfig.integrateId, 'unknown', String(err)); + logger.lifecycleError(getActiveIntegrateId(), 'unknown', String(err)); onError(new CskError(t('error_network'), 'network')); } } @@ -824,8 +766,8 @@ var ChatbotSDK = (function () { const params = new URLSearchParams(); if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.userId) params.set('accountId', currentConfig.userId); - if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.integrateId) - params.set('roleId', currentConfig.integrateId); + if (getActiveIntegrateId()) + params.set('roleId', getActiveIntegrateId()); const url = buildUrl(`/ai/sdk/conversation/${conversationId}/messages?${params.toString()}`); try { const response = await safeFetch(url); @@ -850,8 +792,8 @@ var ChatbotSDK = (function () { const params = new URLSearchParams(); if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.userId) params.set('accountId', currentConfig.userId); - if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.integrateId) - params.set('roleId', currentConfig.integrateId); + if (getActiveIntegrateId()) + params.set('roleId', getActiveIntegrateId()); const url = buildUrl(`/ai/sdk/conversation/${conversationId}?${params.toString()}`); try { const response = await safeFetch(url, { method: 'DELETE' }); @@ -874,40 +816,39 @@ var ChatbotSDK = (function () { const params = new URLSearchParams(); if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.userId) params.set('accountId', currentConfig.userId); - if (currentConfig === null || currentConfig === void 0 ? void 0 : currentConfig.integrateId) - params.set('roleId', currentConfig.integrateId); + if (getActiveIntegrateId()) + params.set('roleId', getActiveIntegrateId()); return buildUrl(`/ai/sdk/conversation/${conversationId}/export?${params.toString()}`); } // ==================== chatId 自动初始化 ==================== /** * 初始化 chatId:查询后端已有会话,找到则复用,否则生成新的 * - * 逻辑: - * 1. 先查 localStorage 缓存的 chatId(同一 integrateId + userId 可能复用) - * 2. 查 /ai/sdk/conversation/list?accountId=X&roleId=Y 看是否有匹配的会话 - * 3. 有会话 → 使用最新会话的 conversationId 作为 chatId - * 4. 无会话 → 自动生成 chatId(格式:sdk_timestamp_random) + * @param forceRefresh 为 true 时跳过 localStorage 缓存,强制查询后端 */ - async function initChatId() { + async function initChatId(forceRefresh = false) { if (!currentConfig) return ''; - // 1. 先尝试从 localStorage 恢复 - const cachedChatId = loadCachedChatId(currentConfig.integrateId, currentConfig.userId); - if (cachedChatId) { - currentConfig.chatId = cachedChatId; - logger.info(`从缓存恢复 chatId=${cachedChatId}`); - return cachedChatId; + const activeId = getActiveIntegrateId(); + // 1. 先从 localStorage 恢复(非强制刷新时) + if (!forceRefresh) { + const cachedChatId = loadCachedChatId(activeId, 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); + const result = await fetchConversationList(1, 5, currentConfig.userId, activeId); 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); + saveCachedChatId(activeId, currentConfig.userId, chatId); logger.info(`从后端恢复会话 chatId=${chatId} messageCount=${latestConv.messageCount}`); return chatId; } @@ -919,7 +860,7 @@ var ChatbotSDK = (function () { // 3. 生成新的 chatId const newChatId = generateChatId(); currentConfig.chatId = newChatId; - saveCachedChatId(currentConfig.integrateId, currentConfig.userId, newChatId); + saveCachedChatId(activeId, currentConfig.userId, newChatId); logger.info(`生成新 chatId=${newChatId}`); return newChatId; } @@ -971,14 +912,6 @@ var ChatbotSDK = (function () { const darker = adjustColor(config.primaryColor, -15); const lighter = adjustColor(config.primaryColor, 18); const rgb = hexToRgb(config.primaryColor); - // 马卡龙主题渐变色映射 - const themeGradients = { - 'dream-purple': { grad1: '#A78BFA', grad2: '#F0ABFC', glow: '167, 139, 250' }, - 'mint-tech': { grad1: '#6EE7B7', grad2: '#34D399', glow: '52, 211, 153' }, - 'coral-peach': { grad1: '#FB7185', grad2: '#FDBA74', glow: '251, 113, 133' }, - 'sky-blue': { grad1: '#7DD3FC', grad2: '#A78BFA', glow: '125, 211, 252' }, - }; - const themeColors = config.launcherTheme ? themeGradients[config.launcherTheme] : null; return ` --csk-primary: ${config.primaryColor}; --csk-primary-hover: ${darker}; @@ -995,11 +928,6 @@ var ChatbotSDK = (function () { --csk-shadow-bubble: 0 1px 2px rgba(15, 23, 42, 0.06); --csk-border: #ECEEF2; --csk-bg-app: #F6F7F9; - ${themeColors ? ` - --csk-launcher-grad-1: ${themeColors.grad1}; - --csk-launcher-grad-2: ${themeColors.grad2}; - --csk-launcher-glow: ${themeColors.glow}; - ` : ''} `; } /** 简单的颜色加深(按通道加减) */ @@ -1038,7 +966,8 @@ var ChatbotSDK = (function () { width: 60px; height: 60px; border-radius: 50%; - background: var(--csk-bg-user); + /* E5 梦幻拖尾 — 四段极光渐变慢旋 */ + background: conic-gradient(from 0deg, #ec4899 0deg, #8b5cf6 90deg, #3b82f6 180deg, #06b6d4 270deg, #ec4899 360deg); display: flex; align-items: center; justify-content: center; @@ -1052,61 +981,27 @@ var ChatbotSDK = (function () { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 4px 16px rgba(0, 0, 0, 0.10), - 0 6px 24px rgba(var(--csk-primary-rgb), 0.28), - 0 0 48px rgba(var(--csk-primary-rgb), 0.12); + 0 6px 24px rgba(236, 72, 153, 0.28), + 0 0 48px rgba(236, 72, 153, 0.12); transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.25s ease, border-color 0.25s ease; - animation: csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both; + animation: + csk-aurora-spin 5s linear infinite, + csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both; } .csk-launcher--right { right: 24px; } .csk-launcher--left { left: 24px; } -/* 高光扫过动效 */ -.csk-launcher::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 40%; - height: 200%; - border-radius: 50%; - background: linear-gradient( - 105deg, - transparent 30%, - rgba(255, 255, 255, 0.28) 48%, - rgba(255, 255, 255, 0.1) 52%, - transparent 70% - ); - transform: rotate(25deg); - animation: csk-shimmer 4s ease-in-out infinite; - pointer-events: none; -} -/* 呼吸色晕 — 配合接地阴影,强化白底上的立体存在感 */ -.csk-launcher::after { - content: ''; - position: absolute; - inset: -18px; - border-radius: 50%; - background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.18) 0%, rgba(var(--csk-primary-rgb), 0.05) 45%, transparent 68%); - animation: csk-breathe 3.5s ease-in-out infinite; - pointer-events: none; -} .csk-launcher:hover { transform: translateY(-3px) scale(1.08); border-color: rgba(255, 255, 255, 0.75); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.10), 0 8px 24px rgba(0, 0, 0, 0.14), - 0 10px 36px rgba(var(--csk-primary-rgb), 0.32), - 0 0 56px rgba(var(--csk-primary-rgb), 0.14); -} -.csk-launcher:hover::before { animation-play-state: paused; } -.csk-launcher:hover::after { - animation: none; - inset: -22px; - background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.22) 0%, rgba(var(--csk-primary-rgb), 0.06) 45%, transparent 68%); + 0 10px 36px rgba(236, 72, 153, 0.32), + 0 0 56px rgba(236, 72, 153, 0.14); } .csk-launcher:active { transform: scale(0.93); } .csk-launcher svg { @@ -1122,107 +1017,149 @@ var ChatbotSDK = (function () { 60% { transform: scale(1.06) translateY(-2px); } 100% { opacity: 1; transform: scale(1) translateY(0); } } -@keyframes csk-shimmer { - 0%, 100% { left: -60%; opacity: 0; } - 20% { opacity: 1; } - 60% { opacity: 1; } - 80% { left: 120%; opacity: 0; } + +/* ========== E5 梦幻拖尾·全粒子动画系统 ========== */ +/* 极光旋转 */ +@keyframes csk-aurora-spin { + to { transform: rotate(360deg); } } -@keyframes csk-breathe { - 0%, 100% { transform: scale(1); opacity: 1; } - 50% { transform: scale(1.15); opacity: 0.35; } + +/* 粒子通用 */ +.csk-pt { + position: absolute; + border-radius: 50%; + background: #fff; + z-index: 4; + top: 50%; + left: 50%; + pointer-events: none; } -/* SVG 图标内部动效:眨眼 */ -.csk-launcher .csk-ico-eye { - animation: csk-eye-blink 4s ease-in-out infinite; +/* ── 爆散粒子(8颗,不同方向/距离/大小/延迟)── */ +.csk-pt-burst { animation: csk-burst 2.8s ease-in-out infinite; } +.csk-pt-burst:nth-child(1) { width:5px; height:5px; animation-delay:0s; } +.csk-pt-burst:nth-child(2) { width:4px; height:4px; animation-delay:0.35s; } +.csk-pt-burst:nth-child(3) { width:5px; height:5px; animation-delay:0.7s; } +.csk-pt-burst:nth-child(4) { width:3px; height:3px; animation-delay:1.05s; } +.csk-pt-burst:nth-child(5) { width:5px; height:5px; animation-delay:1.4s; } +.csk-pt-burst:nth-child(6) { width:4px; height:4px; animation-delay:1.75s; } +.csk-pt-burst:nth-child(7) { width:3px; height:3px; animation-delay:2.1s; } +.csk-pt-burst:nth-child(8) { width:5px; height:5px; animation-delay:2.45s; } + +@keyframes csk-burst { + 0% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 12% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 32% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(1.5); opacity: 1; } + 48% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0.5); opacity: .55; } + 62% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 100% { transform: translate(-50%,-50%) scale(0); opacity: 0; } } -@keyframes csk-eye-blink { - 0%, 42%, 48%, 100% { opacity: 1; } - 45% { opacity: 0.1; } + +/* ── 浮游粒子(持续轨道运动,永不停歇)── */ +.csk-pt-float { + animation: csk-float-orbit 3s linear infinite; + box-shadow: 0 0 4px 1px rgba(255,255,255,.5); +} +.csk-pt-float:nth-child(9) { width:3px; height:3px; animation-duration:2.4s; animation-delay:0s; } +.csk-pt-float:nth-child(10) { width:4px; height:4px; animation-duration:3.2s; animation-delay:-0.6s; } +.csk-pt-float:nth-child(11) { width:3px; height:3px; animation-duration:2.8s; animation-delay:-1.2s; } +.csk-pt-float:nth-child(12) { width:4px; height:4px; animation-duration:3.6s; animation-delay:-1.8s; } + +@keyframes csk-float-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(20px) rotate(0deg); } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(20px) rotate(-360deg); } +} + +/* ── 心跳粒子(中心脉冲 + 呼吸缩放)── */ +.csk-pt-pulse { + animation: csk-heart-pulse 1.4s ease-in-out infinite; } -/* SVG 图标内部动效:天线能量闪烁 */ -.csk-launcher .csk-ico-antenna { - animation: csk-antenna-glow 2s ease-in-out infinite; +.csk-pt-pulse:nth-child(13) { + width: 8px; height: 8px; + box-shadow: 0 0 14px 4px rgba(255,255,255,.8), 0 0 28px 8px rgba(255,255,255,.3); + animation-delay: 0s; } -@keyframes csk-antenna-glow { - 0%, 100% { opacity: 0.5; } - 50% { opacity: 1; } +.csk-pt-pulse:nth-child(14) { + width: 4px; height: 4px; + box-shadow: 0 0 8px 2px rgba(255,255,255,.6); + animation-delay: 0.7s; } -/* ========== 磨砂玻璃质感悬浮按钮 ========== */ -.csk-launcher--glass { - background: linear-gradient( - 135deg, - var(--csk-launcher-grad-1, var(--csk-primary)) 0%, - var(--csk-launcher-grad-2, var(--csk-primary-light)) 100% - ) !important; - backdrop-filter: blur(12px) saturate(180%); - -webkit-backdrop-filter: blur(12px) saturate(180%); - border: 1.5px solid rgba(255, 255, 255, 0.55) !important; - /* 多层阴影:接地 + 彩色光晕 + 内阴影立体感 */ - box-shadow: - 0 2px 4px rgba(0, 0, 0, 0.04), - 0 6px 20px rgba(0, 0, 0, 0.08), - 0 8px 32px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.30), - inset 0 1px 1px rgba(255, 255, 255, 0.35), - inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important; -} -.csk-launcher--glass:hover { - border-color: rgba(255, 255, 255, 0.75) !important; - box-shadow: - 0 4px 8px rgba(0, 0, 0, 0.06), - 0 10px 28px rgba(0, 0, 0, 0.10), - 0 12px 40px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.38), - inset 0 1px 2px rgba(255, 255, 255, 0.45), - inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important; +@keyframes csk-heart-pulse { + 0%, 100% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; } + 25% { transform: translate(-50%,-50%) scale(1.6); opacity: 1; } + 50% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; } + 75% { transform: translate(-50%,-50%) scale(0.9); opacity: .6; } } -/* 玻璃按钮的呼吸色晕 — 更鲜艳、更醒目 */ -.csk-launcher--glass::after { - background: radial-gradient( - circle, - rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.28) 0%, - rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.10) 40%, - transparent 65% - ) !important; - animation: csk-breathe-glow 3.5s ease-in-out infinite; -} -@keyframes csk-breathe-glow { - 0%, 100% { transform: scale(1); opacity: 0.8; } - 50% { transform: scale(1.22); opacity: 0.25; } +/* ── 甩尾粒子(椭圆轨道 + 变速,近大远小)── */ +.csk-pt-elliptic { + animation: csk-elliptic-orbit 2.6s ease-in-out infinite; + box-shadow: 0 0 5px 1px rgba(255,255,255,.6); } +.csk-pt-elliptic:nth-child(15) { width:4px; height:4px; animation-delay:0s; } +.csk-pt-elliptic:nth-child(16) { width:4px; height:4px; animation-delay:-1.3s; } -/* 玻璃按钮的高光扫过 — 更柔和的玻璃质感 */ -.csk-launcher--glass::before { - background: linear-gradient( - 115deg, - transparent 25%, - rgba(255, 255, 255, 0.35) 45%, - rgba(255, 255, 255, 0.15) 55%, - transparent 75% - ) !important; - width: 50%; - animation: csk-shimmer-glass 5s ease-in-out infinite; -} -@keyframes csk-shimmer-glass { - 0%, 100% { left: -70%; opacity: 0; } - 15% { opacity: 1; } - 55% { opacity: 1; } - 70% { left: 130%; opacity: 0; } +@keyframes csk-elliptic-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(18px) rotate(0deg) scaleY(1); } + 25% { transform: translate(-50%,-50%) rotate(90deg) translateX(18px) rotate(-90deg) scaleY(0.45); } + 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(18px) rotate(-180deg) scaleY(1); } + 75% { transform: translate(-50%,-50%) rotate(270deg) translateX(18px) rotate(-270deg) scaleY(0.45); } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(18px) rotate(-360deg) scaleY(1); } } -/* SVG 内部动效:跳动气泡(3 个小圆点交错弹跳) */ -.csk-launcher .csk-ico-bubble { - animation: csk-bubble-jump 1.4s ease-in-out infinite; -} -.csk-launcher .csk-ico-bubble--1 { animation-delay: 0s; } -.csk-launcher .csk-ico-bubble--2 { animation-delay: 0.18s; } -.csk-launcher .csk-ico-bubble--3 { animation-delay: 0.36s; } -@keyframes csk-bubble-jump { - 0%, 100% { transform: translateY(0); } - 40% { transform: translateY(-3.5px); } - 60% { transform: translateY(-1px); } +/* ── 环绕流光(外层慢速光环拖尾)── */ +.csk-pt-ring { + width: 3px; height: 3px; + background: rgba(255,255,255,.9); + box-shadow: 0 0 6px 2px rgba(255,255,255,.7); + animation: csk-ring-orbit 5s linear infinite; +} +.csk-pt-ring:nth-child(17) { animation-delay: 0s; } +.csk-pt-ring:nth-child(18) { animation-delay: -1.25s; } +.csk-pt-ring:nth-child(19) { animation-delay: -2.5s; } +.csk-pt-ring:nth-child(20) { animation-delay: -3.75s; } + +@keyframes csk-ring-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(23px) rotate(0deg) scale(1); opacity: .8; } + 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(23px) rotate(-180deg) scale(1.8); opacity: 1; } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(23px) rotate(-360deg) scale(1); opacity: .8; } +} + +/* ── 极光扫光叠加层 ── */ +.csk-sheen { + position: absolute; + inset: 0; + border-radius: 50%; + pointer-events: none; + z-index: 3; + overflow: hidden; +} +.csk-sheen::after { + content: ''; + position: absolute; + top: -60%; left: -60%; + width: 35%; height: 220%; + background: rgba(255,255,255,.15); + transform: rotate(22deg); + animation: csk-shimmer-sweep 2.8s ease-in-out infinite; +} +@keyframes csk-shimmer-sweep { + 0% { left: -60%; } + 40% { left: 50%; } + 60% { left: 50%; } + 100% { left: 130%; } +} + +/* ── 双层极光圈(反向旋转,增加层次)── */ +.csk-dual { + position: absolute; + inset: 0; + border-radius: 50%; + pointer-events: none; + z-index: 2; + background: conic-gradient(from 180deg, transparent 0%, rgba(255,255,255,.08) 35%, transparent 65%); + animation: csk-aurora-spin 2s linear infinite reverse; } /* ========== 聊天弹窗 ========== */ @@ -1357,6 +1294,43 @@ var ChatbotSDK = (function () { .csk-header__btn:active, .csk-history-btn:active { transform: scale(0.92); } +/* ========== 角色选择器 ========== */ +.csk-role-select-wrap { + display: flex; + align-items: center; + flex-shrink: 0; + margin: 0 4px; +} +.csk-role-select { + appearance: none; + -webkit-appearance: none; + padding: 4px 24px 4px 10px; + border: 1px solid rgba(255, 255, 255, 0.35); + border-radius: 8px; + background: rgba(255, 255, 255, 0.15) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='white' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 6px center; + color: #fff; + font-size: 12px; + font-family: inherit; + cursor: pointer; + outline: none; + transition: background 0.15s, border-color 0.15s; + max-width: 120px; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-role-select:hover { + background-color: rgba(255, 255, 255, 0.25); + border-color: rgba(255, 255, 255, 0.55); +} +.csk-role-select:focus { + border-color: rgba(255, 255, 255, 0.7); + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2); +} +.csk-role-select option { + color: #1F2937; + background: #fff; +} + /* ========== 消息区 ========== */ .csk-messages { flex: 1; @@ -1744,6 +1718,7 @@ var ChatbotSDK = (function () { .csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; } .csk-md-code-block { + position: relative; background: #1E293B; color: #E2E8F0; padding: 12px 14px; @@ -1930,19 +1905,6 @@ var ChatbotSDK = (function () { 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; } /* ========== 快捷问题芯片 ========== */ .csk-quick-replies { @@ -2022,7 +1984,6 @@ var ChatbotSDK = (function () { } /* ========== 代码块复制按钮 ========== */ -.csk-md-code-block { position: relative; } .csk-md-code-copy { position: absolute; top: 8px; @@ -2080,6 +2041,94 @@ var ChatbotSDK = (function () { box-shadow: 0 5px 14px rgba(239, 68, 68, 0.45) !important; } +/* ========== 窗口缩放拖拽手柄 ========== */ +.csk-resize-handle { + position: absolute; + right: 4px; + bottom: 4px; + width: 20px; + height: 20px; + display: flex; + align-items: flex-end; + justify-content: flex-end; + cursor: nwse-resize; + z-index: 5; + user-select: none; + -webkit-user-select: none; + /* 圆形半透明背景,与整体圆润风格一致 */ + border-radius: 50%; + background: transparent; + transition: background 0.2s ease; +} +.csk-resize-handle:hover { + background: rgba(var(--csk-primary-rgb), 0.08); +} + +/* 三斜线抓手 — 纯 CSS 绘制,用两条间距微调的线,视觉上是三条 */ +.csk-resize-grip { + display: block; + width: 10px; + height: 10px; + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + #C8CCD2 38%, #C8CCD2 42%, + transparent 42%, transparent 54%, + #C8CCD2 54%, #C8CCD2 58%, + transparent 58%, transparent 70%, + #C8CCD2 70%, #C8CCD2 74%, + transparent 74% + ); + transition: background 0.2s ease; + border-radius: 2px; +} +/* hover 时线条变为主色 */ +.csk-resize-handle:hover .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + var(--csk-primary) 38%, var(--csk-primary) 42%, + transparent 42%, transparent 54%, + var(--csk-primary) 54%, var(--csk-primary) 58%, + transparent 58%, transparent 70%, + var(--csk-primary) 70%, var(--csk-primary) 74%, + transparent 74% + ); +} + +/* 暗色模式 */ +.csk-dark .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + #5B6070 38%, #5B6070 42%, + transparent 42%, transparent 54%, + #5B6070 54%, #5B6070 58%, + transparent 58%, transparent 70%, + #5B6070 70%, #5B6070 74%, + transparent 74% + ); +} +.csk-dark .csk-resize-handle:hover .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + var(--csk-primary-light) 38%, var(--csk-primary-light) 42%, + transparent 42%, transparent 54%, + var(--csk-primary-light) 54%, var(--csk-primary-light) 58%, + transparent 58%, transparent 70%, + var(--csk-primary-light) 70%, var(--csk-primary-light) 74%, + transparent 74% + ); +} + +/* 缩放拖拽中:禁用过渡动画 + 全局光标 */ +.csk-window--resizing { + transition: none !important; + user-select: none; +} +.csk-window--resizing * { cursor: nwse-resize !important; } + /* ========== 暗色模式 ========== */ .csk-root.csk-dark { --csk-bg-ai: #1E1E2E; @@ -2146,6 +2195,10 @@ var ChatbotSDK = (function () { .csk-dark .csk-launcher__badge { box-shadow: 0 0 0 2px #1A1A2E; } .csk-dark .csk-welcome__avatar { box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.25); } .csk-dark .csk-header__avatar { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.1); } +.csk-dark .csk-role-select option { + background: #1A1A2E; + color: #E2E8F0; +} /* Launcher 拖拽态:微放大 + 阴影加深 */ .csk-launcher--dragging { @@ -2154,11 +2207,9 @@ var ChatbotSDK = (function () { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.14), 0 12px 32px rgba(0, 0, 0, 0.18), - 0 14px 40px rgba(var(--csk-primary-rgb), 0.36), - 0 0 56px rgba(var(--csk-primary-rgb), 0.18) !important; + 0 14px 40px rgba(236, 72, 153, 0.36), + 0 0 56px rgba(236, 72, 153, 0.18) !important; } -.csk-launcher--dragging::before, -.csk-launcher--dragging::after { animation-play-state: paused !important; } /* 拖拽中隐藏未读徽章 */ .csk-launcher--dragging .csk-launcher__badge { display: none !important; } /* 吸附过渡动画(释放时的缓动) */ @@ -2347,6 +2398,7 @@ var ChatbotSDK = (function () { left: 0 !important; border-radius: 0; } + .csk-resize-handle { display: none !important; } .csk-window--hidden { transform: translateY(100%); } /* 移动端默认位置,仅在未被 JS 拖拽覆盖时生效 */ .csk-launcher:not([style*="bottom"]) { bottom: 20px; } @@ -2382,7 +2434,6 @@ var ChatbotSDK = (function () { /** * 工具函数模块 */ - /** 生成简短 UUID(取 crypto.randomUUID 前 8 位) */ /** 生成完整 UUID */ function uuid() { if (typeof crypto !== 'undefined' && crypto.randomUUID) { @@ -2419,6 +2470,13 @@ var ChatbotSDK = (function () { }, delay); }; } + /** 格式化时间戳为 HH:mm */ + function formatTime(timestamp) { + const d = new Date(timestamp); + const hh = String(d.getHours()).padStart(2, '0'); + const mm = String(d.getMinutes()).padStart(2, '0'); + return `${hh}:${mm}`; + } /** 获取当前时间戳(毫秒) */ function now() { return Date.now(); @@ -2434,9 +2492,7 @@ var ChatbotSDK = (function () { function createLauncher(config, onClick) { const launcher = document.createElement('div'); launcher.id = 'csk-launcher'; - // 有玻璃主题时追加 --glass 类名,启用磨砂玻璃质感样式 - const glassClass = config.launcherTheme ? ' csk-launcher--glass' : ''; - launcher.className = `csk-launcher csk-launcher--${config.position === 'left-bottom' ? 'left' : 'right'}${glassClass}`; + launcher.className = `csk-launcher csk-launcher--${config.position === 'left-bottom' ? 'left' : 'right'}`; launcher.setAttribute('title', config.title); launcher.setAttribute('aria-label', config.title); launcher.setAttribute('role', 'button'); @@ -2489,6 +2545,39 @@ var ChatbotSDK = (function () { headerInfo.appendChild(statusEl); headerLeft.appendChild(headerAvatar); headerLeft.appendChild(headerInfo); + // === 角色选择器(仅当有多个角色时显示) === + let roleSelect = null; + const roles = config.roles; + if (roles && roles.length > 1) { + roleSelect = document.createElement('select'); + roleSelect.className = 'csk-role-select'; + roleSelect.setAttribute('aria-label', t('role_selector_label')); + for (const role of roles) { + const option = document.createElement('option'); + option.value = String(role.id); + option.textContent = role.name || String(role.id); + if (String(role.id) === String(config.integrateId)) { + option.selected = true; + } + roleSelect.appendChild(option); + } + // onChange 触发自定义事件 + roleSelect.addEventListener('change', () => { + const selectedValue = roleSelect.value; + windowEl.dispatchEvent(new CustomEvent('csk:roleChange', { + detail: { roleId: selectedValue } + })); + }); + // 包装后插入到 headerLeft 之后、actions 之前 + const roleWrap = document.createElement('div'); + roleWrap.className = 'csk-role-select-wrap'; + roleWrap.appendChild(roleSelect); + header.appendChild(headerLeft); + header.appendChild(roleWrap); + } + else { + header.appendChild(headerLeft); + } const actions = document.createElement('div'); actions.className = 'csk-header__actions'; // 历史会话按钮(P2) @@ -2515,7 +2604,6 @@ var ChatbotSDK = (function () { actions.appendChild(historyBtn); actions.appendChild(minimizeBtn); actions.appendChild(closeBtn); - header.appendChild(headerLeft); header.appendChild(actions); // === 消息区 === const messagesContainer = document.createElement('div'); @@ -2694,6 +2782,13 @@ var ChatbotSDK = (function () { ${config.teaserText || t('teaser_text')} `; + // === 缩放拖拽手柄(右下角) === + const resizeHandle = document.createElement('div'); + resizeHandle.className = 'csk-resize-handle'; + resizeHandle.setAttribute('aria-label', t('resize')); + // 纯 CSS 渲染三条斜线,无需 SVG + resizeHandle.innerHTML = ''; + windowEl.appendChild(resizeHandle); return { window: windowEl, messagesContainer, @@ -2705,8 +2800,10 @@ var ChatbotSDK = (function () { welcomeEl, newMsgBtn, teaserEl, + resizeHandle, searchInput, ariaLiveEl, + roleSelect, showLoading, hideLoading, }; @@ -2914,6 +3011,100 @@ var ChatbotSDK = (function () { document.removeEventListener('touchend', onTouchEnd); }; } + // ==================== 窗口缩放支持 ==================== + /** 窗口最小尺寸 */ + const MIN_WIDTH = 300; + const MIN_HEIGHT = 300; + /** + * 启用窗口右下角拖拽缩放 + * @param handleEl 缩放手柄元素 + * @param windowEl 聊天窗口元素 + * @param onResizeEnd 缩放结束回调,返回最终宽高用于持久化 + * @returns 清理函数 + */ + function enableResize(handleEl, windowEl, onResizeEnd) { + let resizing = false; + let startX = 0; + let startY = 0; + let startWidth = 0; + let startHeight = 0; + const onPointerDown = (clientX, clientY) => { + resizing = true; + startX = clientX; + startY = clientY; + const rect = windowEl.getBoundingClientRect(); + startWidth = rect.width; + startHeight = rect.height; + windowEl.classList.add('csk-window--resizing'); + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + document.addEventListener('touchmove', onTouchMove, { passive: false }); + document.addEventListener('touchend', onTouchEnd); + }; + const onPointerMove = (clientX, clientY, e) => { + if (!resizing) + return; + if (e) + e.preventDefault(); + const dx = clientX - startX; + const dy = clientY - startY; + const newWidth = Math.max(MIN_WIDTH, Math.min(startWidth + dx, window.innerWidth - 24)); + const newHeight = Math.max(MIN_HEIGHT, Math.min(startHeight + dy, window.innerHeight - 24)); + windowEl.style.width = `${newWidth}px`; + windowEl.style.height = `${newHeight}px`; + // 同步更新 CSS 变量(供内部布局使用) + windowEl.style.setProperty('--csk-window-width', `${newWidth}px`); + windowEl.style.setProperty('--csk-window-height', `${newHeight}px`); + // 拖拽缩放后清除 bottom/right 定位,避免与固定定位冲突 + windowEl.style.bottom = ''; + windowEl.style.right = ''; + }; + const onPointerUp = () => { + if (!resizing) + return; + resizing = false; + windowEl.classList.remove('csk-window--resizing'); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); + const rect = windowEl.getBoundingClientRect(); + if (onResizeEnd) { + onResizeEnd({ width: rect.width, height: rect.height }); + } + }; + // 鼠标事件(DOM 事件监听器包装) + function onMouseMove(e) { onPointerMove(e.clientX, e.clientY, e); } + function onMouseUp() { onPointerUp(); } + // 鼠标事件 + function onMouseDown(e) { + e.preventDefault(); + e.stopPropagation(); + onPointerDown(e.clientX, e.clientY); + } + // 触摸事件 + function onTouchStart(e) { + e.preventDefault(); + e.stopPropagation(); + if (e.touches.length === 1) + onPointerDown(e.touches[0].clientX, e.touches[0].clientY); + } + function onTouchMove(e) { + if (e.touches.length === 1) + onPointerMove(e.touches[0].clientX, e.touches[0].clientY, e); + } + function onTouchEnd() { onPointerUp(); } + handleEl.addEventListener('mousedown', onMouseDown); + handleEl.addEventListener('touchstart', onTouchStart, { passive: false }); + return () => { + handleEl.removeEventListener('mousedown', onMouseDown); + handleEl.removeEventListener('touchstart', onTouchStart); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); + }; + } // ==================== 消息渲染 ==================== /** 渲染用户消息气泡 */ function renderUserBubble(container, text, timestamp) { @@ -3309,6 +3500,8 @@ var ChatbotSDK = (function () { const metaEl = document.createElement('div'); metaEl.className = 'csk-history-item__meta'; const metaParts = []; + if (item.roleName) + metaParts.push(item.roleName); if (item.messageCount !== undefined) metaParts.push(`${item.messageCount} 条消息`); if (item.lastMessageTime) @@ -3354,13 +3547,6 @@ var ChatbotSDK = (function () { function scrollToBottom(container) { container.scrollTop = container.scrollHeight; } - /** 格式化时间戳 */ - function formatTime(timestamp) { - const d = new Date(timestamp); - const hh = String(d.getHours()).padStart(2, '0'); - const mm = String(d.getMinutes()).padStart(2, '0'); - return `${hh}:${mm}`; - } const STORAGE_PREFIX = 'csk_history_'; const MAX_MESSAGES = 200; @@ -3623,6 +3809,7 @@ var ChatbotSDK = (function () { let sendBtn$1 = null; let clearBtn$1 = null; let categorySelect$1 = null; + let roleSelect = null; let historyPanel$1 = null; let welcomeEl = null; let newMsgBtn = null; @@ -3654,6 +3841,7 @@ var ChatbotSDK = (function () { sendBtn$1 = dom.sendBtn; clearBtn$1 = dom.clearBtn; categorySelect$1 = dom.categorySelect; + roleSelect = dom.roleSelect; historyPanel$1 = dom.historyPanel; welcomeEl = dom.welcomeEl; newMsgBtn = dom.newMsgBtn; @@ -3717,8 +3905,8 @@ var ChatbotSDK = (function () { })); renderHistory(); logger.info(`从后端加载 ${messages.length} 条历史消息`); - // 同步到 localStorage - saveMessages(config$1.integrateId, messages); + // 同步到 localStorage(使用当前活跃角色 ID) + saveMessages(getActiveIntegrateId(), messages); } } catch (err) { @@ -4255,6 +4443,68 @@ var ChatbotSDK = (function () { useRag = (_a = config$1 === null || config$1 === void 0 ? void 0 : config$1.enableRag) !== null && _a !== void 0 ? _a : true; logger.lifecycleCategoryChange(categoryId !== null && categoryId !== void 0 ? categoryId : '全部'); } + // ==================== 角色切换 ==================== + /** + * 切换客服角色 + * - 清理当前对话 + 生成新 chatId + * - 更新 API 层的 roleId 参数 + * - 重新加载新角色的对话历史 + */ + async function switchRole(newRoleId) { + if (!config$1 || !messagesContainer$1) + return; + const oldRoleId = getActiveIntegrateId(); + // 1. 判断是否与当前角色相同(防重复切换) + if (newRoleId === oldRoleId) + return; + // 2. 保存当前消息到 localStorage(与旧 integrateId 关联) + if (messages.length > 0) { + saveMessages(oldRoleId, messages); + } + // 3. 中断正在进行的流式请求 + if (abortController) { + abortController.abort(); + abortController = null; + } + isSending = false; + setSendButtonMode('send'); + // 4. 清空消息数组和 DOM + messages = []; + const msgNodes = messagesContainer$1.querySelectorAll('.csk-msg, .csk-loading'); + msgNodes.forEach(el => el.remove()); + // 5. 清空新旧角色的 localStorage 缓存(消息 + chatId),必须在 setActiveRoleId 之前 + clearMessages(oldRoleId); + saveCachedChatId(oldRoleId, config$1.userId, undefined); + clearMessages(newRoleId); + saveCachedChatId(newRoleId, config$1.userId, undefined); + // 6. 更新 API 层的 integrateId(必须在 initChatId 之前) + setActiveRoleId(newRoleId); + // 7. 更新角色下拉框高亮项 + if (roleSelect) { + roleSelect.value = newRoleId; + } + // 8. 强制查询后端会话列表(跳过 localStorage 缓存) + const foundChatId = await initChatId(true); + logger.info(`角色切换 initChatId 完成 chatId=${foundChatId} roleId=${newRoleId}`); + // 9. 从后端加载新角色的对话历史 + if (foundChatId) { + try { + await loadHistoryFromBackend(); + } + catch (err) { + logger.warn(`切换角色后加载后端历史失败 roleId=${newRoleId}`, err); + } + } + // 10. 隐藏清空按钮 + 更新欢迎态 + if (clearBtn$1 && messages.length === 0) + clearBtn$1.style.display = 'none'; + updateEmptyState(); + // 11. 重置滚动状态 + isNearBottom = true; + if (messagesContainer$1) + scrollToBottom(messagesContainer$1); + logger.info(`角色切换完成 ${oldRoleId} -> ${newRoleId}`); + } // ==================== 会话管理面板 ==================== /** 加载会话列表并渲染 */ async function loadHistoryConversations() { @@ -4265,10 +4515,12 @@ var ChatbotSDK = (function () { return; listEl.innerHTML = `
加载中...
`; try { - const result = await fetchConversationList(1, 50, config$1.userId, config$1.integrateId); + const result = await fetchConversationList(1, 50, config$1.userId, getActiveIntegrateId()); historyItems = result.list.map(c => ({ id: c.conversationId || '', chatId: c.conversationId || '', + roleId: c.roleId, + roleName: c.roleName, messageCount: c.messageCount, lastMessageTime: c.lastMessageTime, lastMessagePreview: c.lastMessagePreview, @@ -4305,15 +4557,31 @@ var ChatbotSDK = (function () { } /** * 切换到指定会话:加载上下文并继续对话 + * 如果会话所属角色与当前角色不同,自动同步切换角色 * @param conversationId 会话 ID(即 chatId) */ async function switchToConversation(conversationId) { if (!config$1 || !messagesContainer$1) return; + // 找到该会话对应的历史条目,获取其所属角色 + const historyItem = historyItems.find(it => (it.chatId || it.id) === conversationId); + // 如果会话所属角色与当前活跃角色不同,先静默切换角色 + if (historyItem && historyItem.roleId !== undefined) { + const convRoleId = String(historyItem.roleId); + const currentRoleId = getActiveIntegrateId(); + if (convRoleId && convRoleId !== currentRoleId) { + logger.info(`会话角色不匹配,自动切换角色 ${currentRoleId} -> ${convRoleId}`); + setActiveRoleId(convRoleId); + // 更新角色下拉框高亮项 + if (roleSelect) { + roleSelect.value = convRoleId; + } + } + } logger.info(`切换到会话 conversationId=${conversationId}`); // 1. 更新 chatId updateChatId(conversationId); - saveCachedChatId(config$1.integrateId, config$1.userId, conversationId); + saveCachedChatId(getActiveIntegrateId(), config$1.userId, conversationId); // 2. 关闭历史面板 if (historyPanel$1) { historyPanel$1.classList.add('csk-history-panel--hidden'); @@ -4363,6 +4631,7 @@ var ChatbotSDK = (function () { let hideLoadingFn = null; let dragCleanup = null; let launcherDragCleanup = null; + let resizeCleanup = null; /** Launcher 位置记忆状态(拖拽后更新) */ let launcherPos = null; /** 提示气泡元素 */ @@ -4443,6 +4712,15 @@ var ChatbotSDK = (function () { } // 9.1 恢复上次拖拽位置 restoreWindowPosition(config.integrateId, windowEl); + // 9.2 启用缩放(resizable 配置控制) + if (config.resizable) { + const resizeHandle = dom.resizeHandle; + resizeCleanup = enableResize(resizeHandle, windowEl, (size) => { + saveWindowSize(config.integrateId, size); + }); + // 恢复上次缩放的尺寸 + restoreWindowSize(config.integrateId, windowEl); + } // 10. 初始化对话模块 initChat(config, { messagesContainer, @@ -4455,6 +4733,7 @@ var ChatbotSDK = (function () { newMsgBtn: dom.newMsgBtn, searchInput: dom.searchInput, ariaLiveEl: dom.ariaLiveEl, + roleSelect: dom.roleSelect, showLoading: showLoadingFn, hideLoading: hideLoadingFn, }); @@ -4490,6 +4769,11 @@ var ChatbotSDK = (function () { catch ( /* 回调异常不影响 SDK */_b) { /* 回调异常不影响 SDK */ } } })); + // 16.5 监听角色切换事件 + windowEl.addEventListener('csk:roleChange', ((e) => { + if (e.detail.roleId) + switchRole(String(e.detail.roleId)); + })); // 17. ESC 键关闭弹窗 document.addEventListener('keydown', onKeyDown); // 17. 窗口 resize 时重新定位 teaser @@ -4661,6 +4945,10 @@ var ChatbotSDK = (function () { launcherDragCleanup(); launcherDragCleanup = null; } + if (resizeCleanup) { + resizeCleanup(); + resizeCleanup = null; + } launcherPos = null; removeStyles(); document.removeEventListener('keydown', onKeyDown); @@ -4679,6 +4967,7 @@ var ChatbotSDK = (function () { hideLoadingFn = null; badgeEl = null; audioCtx = null; + clearApiConfig(); logger.lifecycleDestroy(oldIntegrateId || ''); } function open() { @@ -4715,6 +5004,36 @@ var ChatbotSDK = (function () { clearMessages(config.integrateId); } } + // ==================== 窗口尺寸记忆 ==================== + /** localStorage key:窗口尺寸 */ + function sizeKey(integrateId) { + return `csk_size_${integrateId}`; + } + /** 保存窗口缩放的尺寸到 localStorage */ + function saveWindowSize(integrateId, size) { + try { + localStorage.setItem(sizeKey(integrateId), JSON.stringify(size)); + } + catch ( /* 忽略 */_a) { /* 忽略 */ } + } + /** 恢复窗口缩放尺寸 */ + function restoreWindowSize(integrateId, winEl) { + try { + const raw = localStorage.getItem(sizeKey(integrateId)); + if (!raw) + return; + const size = JSON.parse(raw); + if (typeof size.width !== 'number' || typeof size.height !== 'number') + return; + const w = Math.max(300, Math.min(size.width, window.innerWidth - 24)); + const h = Math.max(300, Math.min(size.height, window.innerHeight - 24)); + winEl.style.width = `${w}px`; + winEl.style.height = `${h}px`; + winEl.style.setProperty('--csk-window-width', `${w}px`); + winEl.style.setProperty('--csk-window-height', `${h}px`); + } + catch ( /* 忽略 */_a) { /* 忽略 */ } + } // ==================== 窗口位置记忆 ==================== /** localStorage key:窗口位置 */ function positionKey(integrateId) { diff --git a/client/dist/chatbot-sdk.js.map b/client/dist/chatbot-sdk.js.map index ab8ffed..2137db6 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/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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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAszClB;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;IAsBA;;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;IACA,IAAA,QAAQ,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/E;;ICh7CA;;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;;ICrDA;IAEA;IACA,MAAM,QAAQ,GAAG,CAAA,6WAAA,CAA+W;IAEhY;IACA,MAAM,SAAS,GAAG,CAAA,uPAAA,CAAyP;IAE3Q;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;;IAE5B,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,GAAG,sBAAsB,GAAG,EAAE;QACrE,QAAQ,CAAC,SAAS,GAAG,CAAA,2BAAA,EAA8B,MAAM,CAAC,QAAQ,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA,EAAG,UAAU,EAAE;QACtH,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,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC3C,IAAA,KAAK,CAAC,SAAS,GAAG,iDAAiD;IACnE,IAAA,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;;QAG3B,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;;QAiBrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9C,IAAA,QAAQ,CAAC,EAAE,GAAG,YAAY;IAC1B,IAAA,QAAQ,CAAC,SAAS,GAAG,CAAA,gCAAA,EAAmC,MAAM,CAAC,QAAQ,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA,mBAAA,EAAsB,MAAM,CAAC,KAAK,KAAK,MAAM,GAAG,WAAW,GAAG,EAAE,EAAE;IAC9K,IAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;QACvC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;IACjD,IAAA,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC;;QAG5C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,YAAY;QAE/B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAChD,IAAA,UAAU,CAAC,SAAS,GAAG,kBAAkB;QAEzC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAClD,IAAA,YAAY,CAAC,SAAS,GAAG,oBAAoB;IAC7C,IAAA,YAAY,CAAC,SAAS,GAAG,QAAQ;QAEjC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAChD,IAAA,UAAU,CAAC,SAAS,GAAG,kBAAkB;QAEzC,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,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IAC/C,IAAA,QAAQ,CAAC,SAAS,GAAG,oBAAoB;QACzC,QAAQ,CAAC,SAAS,GAAG,CAAA,8BAAA,EAAiC,CAAC,CAAC,eAAe,CAAC,CAAA,CAAE;IAE1E,IAAA,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC;IAC/B,IAAA,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;IAChC,IAAA,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC;IACpC,IAAA,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC;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,UAAU,CAAC;IAC9B,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,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,IAAA,SAAS,CAAC,SAAS,GAAG,aAAa;QACnC,SAAS,CAAC,SAAS,GAAG;uCACe,QAAQ,CAAA;sCACT,CAAC,CAAC,eAAe,CAAC,CAAA;qCACnB,CAAC,CAAC,cAAc,CAAC,CAAA;GACnD;;QAGD,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC3C,QAAA,KAAK,CAAC,SAAS,GAAG,mBAAmB;IACrC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE;gBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC7C,YAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;IACpB,YAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB;IAClC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;IACxB,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IAClC,gBAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACxF,YAAA,CAAC,CAAC;IACF,YAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACzB;IACA,QAAA,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;QAC9B;IAEA,IAAA,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAC;;;QAIxC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,IAAA,SAAS,CAAC,IAAI,GAAG,QAAQ;IACzB,IAAA,SAAS,CAAC,SAAS,GAAG,+BAA+B;QACrD,SAAS,CAAC,SAAS,GAAG;;YAEZ,CAAC,CAAC,aAAa,CAAC,CAAA;GACzB;IACD,IAAA,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;;QAG/B,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;;;;kGAI8E,CAAC,CAAC,gBAAgB,CAAC,CAAA;;;GAGlH;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,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,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IAChC,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;yCACsB,QAAQ,CAAA;;;;;;KAM5C;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;;QAGA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAChD,IAAA,UAAU,CAAC,SAAS,GAAG,aAAa;IACpC,IAAA,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC9C,IAAA,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;IAC9C,IAAA,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC;;QAGhC,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,qBAAqB,CAA4B;;QAGhG,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC9C,IAAA,QAAQ,CAAC,SAAS,GAAG,0BAA0B,MAAM,CAAC,QAAQ,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,qBAAqB;IACxH,IAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;QACvC,QAAQ,CAAC,SAAS,GAAG;oDAC6B,CAAC,CAAC,OAAO,CAAC,CAAA;AAClD,UAAA,EAAA,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,aAAa,CAAC,CAAA;GAC9C;QAED,OAAO;IACL,QAAA,MAAM,EAAE,QAAQ;YAChB,iBAAiB;YACjB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAY;YACZ,SAAS;YACT,SAAS;YACT,QAAQ;YACR,WAAW;YACX,UAAU;YACV,WAAW;YACX,WAAW;SACZ;IACH;IAEA;IAEA;aACgB,UAAU,CAAC,QAAqB,EAAE,QAAqB,EAAE,SAAmD,EAAA;QAC1H,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;;IAEpC,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB;IACtC,QAAA,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE;YAC9B,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;;YAElD,IAAI,SAAS,EAAE;IACb,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE;IAC7C,YAAA,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1C;IACF,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;IACA,MAAM,mBAAmB,GAAG,EAAE;IAC9B;IACA,SAAS,iBAAiB,GAAA;IACxB,IAAA,OAAO,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;IACjC;IAEA;;;;;;;;IAQG;aACa,kBAAkB,CAChC,UAAuB,EACvB,MAAwC,EACxC,SAAqE,EAAA;QAErE,IAAI,QAAQ,GAAG,KAAK;QACpB,IAAI,MAAM,GAAG,CAAC;QACd,IAAI,MAAM,GAAG,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK;QACpB,IAAI,WAAW,GAAG,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC;QAClB,IAAI,SAAS,GAAG,CAAC;;QAEjB,IAAI,UAAU,GAAG,KAAK;;IAGtB,IAAA,SAAS,gBAAgB,GAAA;YACvB,MAAM,GAAG,GAAG,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAC3D,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG;QAC9B;IAEA,IAAA,SAAS,aAAa,CAAC,OAAe,EAAE,OAAe,EAAA;IACrD,QAAA,IAAI,UAAU;gBAAE;YAChB,QAAQ,GAAG,IAAI;YACf,QAAQ,GAAG,KAAK;YAChB,MAAM,GAAG,OAAO;YAChB,MAAM,GAAG,OAAO;YAChB,WAAW,GAAG,gBAAgB,EAAE;;IAEhC,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK;IAC9B,QAAA,MAAM,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC;YACvC,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC;YACzE,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;QACvE;IAEA,IAAA,SAAS,aAAa,CAAC,OAAe,EAAE,OAAe,EAAE,CAAQ,EAAA;IAC/D,QAAA,IAAI,CAAC,QAAQ;gBAAE;IAEf,QAAA,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM;IAC3B,QAAA,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM;YAE3B,IAAI,CAAC,QAAQ,EAAE;IACb,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;oBAAE;gBAC1C,QAAQ,GAAG,IAAI;;IAEf,YAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC;gBAClD,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;IACxE,YAAA,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;;IAEpC,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC7D,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,UAAU,IAAI;IAC1C,gBAAA,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM;gBAChC;qBAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE;oBAC9C,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,SAAS,IAAI;IACxC,gBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;gBACjC;YACF;YAEA,IAAI,QAAQ,EAAE;IACZ,YAAA,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBAChG,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,SAAS,IAAI;YAC5C;QACF;IAEA,IAAA,SAAS,WAAW,GAAA;IAClB,QAAA,IAAI,CAAC,QAAQ;gBAAE;YACf,QAAQ,GAAG,KAAK;IAEhB,QAAA,IAAI,CAAC,QAAQ;IAAE,YAAA,OAAO;;IAGtB,QAAA,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,gBAAgB,EAAE;IAC/E,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC;;IAGjG,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;IACzC,QAAA,MAAM,QAAQ,GAAqB,MAAM,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO;;IAGrF,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,wBAAwB,CAAC;YACrD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,EAAE,oBAAoB,CAAC;IAC3E,QAAA,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;IAC1B,QAAA,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;YAC3B,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,aAAa,IAAI;;YAG9C,UAAU,GAAG,IAAI;YACjB,MAAM,eAAe,GAAG,MAAW;IACjC,YAAA,UAAU,CAAC,mBAAmB,CAAC,eAAe,EAAE,eAAe,CAAC;IAChE,YAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACjD,YAAA,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;;gBAEhC,UAAU,GAAG,KAAK;IACpB,QAAA,CAAC;IACD,QAAA,UAAU,CAAC,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC;;YAE7D,UAAU,CAAC,MAAK;IACd,YAAA,IAAI,UAAU;IAAE,gBAAA,eAAe,EAAE;YACnC,CAAC,EAAE,GAAG,CAAC;;IAGP,QAAA,MAAM,YAAY,GAAG,CAAC,EAAS,KAAU;gBACvC,EAAE,CAAC,eAAe,EAAE;gBACpB,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC;IAC7D,QAAA,CAAC;YACD,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC;;YAGxD,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC;IAC9D,QAAA,IAAI,KAAK;IAAG,YAAA,KAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;YAEpD,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACtD;QACF;;IAGA,IAAA,SAAS,WAAW,CAAC,CAAa,EAAA,EAAU,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,IAAA,SAAS,WAAW,CAAC,CAAa,IAAU,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,IAAA,SAAS,SAAS,GAAA,EAAW,WAAW,EAAE,CAAC,CAAC;;QAG5C,SAAS,YAAY,CAAC,CAAa,EAAA;IACjC,QAAA,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;IAAE,YAAA,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACvF;QACA,SAAS,WAAW,CAAC,CAAa,EAAA;IAChC,QAAA,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F;IACA,IAAA,SAAS,UAAU,GAAA,EAAW,WAAW,EAAE,CAAC,CAAC;IAE7C,IAAA,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;IACrD,IAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;IACnD,IAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/C,IAAA,UAAU,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1E,IAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvE,IAAA,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC;IAEjD,IAAA,OAAO,MAAK;IACV,QAAA,UAAU,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACxD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACtD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;IAClD,QAAA,UAAU,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC;IAC1D,QAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;IACtD,QAAA,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC;IACtD,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,uCAAuC;IAC1D,IAAA,MAAM,CAAC,SAAS,GAAG,SAAS;QAE5B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,kBAAkB;QAEtC,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,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;IAC5B,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAE9B,IAAA,OAAO,OAAO;IAChB;IAEA;IACM,SAAU,cAAc,CAAC,SAAsB,EAAE,IAAY,EAAE,SAAiB,EAAE,QAAmC,EAAE,KAAc,EAAA;QACzI,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,qBAAqB;IACzC,IAAA,IAAI,KAAK;IAAE,QAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,KAAK;QAE3C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,qCAAqC;IACxD,IAAA,MAAM,CAAC,SAAS,GAAG,QAAQ;QAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,kBAAkB;QAEtC,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;;QAE3B,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,IAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IACzB,IAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;IAC5B,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;;QAG9B,iBAAiB,CAAC,MAAM,CAAC;IAEzB,IAAA,OAAO,OAAO;IAChB;IAEA;aACgB,mBAAmB,CAAC,SAAsB,EAAE,SAAiB,EAAE,KAAc,EAAA;QAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,wCAAwC;IAC5D,IAAA,IAAI,KAAK;IAAE,QAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,GAAG,KAAK;QAE3C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,IAAA,MAAM,CAAC,SAAS,GAAG,qCAAqC;IACxD,IAAA,MAAM,CAAC,SAAS,GAAG,QAAQ;QAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,kBAAkB;QAEtC,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;QAC3B,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,IAAA,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IACzB,IAAA,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3B,IAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;IAC5B,IAAA,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;IAE9B,IAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;IAC5B;IAEA;IAEA;IACA,MAAM,SAAS,GAAG,CAAA,sTAAA,CAAwT;IAC1U;IACA,MAAM,UAAU,GAAG,CAAA,+QAAA,CAAiR;IAEpS;IACA,SAAS,cAAc,CAAC,MAAmB,EAAE,OAAoB,EAAA;QAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACzC,IAAA,GAAG,CAAC,SAAS,GAAG,kBAAkB;;QAGlC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,IAAA,OAAO,CAAC,IAAI,GAAG,QAAQ;IACvB,IAAA,OAAO,CAAC,SAAS,GAAG,gBAAgB;QACpC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAA,OAAO,CAAC,SAAS,GAAG,SAAS;QAC7B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAI;YAC5C,CAAC,CAAC,eAAe,EAAE;IACnB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE;IACrC,QAAA,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;IACtC,IAAA,CAAC,CAAC;;QAGF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IACjD,IAAA,QAAQ,CAAC,IAAI,GAAG,QAAQ;IACxB,IAAA,QAAQ,CAAC,SAAS,GAAG,gBAAgB;QACrC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1C,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAA,QAAQ,CAAC,SAAS,GAAG,UAAU;QAC/B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACvC,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3C,IAAI,IAAI,EAAE;IACR,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE;oBAC9C,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE;IAChD,aAAA,CAAC,CAAC;YACL;IACF,IAAA,CAAC,CAAC;;QAGF,MAAM,QAAQ,GAAG,CAAA,0TAAA,CAA4T;QAC7U,MAAM,UAAU,GAAG,CAAA,4UAAA,CAA8U;QAEjW,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC9C,IAAA,KAAK,CAAC,IAAI,GAAG,QAAQ;IACrB,IAAA,KAAK,CAAC,SAAS,GAAG,kBAAkB;QACpC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;QAC7C,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAClD,IAAA,KAAK,CAAC,SAAS,GAAG,QAAQ;QAC1B,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACpC,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3C,IAAI,IAAI,EAAE;IACR,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;IACjD,gBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI;IAC7D,aAAA,CAAC,CAAC;YACL;IACF,IAAA,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAChD,IAAA,OAAO,CAAC,IAAI,GAAG,QAAQ;IACvB,IAAA,OAAO,CAAC,SAAS,GAAG,kBAAkB;QACtC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QACjD,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACtD,IAAA,OAAO,CAAC,SAAS,GAAG,UAAU;QAC9B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;YACtC,CAAC,CAAC,eAAe,EAAE;YACnB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3C,IAAI,IAAI,EAAE;IACR,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;IACjD,gBAAA,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM;IAC/D,aAAA,CAAC,CAAC;YACL;IACF,IAAA,CAAC,CAAC;IAEF,IAAA,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;IACxB,IAAA,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC;IACzB,IAAA,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;IACtB,IAAA,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC;IACxB,IAAA,OAAO,GAAG;IACZ;IAEA;;;;IAIG;IACG,SAAU,gBAAgB,CAAC,OAAoB,EAAE,KAAgC,EAAA;QACrF,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;IAC1D,IAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE;IACrB,IAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;IAC/E,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAChF,IAAA,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;IAAE,QAAA,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5F;IAEA;IACA,eAAe,eAAe,CAAC,IAAY,EAAE,GAAgB,EAAA;IAC3D,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS;IAC9B,IAAA,IAAI;YACF,IAAI,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE;gBACjD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;YAC3C;iBAAO;;gBAEL,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;IAC7C,YAAA,EAAE,CAAC,KAAK,GAAG,IAAI;IACf,YAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;IAC3B,YAAA,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;IACtB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,MAAM,EAAE;IACX,YAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;IAC5B,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B;IACA,QAAA,GAAG,CAAC,SAAS,GAAG,CAAA,gOAAA,CAAkO;IAClP,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACzC,UAAU,CAAC,MAAK;IACd,YAAA,GAAG,CAAC,SAAS,GAAG,QAAQ;IACxB,YAAA,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC;YAC9C,CAAC,EAAE,IAAI,CAAC;QACV;IAAE,IAAA,OAAA,EAAA,EAAM;;QAER;IACF;IAEA;IACM,SAAU,iBAAiB,CAAC,MAAmB,EAAA;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;IAC5D,IAAA,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;IACrB,QAAA,IAAI,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC;gBAAE;YAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;YACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC5C,QAAA,GAAG,CAAC,IAAI,GAAG,QAAQ;IACnB,QAAA,GAAG,CAAC,SAAS,GAAG,kBAAkB;YAClC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACpC,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,QAAA,GAAG,CAAC,SAAS,GAAG,SAAS;YACzB,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAI;gBACxC,CAAC,CAAC,eAAe,EAAE;IACnB,YAAA,MAAM,eAAe,CAAC,CAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,WAAW,KAAI,EAAE,EAAE,GAAG,CAAC;IACvD,QAAA,CAAC,CAAC;IACD,QAAA,GAAmB,CAAC,WAAW,CAAC,GAAG,CAAC;IACvC,IAAA,CAAC,CAAC;IACJ;IAEA;IACM,SAAU,oBAAoB,CAAC,MAAmB,EAAA;IACtD,IAAA,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC;YAAE;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IAC5C,IAAA,KAAK,CAAC,SAAS,GAAG,WAAW;IAC7B,IAAA,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;IACzC,IAAA,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;IAC3B;IAEA;IACM,SAAU,gBAAgB,CAAC,OAAoB,EAAE,MAAmB,EAAA;IACxE,IAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC;IAChD,IAAA,IAAI,KAAK;YAAE,KAAK,CAAC,MAAM,EAAE;QACzB,iBAAiB,CAAC,MAAM,CAAC;IAC3B;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;IACtD,IAAA,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE;YAC/B,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;QACnD;aAAO;IACL,QAAA,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC;QAChC;IACF;IAcA;IACA,SAAS,kBAAkB,CAAC,KAAwB,EAAA;IAClD,IAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACvF,IAAA,MAAM,cAAc,GAAG,UAAU,GAAG,QAAQ;IAC5C,IAAA,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAEzE,IAAA,MAAM,MAAM,GAAsC;IAChD,QAAA,KAAK,EAAE,EAAE;IACT,QAAA,SAAS,EAAE,EAAE;IACb,QAAA,IAAI,EAAE,EAAE;IACR,QAAA,OAAO,EAAE,EAAE;SACZ;IAED,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;;YAExB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS;IACtD,QAAA,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;IAEpD,QAAA,IAAI,EAAE,IAAI,UAAU,EAAE;IACpB,YAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB;IAAO,aAAA,IAAI,EAAE,IAAI,cAAc,EAAE;IAC/B,YAAA,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B;IAAO,aAAA,IAAI,EAAE,IAAI,SAAS,EAAE;IAC1B,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACxB;iBAAO;IACL,YAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B;QACF;QAEA,MAAM,MAAM,GAAkD,EAAE;IAChE,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM;IAAE,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9F,IAAA,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM;IAAE,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IAC1G,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;IAAE,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3F,IAAA,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;IAAE,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACpG,IAAA,OAAO,MAAM;IACf;IAEA;IACM,SAAU,iBAAiB,CAC/B,MAAmB,EACnB,KAAwB,EACxB,QAA0C,EAC1C,QAA8B,EAC9B,QAA8B,EAC9B,YAAqB,EACrB,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;;IAGA,IAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC;IACxC,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;;IAE1B,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,YAAA,OAAO,CAAC,SAAS,GAAG,mBAAmB;gBACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7C,YAAA,OAAO,CAAC,SAAS,GAAG,0BAA0B;IAC9C,YAAA,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK;IACjC,YAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;IAC5B,YAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAC7B;IAEA,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;gBAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IACxC,YAAA,EAAE,CAAC,SAAS,GAAG,kBAAkB;;gBAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE;IACrC,YAAA,IAAI,YAAY,IAAI,MAAM,KAAK,YAAY,EAAE;IAC3C,gBAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;gBAC9C;gBAEA,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,wBAAwB;gBAEzC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C,YAAA,IAAI,CAAC,SAAS,GAAG,sBAAsB;;IAEvC,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG;IAClD,sBAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;IAC7C,sBAAE,IAAI,CAAC,kBAAkB;gBAC7B;qBAAO;IACL,gBAAA,IAAI,CAAC,WAAW,GAAG,MAAM;gBAC3B;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5C,YAAA,MAAM,CAAC,SAAS,GAAG,wBAAwB;gBAC3C,MAAM,SAAS,GAAa,EAAE;IAC9B,YAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,YAAY,CAAA,IAAA,CAAM,CAAC;gBAC/E,IAAI,IAAI,CAAC,eAAe;IAAE,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;qBACzD,IAAI,IAAI,CAAC,SAAS;IAAE,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvD,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAE1C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACtB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;IAC/C,YAAA,SAAS,CAAC,SAAS,GAAG,2BAA2B;;gBAGjD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,YAAA,SAAS,CAAC,SAAS,GAAG,+CAA+C;gBACrE,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpD,YAAA,SAAS,CAAC,SAAS,GAAG,CAAA,2TAAA,CAA6T;gBACnV,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;oBACxC,CAAC,CAAC,eAAe,EAAE;IACnB,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnB,YAAA,CAAC,CAAC;;gBAGF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAClD,YAAA,SAAS,CAAC,SAAS,GAAG,+CAA+C;gBACrE,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpD,YAAA,SAAS,CAAC,SAAS,GAAG,CAAA,sTAAA,CAAwT;gBAC9U,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;oBACxC,CAAC,CAAC,eAAe,EAAE;IACnB,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnB,YAAA,CAAC,CAAC;IAEF,YAAA,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IAChC,YAAA,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IAEhC,YAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;IACpB,YAAA,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;;IAGzB,YAAA,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;oBAChC,QAAQ,CAAC,MAAM,CAAC;IAClB,YAAA,CAAC,CAAC;IAEF,YAAA,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACxB;IACA,IAAA,CAAC;IACH;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;;ICvkCA,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;;ICxKA,IAAIA,QAAM,GAA0B,IAAI;IACxC,IAAI,QAAQ,GAAkB,EAAE;IAChC,IAAIC,mBAAiB,GAAuB,IAAI;IAChD,IAAIC,SAAO,GAA+B,IAAI;IAC9C,IAAI,SAAS,GAAuB,IAAI;IACxC,IAAIC,SAAO,GAAuB,IAAI;IACtC,IAAIC,UAAQ,GAAuB,IAAI;IACvC,IAAIC,gBAAc,GAA6B,IAAI;IACnD,IAAIC,cAAY,GAAuB,IAAI;IAC3C,IAAI,SAAS,GAAuB,IAAI;IACxC,IAAI,SAAS,GAAuB,IAAI;IACxC,IAAI,WAAW,GAA4B,IAAI;IAC/C,IAAI,UAAU,GAAuB,IAAI;IACzC,IAAIC,eAAa,GAA+B,IAAI;IACpD,IAAIC,eAAa,GAAwB,IAAI;IAC7C,IAAI,SAAS,GAAG,KAAK;IAErB;IACA,IAAI,eAAe,GAA2B,IAAI;IAClD;IACA,IAAI,YAAY,GAAG,IAAI;IAEvB;IACA,IAAI,YAAY,GAAsB,EAAE;IACxC;IACA,IAAI,iBAAiB,GAAG,EAAE;IAE1B;IACA,IAAI,iBAAqC;IAEzC;IACA,IAAI,MAAM,GAAG,KAAK;IAElB;;IAEG;IACG,SAAU,QAAQ,CACtB,GAAmB,EACnB,GAaC,EAAA;QAEDR,QAAM,GAAG,GAAG;IACZ,IAAAC,mBAAiB,GAAG,GAAG,CAAC,iBAAiB;IACzC,IAAAC,SAAO,GAAG,GAAG,CAAC,OAAO;IACrB,IAAA,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa;IACrC,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,IAAA,SAAS,GAAG,GAAG,CAAC,SAAS;IACzB,IAAA,SAAS,GAAG,GAAG,CAAC,SAAS;IACzB,IAAA,WAAW,GAAG,GAAG,CAAC,WAAW;IAC7B,IAAA,UAAU,GAAG,GAAG,CAAC,UAAU;IAC3B,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,GAAG,CAAC,SAAS;;IAGtB,IAAA,cAAc,EAAE;;IAGhB,IAAA,gBAAgB,EAAE;;IAGlB,IAAA,iBAAiB,EAAE;;IAGnB,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;;IAG1B,IAAAA,SAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACrC,QAAA,IAAI,SAAS,IAAI,eAAe,EAAE;gBAChC,eAAe,CAAC,KAAK,EAAE;gBACvB;YACF;IACA,QAAA,UAAU,EAAE;IACd,IAAA,CAAC,CAAC;QAEFD,SAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAgB,KAAI;;IAEvD,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBACtD,CAAC,CAAC,cAAc,EAAE;IAClB,YAAA,UAAU,EAAE;YACd;IACF,IAAA,CAAC,CAAC;IAEF,IAAAA,SAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACrC,QAAA,kBAAkB,EAAE;IACpB,QAAA,eAAe,EAAE;IACnB,IAAA,CAAC,CAAC;;IAGF,IAAAA,SAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACrC,QAAA,IAAI,SAAS;IAAE,YAAA,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACjE,IAAA,CAAC,CAAC;IACF,IAAAA,SAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAK;IACpC,QAAA,IAAI,SAAS;IAAE,YAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC;IACpE,IAAA,CAAC,CAAC;QAEF,IAAIE,UAAQ,EAAE;YACZA,UAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,WAAW,EAAE,CAAC;QACzD;IACF;IAEA;IACA,SAAS,gBAAgB,GAAA;IACvB,IAAA,IAAI,CAACH,mBAAiB;YAAE;IACxB,IAAAA,mBAAiB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;IAChD,QAAA,IAAI,CAACA,mBAAiB;gBAAE;YACxB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAGA,mBAAiB;;YAEnE,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,EAAE;IAC3D,QAAA,IAAI,YAAY;IAAE,YAAA,aAAa,EAAE;IACnC,IAAA,CAAC,CAAC;;QAEF,IAAI,SAAS,EAAE;IACb,QAAA,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;IACvC,YAAA,IAAIA,mBAAiB;oBAAE,cAAc,CAACA,mBAAiB,CAAC;gBACxD,YAAY,GAAG,IAAI;IACnB,YAAA,aAAa,EAAE;IACjB,QAAA,CAAC,CAAC;QACJ;IACF;IAEA;IACA,SAAS,aAAa,GAAA;IACpB,IAAA,IAAI,SAAS;IAAE,QAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACjE;IAEA;IACA,SAAS,aAAa,GAAA;IACpB,IAAA,IAAI,SAAS;IAAE,QAAA,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC9D;IAEA;IACA,SAAS,mBAAmB,GAAA;IAC1B,IAAA,IAAI,CAACA,mBAAiB;YAAE;QACxB,IAAI,YAAY,EAAE;YAChB,cAAc,CAACA,mBAAiB,CAAC;QACnC;aAAO;IACL,QAAA,aAAa,EAAE;QACjB;IACF;IAEA;IACA,SAAS,iBAAiB,CAAC,IAAqB,EAAA;IAC9C,IAAA,IAAI,CAACE,SAAO;YAAE;IACd,IAAA,IAAI,IAAI,KAAK,MAAM,EAAE;IACnB,QAAAA,SAAO,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC3C,QAAAA,SAAO,CAAC,eAAe,CAAC,UAAU,CAAC;YACnCA,SAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACxCA,SAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAAA,SAAO,CAAC,SAAS,GAAG,CAAA,4OAAA,CAA8O;QACpQ;aAAO;IACL,QAAAA,SAAO,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC9CA,SAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACxCA,SAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAAA,SAAO,CAAC,SAAS,GAAG,CAAA,8QAAA,CAAgR;IACpS,QAAA,kBAAkB,EAAE;QACtB;IACF;IAEA;IAEA;IACA,SAAS,iBAAiB,GAAA;IACxB,IAAA,IAAI,CAAC,WAAW;YAAE;IAClB,IAAA,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;YACzC,iBAAiB,GAAG,WAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;IAC3D,QAAA,qBAAqB,EAAE;IACzB,IAAA,CAAC,CAAC;IACJ;IAEA;IACA,SAAS,qBAAqB,GAAA;IAC5B,IAAA,MAAM,MAAM,GAAGG,cAAY,KAAA,IAAA,IAAZA,cAAY,KAAA,MAAA,GAAA,MAAA,GAAZA,cAAY,CAAE,aAAa,CAAC,mBAAmB,CAAuB;IACrF,IAAA,IAAI,CAAC,MAAM,IAAI,CAACN,QAAM;YAAE;QAExB,MAAM,QAAQ,GAAG;IACf,UAAE,YAAY,CAAC,MAAM,CAAC,IAAI,IAAG;gBACzB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE;IACvF,YAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,QAAA,CAAC;cACD,YAAY;IAEhB,IAAA,iBAAiB,CACf,MAAM,EACN,QAAQ,EACR,CAAC,cAAsB,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EACrE,CAAC,EAAU,KAAI,EAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EACxE,OAAO,EAAU,KAAI;IACnB,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;gBAAE;IAC3C,QAAA,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,EAAE,CAAC;YACvC,IAAI,EAAE,EAAE;IACN,YAAA,IAAI,EAAE,KAAK,SAAS,EAAE,EAAE;oBACtB,QAAQ,GAAG,EAAE;oBACb,IAAIC,mBAAiB,EAAE;IACrB,oBAAAA,mBAAiB,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;oBACzF;IACA,gBAAA,IAAIG,UAAQ;IAAE,oBAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7C,gBAAA,gBAAgB,EAAE;gBACpB;;gBAEA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACrE,YAAA,qBAAqB,EAAE;YACzB;IACF,IAAA,CAAC,EACD,SAAS,EAAE,CACZ;IACH;IAEA;IAEA;IACA,SAAS,eAAe,CAAC,IAAY,EAAA;IACnC,IAAA,IAAI,CAAC,UAAU;YAAE;;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI;QACzE,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,GAAG,GAAG,GAAG,OAAO;IAChE;IAEA;IAEA;;;IAGG;IACG,SAAU,cAAc,CAAC,KAAa,EAAE,KAAoB,EAAA;IAChE,IAAA,IAAI,CAACH,mBAAiB;YAAE;QAExB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;IACjE,IAAA,IAAI,CAAC,GAAG;YAAE;;IAGV,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,KAAK,GAAG,SAAS,GAAG,KAAK;IAC3D,IAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ;;QAGvB,MAAM,OAAO,GAAGA,mBAAiB,CAAC,aAAa,CAAC,CAAA,kBAAA,EAAqB,KAAK,CAAA,EAAA,CAAI,CAAgB;IAC9F,IAAA,IAAI,OAAO;IAAE,QAAA,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;;IAGhD,IAAA,IAAID,QAAM;IAAE,QAAA,YAAY,CAACA,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;;QAGtD,IAAI,QAAQ,EAAE;IACZ,QAAA,MAAM,YAAY,GAAG,QAAQ,KAAK,IAAI,GAAG,WAAW,GAAG,aAAa;IACpE,QAAA,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,IAAG;gBAC5D,IAAI,OAAO,EAAE;oBACX,MAAM,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,KAAK,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAC;gBACzD;qBAAO;IACL,gBAAA,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAA,SAAA,CAAW,CAAC;gBACjD;IACF,QAAA,CAAC,CAAC;QACJ;aAAO;IACL,QAAA,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAA,CAAE,CAAC;QACvC;IACF;IACA,SAAS,eAAe,GAAA;IACtB,IAAA,IAAI,CAACE,SAAO;YAAE;IACd,IAAAA,SAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;IAC7B,IAAAA,SAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAACA,SAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI;IACnE;IAEA;IACA,SAAS,gBAAgB,GAAA;IACvB,IAAA,IAAI,CAAC,SAAS;YAAE;IAChB,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;aACpCD,mBAAiB,IAAIA,mBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACpE,IAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,EAAE;IACrD;IAEA;IACA,SAAS,kBAAkB,GAAA;IACzB,IAAA,IAAI,CAACE,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;;IAG7B,IAAA,MAAM,aAAa,GAAG,GAAG,EAAE;QAC3B,MAAM,OAAO,GAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE;IAClG,IAAA,IAAID,mBAAiB;IAAE,QAAA,gBAAgB,CAACA,mBAAiB,EAAE,IAAI,EAAE,aAAa,CAAC;IAC/E,IAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAEtB,IAAA,gBAAgB,EAAE;IAClB,IAAA,IAAIG,UAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;IAAE,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa;IAC3E,IAAA,IAAIH,mBAAiB;IAAE,QAAA,mBAAmB,EAAE;;IAG5C,IAAA,MAAM,cAAc,CAAC,IAAI,CAAC;IAC5B;IAEA;;;IAGG;IACH,eAAe,cAAc,CAAC,QAAgB,EAAA;IAC5C,IAAA,IAAI,CAACD,QAAM,IAAI,CAACC,mBAAiB;YAAE;QAEnC,SAAS,GAAG,IAAI;QAChB,iBAAiB,CAAC,MAAM,CAAC;;IAGzB,IAAA,IAAI,CAACD,QAAM,CAAC,MAAM,EAAE;YAClB,MAAM,UAAU,EAAE;QACpB;IAEA,IAAA,MAAM,WAAW,GAAG,GAAG,EAAE;;QAEzB,MAAM,YAAY,GAAG,MAAM;;IAG3B,IAAA,IAAIO,eAAa;IAAE,QAAAA,eAAa,EAAE;IAClC,IAAA,IAAIN,mBAAiB;IAAE,QAAA,mBAAmB,EAAE;IAE5C,IAAA,MAAM,OAAO,GAAG,IAAI,EAAE;QACtB,IAAI,SAAS,GAAG,EAAE;IAElB,IAAA,IAAI;IACF,QAAA,IAAID,QAAM,CAAC,SAAS,EAAE;IACpB,YAAA,SAAS,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC;YACnF;iBAAO;IACL,YAAA,SAAS,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;IACvC,YAAA,IAAIQ,eAAa;IAAE,gBAAAA,eAAa,EAAE;gBAClC,IAAIP,mBAAiB,EAAE;oBACrB,cAAc,CAACA,mBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC;gBACpF;YACF;IACA,QAAA,MAAM,KAAK,GAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE;IAClG,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAEpB,QAAA,YAAY,CAACD,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC1C,QAAA,IAAIC,mBAAiB;IAAE,YAAA,mBAAmB,EAAE;;YAG5C,eAAe,CAAC,SAAS,CAAC;;YAG1B,IAAIA,mBAAiB,EAAE;gBACrBA,mBAAiB,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/G;;IAGA,QAAA,IAAI,YAAY;IAAE,YAAA,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC1D;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;YACjB,eAAe,GAAG,IAAI;YACtB,iBAAiB,CAAC,MAAM,CAAC;IACzB,QAAA,kBAAkB,EAAE;QACtB;IACF;IAEA;IACA,eAAe,iBAAiB,CAAC,IAAY,EAAE,WAAmB,EAAE,YAAqB,EAAE,OAAe,EAAA;;IAExG,IAAA,eAAe,GAAG,IAAI,eAAe,EAAE;IACvC,IAAA,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM;QAErC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,IAAI,QAAQ,GAAuB,IAAI;YACvC,IAAI,SAAS,GAAuB,IAAI;YACxC,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;IAClC,gBAAA,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAACP,mBAAiB,EAAE,WAAW,EAAE,OAAO,CAAC;oBACxF,SAAS,GAAG,OAAO;oBACnB,QAAQ,GAAG,MAAM;oBACjB,aAAa,GAAG,IAAI;gBACtB;gBACA,IAAI,QAAQ,EAAE;IACZ,gBAAA,QAAQ,CAAC,WAAW,GAAG,WAAW;oBAClC,oBAAoB,CAAC,QAAQ,CAAC;gBAChC;IACA,YAAA,IAAIA,mBAAiB;IAAE,gBAAA,mBAAmB,EAAE;YAC9C,CAAC,EACD,MAAK;;IAEH,YAAA,IAAI,SAAS,IAAI,QAAQ,EAAE;;IAEzB,gBAAA,IAAI,CAAC,aAAa,IAAI,WAAW,KAAK,EAAE,EAAE;IACxC,oBAAA,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;wBAC7C;oBACF;IACA,gBAAA,IAAI,WAAW;IAAE,oBAAA,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;IACjE,gBAAA,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;gBACvC;gBACA,OAAO,CAAC,WAAW,CAAC;IACtB,QAAA,CAAC,EACD,CAAC,KAAe,KAAI;IAClB,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1B,IAAI,QAAQ,EAAE;IACZ,oBAAA,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnF,oBAAA,IAAI,SAAS;IAAE,wBAAA,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;oBACtD;oBACA,OAAO,CAAC,WAAW,CAAC;gBACtB;qBAAO;oBACL,MAAM,CAAC,KAAK,CAAC;gBACf;IACF,QAAA,CAAC,EACD,iBAAiB,EACjB,YAAY,EACZ,MAAM,CACP;IACH,IAAA,CAAC,CAAC;IACJ;IAEA;;IAEG;IACG,SAAU,cAAc,CAAC,IAAY,EAAA;QACzC,IAAI,CAACC,SAAO,IAAI,SAAS;IAAE,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IACnD,IAAAA,SAAO,CAAC,KAAK,GAAG,IAAI;IACpB,IAAA,kBAAkB,EAAE;QACpB,OAAO,UAAU,EAAE;IACrB;IAEA;;;IAGG;IACI,eAAe,gBAAgB,CAAC,KAAa,EAAA;IAClD,IAAA,IAAI,CAACF,QAAM,IAAI,CAACC,mBAAiB,IAAI,SAAS;YAAE;QAEhD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;QAC1E,IAAI,OAAO,GAAG,CAAC;YAAE;;QAGjB,IAAI,QAAQ,GAAG,EAAE;IACjB,IAAA,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE;IAAE,YAAA,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO;gBAAE;YAAO;QAC5E;IACA,IAAA,IAAI,CAAC,QAAQ;YAAE;;QAGf,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACxC,IAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAGA,mBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC;IAC5D,IAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;IACnB,QAAA,MAAM,EAAE,GAAI,IAAoB,CAAC,OAAO,CAAC,QAAQ;;IAEjD,QAAA,IAAI,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,MAAM,EAAE;IAC7C,IAAA,CAAC,CAAC;IAEF,IAAA,YAAY,CAACD,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC1C,IAAA,gBAAgB,EAAE;;IAGlB,IAAA,MAAM,cAAc,CAAC,QAAQ,CAAC;IAChC;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,IAAIC,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;gBACL,MAAM,OAAO,GAAG,cAAc,CAACA,mBAAiB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC;gBACrG,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;IAAE,gBAAA,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;gBAC9E,IAAI,GAAG,CAAC,QAAQ;IAAE,gBAAA,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC;YAC3D;QACF;QAEA,YAAY,GAAG,IAAI;QACnB,cAAc,CAACA,mBAAiB,CAAC;IACjC,IAAA,IAAIG,UAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;IAAE,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa;IAC3E,IAAA,gBAAgB,EAAE;QAElB,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,gBAAgB,EAAE;IAClB,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;QAC9B,MAAM,GAAG,CAAA,EAAA,GAAAA,QAAM,KAAA,IAAA,IAANA,QAAM,KAAA,MAAA,GAAA,MAAA,GAANA,QAAM,CAAE,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;QAClC,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;YACpF,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;IACnC,YAAA,EAAE,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;IAC1B,YAAA,MAAM,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;gBAC9B,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;IACxC,YAAA,SAAS,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,SAAS;IAC7C,SAAA,CAAC,CAAC;;YAGH,iBAAiB,GAAG,EAAE;IACtB,QAAA,IAAI,WAAW;IAAE,YAAA,WAAW,CAAC,KAAK,GAAG,EAAE;IAEvC,QAAA,iBAAiB,CACf,MAAM,EACN,YAAY,EACZ,CAAC,cAAsB,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EACrE,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;gBACvC,IAAI,EAAE,EAAE;IACN,gBAAA,IAAI,EAAE,KAAK,SAAS,EAAE,EAAE;wBACtB,QAAQ,GAAG,EAAE;wBACb,IAAIC,mBAAiB,EAAE;IACrB,wBAAAA,mBAAiB,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;wBACzF;IACA,oBAAA,IAAIG,UAAQ;IAAE,wBAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;IAC7C,oBAAA,gBAAgB,EAAE;oBACpB;;oBAEA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACrE,gBAAA,qBAAqB,EAAE;gBACzB;IACF,QAAA,CAAC,EACD,SAAS,EAAE,CACZ;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;IAEA;;;IAGG;IACI,eAAe,oBAAoB,CAAC,cAAsB,EAAA;IAC/D,IAAA,IAAI,CAACJ,QAAM,IAAI,CAACC,mBAAiB;YAAE;IAEnC,IAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,cAAc,CAAA,CAAE,CAAC;;QAGrD,YAAY,CAAC,cAAc,CAAC;QAC5B,gBAAgB,CAACD,QAAM,CAAC,WAAW,EAAEA,QAAM,CAAC,MAAM,EAAE,cAAc,CAAC;;QAGnE,IAAIM,cAAY,EAAE;IAChB,QAAAA,cAAY,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC;QACzD;;QAGA,QAAQ,GAAG,EAAE;QACb,MAAM,IAAI,GAAGL,mBAAiB,CAAC,gBAAgB,CAAC,wBAAwB,CAAC;IACzE,IAAA,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;;IAG/B,IAAA,IAAI;IACF,QAAA,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,cAAc,CAAC;YAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;IAC9B,YAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;oBACvC,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,KAAA,EAAQ,cAAc,CAAA,GAAA,EAAM,QAAQ,CAAC,MAAM,CAAA,IAAA,CAAM,CAAC;;IAG9D,YAAA,YAAY,CAACD,QAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;YAC5C;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,EAAE,GAAG,CAAC;QAC/D;;QAGA,IAAII,UAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;IACnC,QAAAA,UAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa;QACxC;IACA,IAAA,gBAAgB,EAAE;IACpB;;IC5xBA;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;IAC3C,IAAI,mBAAmB,GAAwB,IAAI;IAEnD;IACA,IAAI,WAAW,GAAsD,IAAI;IAEzE;IACA,IAAI,QAAQ,GAAuB,IAAI;IACvC;IACA,IAAI,WAAW,GAAyC,IAAI;IAC5D;IACA,IAAI,OAAO,GAAuB,IAAI;IAEtC;IACA,IAAI,QAAQ,GAAwB,IAAI;IAExC;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;;IAGtB,IAAA,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;;QAGhC,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,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,sBAAsB,CAAC;;IAG1D,IAAA,uBAAuB,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;;QAGvD,mBAAmB,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,KAAI;YACnE,WAAW,GAAG,GAAG;IACjB,QAAA,oBAAoB,CAAC,MAAO,CAAC,WAAW,EAAE,GAAG,CAAC;;IAE9C,QAAA,mBAAmB,EAAE;IACrB,QAAA,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;;IAE7B,QAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IAClE,YAAA,cAAc,EAAE;YAClB;IACF,IAAA,CAAC,CAAC;;QAGF,IAAI,WAAW,EAAE;IACf,QAAA,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC;QACvC;;IAGA,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;;IAGnC,IAAA,QAAQ,GAAG,GAAG,CAAC,QAAQ;IACvB,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACnC,IAAA,cAAc,EAAE;;QAGhB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAgB;QACrE,IAAI,QAAQ,EAAE;YACZ,WAAW,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAG,KAAI;IACnD,YAAA,kBAAkB,CAAC,MAAO,CAAC,WAAW,EAAE,GAAG,CAAC;IAC9C,QAAA,CAAC,CAAC;QACJ;;IAGA,IAAA,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC;;QAGnD,QAAQ,CAAC,MAAM,EAAE;YACf,iBAAiB;YACjB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,cAAc;YACd,YAAY;YACZ,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;IAC1B,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;;QAGF,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,GAAG,CAAC,CAAc,KAAI;IAC9D,QAAA,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,CAAC,EAAmB;;QAGpB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,GAAG,CAAC,CAAc,KAAI;IACzD,QAAA,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAClC,CAAC,EAAmB;;QAGpB,QAAQ,CAAC,gBAAgB,CAAC,cAAc,GAAG,CAAC,CAAc,KAAI;IAC5D,QAAA,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAChD,CAAC,EAAmB;;QAGpB,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,GAAG,CAAC,CAAc,KAAI;;IAC9D,QAAA,gBAAgB,EAAE;;IAElB,QAAA,IAAI,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,SAAS,MAAI,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,0CAAE,GAAG,CAAA,EAAE;IACtC,YAAA,IAAI;oBAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE;IAAE,YAAA,yBAAyB,EAAA,EAAnB,oBAAoB;YACpE;QACF,CAAC,EAAmB;;IAGpB,IAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;;IAG/C,IAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAE3C,aAAa,GAAG,IAAI;QACpB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;;IAG9D,IAAA,IAAI,MAAM,CAAC,OAAO,EAAE;IAClB,QAAA,IAAI;gBAAE,MAAM,CAAC,OAAO,EAAE;YAAE;IAAE,QAAA,yBAAyB,EAAA,EAAnB,oBAAoB;QACtD;;IAGA,IAAA,IAAI,MAAM,CAAC,UAAU,EAAE;IACrB,QAAA,WAAW,GAAG,UAAU,CAAC,MAAK;;gBAE5B,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IACjE,gBAAA,UAAU,EAAE;gBACd;YACF,CAAC,EAAE,IAAI,CAAC;QACV;;IAGA,IAAA,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,IAAG;IAC5B,QAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;IAC5C,IAAA,CAAC,CAAC;IACJ;IAEA;IAEA;IACA,SAAS,cAAc,GAAA;IACrB,IAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU;YAAE;;IAE9B,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,EAAE;QAC/C,MAAM,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC,IAAI,KAAK,MAAM,GAAG,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,QAAQ,MAAK,aAAa;QAC7F,IAAI,MAAM,EAAE;YACV,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;IACtC,QAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;QAC/B;aAAO;IACL,QAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAA,EAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI;IAC5D,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM;QAC9B;IACA,IAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI;;QAEhE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC;QACvD,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC;IACzD;IAEA,SAAS,UAAU,GAAA;IACjB,IAAA,IAAI,CAAC,QAAQ;YAAE;IACf,IAAA,cAAc,EAAE;IAChB,IAAA,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;;IAE/C,IAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;;QAEjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC;QAC7D,IAAI,QAAQ,EAAE;IACZ,QAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC;QACnD;IACF;IAEA,SAAS,UAAU,GAAA;IACjB,IAAA,IAAI,CAAC,QAAQ;YAAE;IACf,IAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC5C,IAAA,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAC;IAC7D,IAAA,IAAI,QAAQ;IAAE,QAAA,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;IACpE;IAEA,SAAS,aAAa,CAAC,CAAQ,EAAA;;IAE7B,IAAA,IAAK,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,oBAAoB,CAAC;YAAE;IAC7D,IAAA,UAAU,EAAE;IACZ,IAAA,IAAI,EAAE;IACR;IAEA,SAAS,aAAa,CAAC,CAAQ,EAAA;QAC7B,CAAC,CAAC,eAAe,EAAE;IACnB,IAAA,UAAU,EAAE;IACd;IAEA,SAAS,QAAQ,GAAA;IACf,IAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IAClE,QAAA,cAAc,EAAE;QAClB;IACF;IAEA;IAEA,SAAS,SAAS,GAAA;IAChB,IAAA,IAAI,OAAO;IAAE,QAAA,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,6BAA6B,CAAC;IACtE;IAEA,SAAS,SAAS,GAAA;IAChB,IAAA,IAAI,OAAO;IAAE,QAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACnE;IAEA;IACA,SAAS,gBAAgB,GAAA;QACvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IACjE,QAAA,SAAS,EAAE;;IAEX,QAAA,IAAI,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,KAAK;IAAE,YAAA,qBAAqB,EAAE;;IAE1C,QAAA,IAAI,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,YAAY;IAAE,YAAA,uBAAuB,EAAE;QACrD;IACF;IAEA;IAEA;IACA,MAAM,SAAS,GAAG,0EAA0E;IAE5F,SAAS,SAAS,CAAC,CAAgB,EAAA;QACjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YAAE;IACpE,IAAA,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;YAAE;IAErB,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAkB;IACpF,IAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;IAE7B,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9C,IAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;;IAEd,QAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,EAAE;gBACpC,CAAC,CAAC,cAAc,EAAE;gBAClB,IAAI,CAAC,KAAK,EAAE;YACd;QACF;aAAO;;IAEL,QAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,IAAI,EAAE;gBACnC,CAAC,CAAC,cAAc,EAAE;gBAClB,KAAK,CAAC,KAAK,EAAE;YACf;QACF;IACF;IAEA;IAEA,SAAS,SAAS,CAAC,CAAgB,EAAA;IACjC,IAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;IACxF,QAAA,KAAK,EAAE;QACT;QACA,SAAS,CAAC,CAAC,CAAC;IACd;IAEA;IACA,SAAS,OAAO,GAAA;IACd,IAAA,IAAI,CAAC,aAAa;YAAE;QAEpB,IAAI,WAAW,EAAE;YAAE,YAAY,CAAC,WAAW,CAAC;YAAE,WAAW,GAAG,IAAI;QAAE;IAClE,IAAA,UAAU,EAAE;IACZ,IAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,EAAE;IAAE,QAAA,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,QAAQ,GAAG,IAAI;QAAE;IAEnG,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;QACtD,IAAI,mBAAmB,EAAE;IAAE,QAAA,mBAAmB,EAAE;YAAE,mBAAmB,GAAG,IAAI;QAAE;QAC9E,WAAW,GAAG,IAAI;IAElB,IAAA,YAAY,EAAE;IACd,IAAA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;IAClD,IAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC9C,gBAAgB,CAAC,SAAS,CAAC;QAE3B,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;QACpB,OAAO,GAAG,IAAI;QACd,QAAQ,GAAG,IAAI;IAEf,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;IAC/C,IAAA,UAAU,EAAE;IACZ,IAAA,SAAS,EAAE;IACX,IAAA,UAAU,CAAC,MAAK,EAAG,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACzD;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;QACR;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;IAEA;IACA,SAAS,WAAW,CAAC,WAAmB,EAAA;QACtC,OAAO,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE;IACtC;IAEA;IACA,SAAS,kBAAkB,CAAC,WAAmB,EAAE,GAA6B,EAAA;IAC5E,IAAA,IAAI;IACF,QAAA,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrE;IAAE,IAAA,gBAAgB,EAAA,EAAV,WAAW;IACrB;IAEA;IACA,SAAS,qBAAqB,CAAC,WAAmB,EAAE,KAAkB,EAAA;IACpE,IAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC1D,QAAA,IAAI,CAAC,GAAG;gBAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B;IACvD,QAAA,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ;gBAAE;;YAE5D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW;YAClD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY;IACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,QAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;IAC1B,QAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAC3B,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,CAAC,IAAI;YAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,CAAC,IAAI;QAC5B;IAAE,IAAA,gBAAgB,EAAA,EAAV,WAAW;IACrB;IAEA;IAEA;IACA,SAAS,cAAc,CAAC,WAAmB,EAAA;QACzC,OAAO,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE;IAC1C;IAEA;IACA,SAAS,oBAAoB,CAAC,WAAmB,EAAE,GAA+C,EAAA;IAChG,IAAA,IAAI;IACF,QAAA,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxE;IAAE,IAAA,gBAAgB,EAAA,EAAV,WAAW;IACrB;IAEA;IACA,SAAS,uBAAuB,CAAC,WAAmB,EAAE,EAAe,EAAA;IACnE,IAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC7D,QAAA,IAAI,CAAC,GAAG;gBAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+C;IACzE,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,KAAK,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;gBAAE;IACrF,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,EAAE;IACzC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;YAEnE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;YAChE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,cAAA,EAAiB,GAAG,CAAC,IAAI,CAAA,CAAE,CAAC;YAC7C,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,aAAa,IAAI;;IAEtC,QAAA,WAAW,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE;QACzD;IAAE,IAAA,gBAAgB,EAAA,EAAV,WAAW;IACrB;IAEA;IACA,SAAS,mBAAmB,GAAA;IAC1B,IAAA,IAAI,CAAC,QAAQ;YAAE;IACf,IAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;IACxB,IAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;IACvB,IAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;IACzB,IAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;IAC5B;IAEA;IACA,SAAS,mBAAmB,CAAC,IAAsB,EAAA;IACjD,IAAA,IAAI,CAAC,QAAQ;YAAE;QACf,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;QAClE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,YAAA,EAAe,IAAI,CAAA,CAAE,CAAC;;QAE7C,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;YAClE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,YAAA,EAAe,IAAI,CAAA,CAAE,CAAC;QAC/C;IACF;IAEA;IAEA;IACA,SAAS,qBAAqB,GAAA;IAC5B,IAAA,IAAI;YACF,IAAI,CAAC,QAAQ,EAAE;IACb,YAAA,QAAQ,GAAG,KAAK,MAAM,CAAC,YAAY,IAAK,MAA6C,CAAC,kBAAyC,GAAG;YACpI;YACA,MAAM,GAAG,GAAG,QAAQ;IACpB,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,EAAE;gBAAE,GAAG,CAAC,MAAM,EAAE;gBAAE;YAAQ;;IAEvD,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW;IAC3B,QAAA,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAI;IAC9B,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,EAAE;IAClC,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE;IAC7B,YAAA,GAAG,CAAC,IAAI,GAAG,MAAM;IACjB,YAAA,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI;gBAC1C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;IAC5C,YAAA,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IACjB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC7B,YAAA,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAA,CAAC,CAAC;QACJ;IAAE,IAAA,2BAA2B,EAAA,EAArB,sBAAsB;IAChC;IAEA;IACA,SAAS,uBAAuB,GAAA;IAC9B,IAAA,IAAI;IACF,QAAA,IAAI,EAAE,cAAc,IAAI,MAAM,CAAC;gBAAE;IACjC,QAAA,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,EAAE;IACzC,YAAA,IAAI,YAAY,CAAC,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,KAAK,KAAI,SAAS,EAAE;IAC3C,gBAAA,IAAI,EAAE,OAAO;IACb,gBAAA,IAAI,EAAE,SAAS;IACf,gBAAA,MAAM,EAAE,IAAI;IACb,aAAA,CAAC;YACJ;IAAO,aAAA,IAAI,YAAY,CAAC,UAAU,KAAK,QAAQ,EAAE;;gBAE/C,YAAY,CAAC,iBAAiB,EAAE;YAClC;QACF;IAAE,IAAA,2BAA2B,EAAA,EAArB,sBAAsB;IAChC;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 +{"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/client/dist/chatbot-sdk.min.js b/client/dist/chatbot-sdk.min.js index a11b693..07532bb 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 e="[ChatbotSDK]";let n=!0,t=null;function r(e){t=e||null}const s={},o={info(t,r){n&&console.log(e,t,void 0!==r?r:"")},warn(t,r){n&&console.warn(e,t,void 0!==r?r:"")},error(n,r){if(console.error(e,n,void 0!==r?r:""),t)try{const e=r instanceof Error&&r.type||"error";t({message:n,code:String(e),detail:r})}catch(e){}},time(e){s[e]=Date.now()},timeEnd(t,r){const o=s[t];if(void 0!==o){const a=Date.now()-o;if(delete s[t],n){const n=r?`${r} ${a}ms`:`${t} ${a}ms`;console.log(e,n)}return a}return 0},lifecycleInit(e,n){this.info(`初始化完成 integrateId=${e} requestDomain=${n}`)},lifecycleDestroy(e){this.info(`销毁实例 integrateId=${e}`)},lifecycleSend(e,n){this.info(`发送消息 integrateId=${e} length=${n}`),this.time(`send_${e}`)},lifecycleReply(e,n){const t=this.timeEnd(`send_${e}`,"AI 回复");this.info(`AI 回复 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleError(e,n,t){this.timeEnd(`send_${e}`),this.error(`请求失败 integrateId=${e} status=${n} message=${t}`)},lifecycleClear(e){this.info(`清空会话 integrateId=${e}`)},lifecycleStreamDone(e,n){const t=this.timeEnd(`send_${e}`,"流式回复");this.info(`流式回复完成 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleCategoryChange(e){this.info(`切换知识库分类 categoryId=${e}`)}},a='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n';function i(e,n,t){return`\n \n \x3c!-- 高光渐变:模拟玻璃反射 --\x3e\n \n \n \n \n \x3c!-- 机器人身体渐变 --\x3e\n \n \n \n \n \n \x3c!-- 机器人主体(圆角矩形 + 对话气泡尾巴) --\x3e\n \n \n \x3c!-- 高光反射层(左上角弧形高光) --\x3e\n \n \x3c!-- 天线 + 能量球 --\x3e\n \n \n \x3c!-- 眼睛(会眨) --\x3e\n \n \n \x3c!-- 眼睛高光点 --\x3e\n \n \n \x3c!-- 微笑 --\x3e\n \n \x3c!-- 跳动气泡装饰(3 个小圆点) --\x3e\n \n \n \n`}const c=i("rgba(139,92,246,0.6)","rgba(139,92,246,0.45)","rgba(240,171,252,0.85)"),l=i("rgba(16,185,129,0.6)","rgba(16,185,129,0.45)","rgba(110,231,183,0.85)"),d=i("rgba(244,63,94,0.55)","rgba(244,63,94,0.4)","rgba(253,186,116,0.85)"),p=i("rgba(56,189,248,0.6)","rgba(56,189,248,0.45)","rgba(167,139,250,0.85)"),u={"dream-purple":"#A78BFA","mint-tech":"#34D399","coral-peach":"#FB7185","sky-blue":"#7DD3FC"};const g={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",status_online:"在线",welcome_title:"你好,我是 AI 智能助手",welcome_desc:"有什么可以帮你的吗?在下方输入框开始提问吧~",placeholder:"输入您的问题...",send:"发送",stop:"停止生成",new_message:"新消息",copy:"复制",copied:"已复制",retry:"重新生成",retrying:"重新生成中...",loading:"正在思考...",stream_interrupted:"回复被中断",stream_unstable:"网络不稳定,内容可能不完整",category_placeholder:"选择知识库分类",category_all:"全部分类",category_load_error:"加载分类失败",source_title:"参考来源",source_count:"{n} 条参考来源",source_loading:"加载来源中...",clear:"清空对话",clear_confirm:"确定清空所有对话记录?",history_title:"历史会话",history_empty:"暂无历史会话",history_load_error:"加载会话列表失败",history_delete_confirm:"确定删除该会话?",history_export:"导出",history_delete:"删除",history_search:"搜索会话...",history_group_today:"今天",history_group_yesterday:"昨天",history_group_week:"本周",history_group_earlier:"更早",feedback_up:"有帮助",feedback_down:"没帮助",teaser_text:"有什么可以帮你的吗?",new_msg_announce:"收到新消息",error_network:"网络连接失败,请检查网络",error_timeout:"请求超时,请稍后重试",error_server:"服务器异常,请稍后重试",error_cors:"跨域请求被拦截,请联系管理员将当前域名加入 API 白名单",error_auth:"鉴权失败,请联系管理员",error_forbidden:"无访问权限,请联系管理员配置",error_not_found:"请求的资源不存在",error_rate_limit:"请求过于频繁,请稍后重试",error_unavailable:"服务暂不可用,请稍后重试",error_unknown:"请求发生未知错误",error_send:"发送失败,请稍后重试",error_stream_unsupported:"浏览器不支持流式读取"},en:{title:"AI Assistant",minimize:"Minimize",close:"Close",status_online:"Online",welcome_title:"Hi, I am your AI assistant",welcome_desc:"How can I help you? Type your question below to get started.",placeholder:"Type your question...",send:"Send",stop:"Stop generating",new_message:"New message",copy:"Copy",copied:"Copied",retry:"Regenerate",retrying:"Regenerating...",loading:"Thinking...",stream_interrupted:"Response interrupted",stream_unstable:"Network unstable, content may be incomplete",category_placeholder:"Select category",category_all:"All categories",category_load_error:"Failed to load categories",source_title:"Sources",source_count:"{n} source(s)",source_loading:"Loading sources...",clear:"Clear chat",clear_confirm:"Clear all conversation history?",history_title:"History",history_empty:"No conversations yet",history_load_error:"Failed to load conversations",history_delete_confirm:"Delete this conversation?",history_export:"Export",history_delete:"Delete",history_search:"Search conversations...",history_group_today:"Today",history_group_yesterday:"Yesterday",history_group_week:"This Week",history_group_earlier:"Earlier",feedback_up:"Helpful",feedback_down:"Not helpful",teaser_text:"How can I help you?",new_msg_announce:"New message received",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 k="zh-CN";function m(e,n){let t=(g[k]||g["zh-CN"])[e]||g["zh-CN"][e]||e;if(n)for(const[e,r]of Object.entries(n))t=t.replace(`{${e}}`,String(r));return t}let h=null;function b(e){h&&(h.chatId=e)}function f(){return(null==h?void 0:h.chatId)||""}function y(e){if(!h)throw new Error("API 配置未初始化");return`${h.requestDomain.replace(/\/+$/,"")}${e.startsWith("/")?e:`/${e}`}`}function x(e,n,t){null!=t&&("string"==typeof t&&""===t.trim()||e.set(n,String(t)))}async function v(e,n={},t=3e4,r){const s=new AbortController,o=setTimeout(()=>s.abort(),t);r&&(r.aborted?s.abort():r.addEventListener("abort",()=>s.abort(),{once:!0}));try{return await fetch(e,Object.assign(Object.assign({},n),{signal:s.signal,mode:"cors",credentials:"include"}))}catch(e){if(null==r?void 0:r.aborted)throw new w("aborted","aborted");if(e instanceof DOMException&&"AbortError"===e.name)throw new w(m("error_timeout"),"timeout");if(e instanceof TypeError&&e.message.includes("Failed to fetch"))throw new w(m("error_cors"),"cors");throw new w(m("error_network"),"network")}finally{clearTimeout(o)}}class w extends Error{constructor(e,n){super(e),this.name="CskError",this.type=n}}function _(e){switch(e){case 401:return m("error_auth");case 403:return m("error_forbidden");case 404:return m("error_not_found");case 429:return m("error_rate_limit");case 500:return m("error_server");case 502:case 503:return m("error_unavailable");default:return`${m("error_unknown")}(${e})`}}async function E(e){const n=function(e){const n=new URLSearchParams;return n.set("message",e),n.set("chatId",h.chatId),x(n,"roleId",h.integrateId),x(n,"accountId",h.userId),y(`/ai/assistant_app/chat/sync?${n.toString()}`)}(e);o.lifecycleSend(h.integrateId,e.length);try{const e=await v(n);if(!e.ok){const n=_(e.status);throw o.lifecycleError(h.integrateId,String(e.status),n),new w(n,`http_${e.status}`)}const t=await e.text();return o.lifecycleReply(h.integrateId,t.length),t}catch(e){if(e instanceof w)throw e;throw o.lifecycleError(h.integrateId,"unknown",String(e)),new w(m("error_unknown"),"unknown")}}async function C(e,n,t,r,s,a,i){var c;const l=a?function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",h.chatId),t.set("rewriteStrategy",h.rewriteStrategy||"REWRITE"),x(t,"roleId",h.integrateId),x(t,"accountId",h.userId),x(t,"categoryId",null!=n?n:h.categoryId),y(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(e,s):function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",h.chatId),x(t,"roleId",h.integrateId),x(t,"accountId",h.userId),x(t,"categoryId",null!=n?n:h.categoryId),y(`/ai/assistant_app/chat/sse?${t.toString()}`)}(e,s);let d="";o.lifecycleSend(h.integrateId,e.length);try{const e=await v(l,{},6e4,i);if(!e.ok){const n=_(e.status);return o.lifecycleError(h.integrateId,String(e.status),n),void r(new w(n,`http_${e.status}`))}const s=null===(c=e.body)||void 0===c?void 0:c.getReader();if(!s)return void r(new w(m("error_stream_unsupported"),"stream_unsupported"));const a=new TextDecoder("utf-8",{stream:!0});let p="";try{for(;;){const{done:e,value:t}=await s.read();if(e)break;p+=a.decode(t,{stream:!0});const r=p.split("\n");p=r.pop()||"";for(const e of r){const t=e.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const e=t.substring(5).trim();e&&(d+=e,n(e))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(d+=t,n(t))}}}if(p.trim()){const e=p.trim();if(e.startsWith("data:")){const t=e.substring(5).trim();t&&(d+=t,n(t))}else"[DONE]"!==e&&(d+=e,n(e))}}catch(e){if(null==i?void 0:i.aborted)o.info(`流式被用户中断,保留已生成内容 length=${d.length}`);else{if(!(d.length>0))throw e;n("\n\n"+m("stream_unstable"))}}finally{s.releaseLock()}o.lifecycleStreamDone(h.integrateId,d.length),t()}catch(e){if((null==i?void 0:i.aborted)||e instanceof w&&"aborted"===e.type)return void t();e instanceof w?r(e):(o.lifecycleError(h.integrateId,"unknown",String(e)),r(new w(m("error_network"),"network")))}}async function I(e,n){const t=function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",h.chatId),t.set("rewriteStrategy",h.rewriteStrategy||"REWRITE"),x(t,"roleId",h.integrateId),x(t,"accountId",h.userId),x(t,"categoryId",null!=n?n:h.categoryId),y(`/ai/assistant_app/rag/sources?${t.toString()}`)}(e,n);try{const e=await v(t);if(!e.ok)throw new w(_(e.status),`http_${e.status}`);const n=await e.json();return n.success&&Array.isArray(n.data)?(o.info(`获取引用来源 count=${n.data.length}`),n.data):[]}catch(e){return o.error("获取引用来源失败",e),[]}}async function $(e=1,n=20,t,r){const s=new URLSearchParams;s.set("page",String(e)),s.set("size",String(n)),t&&s.set("accountId",t),r&&s.set("roleId",r);const a=y(`/ai/sdk/conversation/list?${s.toString()}`);try{const e=await v(a);if(!e.ok)throw new w(_(e.status),`http_${e.status}`);const n=await e.json();return{list:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0,pages:n.pages||0}}catch(e){return o.error("加载会话列表失败",e),{list:[],total:0,pages:0}}}async function L(e){const n=new URLSearchParams;(null==h?void 0:h.userId)&&n.set("accountId",h.userId),(null==h?void 0:h.integrateId)&&n.set("roleId",h.integrateId);const t=y(`/ai/sdk/conversation/${e}/messages?${n.toString()}`);try{const e=await v(t);if(!e.ok)throw new w(_(e.status),`http_${e.status}`);const n=await e.json();return{messages:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0}}catch(e){return o.error("加载会话消息失败",e),{messages:[],total:0}}}async function A(e){const n=new URLSearchParams;(null==h?void 0:h.userId)&&n.set("accountId",h.userId),(null==h?void 0:h.integrateId)&&n.set("roleId",h.integrateId);const t=y(`/ai/sdk/conversation/${e}?${n.toString()}`);try{const n=await v(t,{method:"DELETE"});if(!n.ok)throw new w(_(n.status),`http_${n.status}`);const r=await n.json();return o.info(`删除会话 id=${e} success=${r.success}`),r.success||!1}catch(e){return o.error("删除会话失败",e),!1}}function S(e){const n=new URLSearchParams;return(null==h?void 0:h.userId)&&n.set("accountId",h.userId),(null==h?void 0:h.integrateId)&&n.set("roleId",h.integrateId),y(`/ai/sdk/conversation/${e}/export?${n.toString()}`)}async function N(){if(!h)return"";const e=function(e,n){try{return localStorage.getItem(F(e,n))||""}catch(e){return""}}(h.integrateId,h.userId);if(e)return h.chatId=e,o.info(`从缓存恢复 chatId=${e}`),e;try{const e=await $(1,5,h.userId,h.integrateId);if(e.list.length>0){const n=e.list[0],t=n.conversationId||n.chatId||"";if(t)return h.chatId=t,M(h.integrateId,h.userId,t),o.info(`从后端恢复会话 chatId=${t} messageCount=${n.messageCount}`),t}}catch(e){o.warn("查询后端会话列表失败,将生成新 chatId",e)}const n=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();return h.chatId=n,M(h.integrateId,h.userId,n),o.info(`生成新 chatId=${n}`),n}function F(e,n){return`csk_chatId_${e}${n?"_"+n:""}`}function M(e,n,t){try{t?localStorage.setItem(F(e,n),t):localStorage.removeItem(F(e,n))}catch(e){}}let T=null;function D(e){const n=B(e.primaryColor,-15),t=B(e.primaryColor,18),r=function(e){const n=e.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);return n?`${parseInt(n[1],16)}, ${parseInt(n[2],16)}, ${parseInt(n[3],16)}`:"79, 70, 229"}(e.primaryColor),s=e.launcherTheme?{"dream-purple":{grad1:"#A78BFA",grad2:"#F0ABFC",glow:"167, 139, 250"},"mint-tech":{grad1:"#6EE7B7",grad2:"#34D399",glow:"52, 211, 153"},"coral-peach":{grad1:"#FB7185",grad2:"#FDBA74",glow:"251, 113, 133"},"sky-blue":{grad1:"#7DD3FC",grad2:"#A78BFA",glow:"125, 211, 252"}}[e.launcherTheme]:null;return`\n --csk-primary: ${e.primaryColor};\n --csk-primary-hover: ${n};\n --csk-primary-light: ${t};\n --csk-primary-rgb: ${r};\n --csk-bg-user: linear-gradient(135deg, ${e.primaryColor}, ${n});\n --csk-bg-ai: #ffffff;\n --csk-text-user: #ffffff;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${e.width}px;\n --csk-window-height: ${e.height}px;\n --csk-radius: 16px;\n --csk-shadow-window: 0 12px 48px rgba(15, 23, 42, 0.18), 0 2px 8px rgba(15, 23, 42, 0.06);\n --csk-shadow-bubble: 0 1px 2px rgba(15, 23, 42, 0.06);\n --csk-border: #ECEEF2;\n --csk-bg-app: #F6F7F9;\n ${s?`\n --csk-launcher-grad-1: ${s.grad1};\n --csk-launcher-grad-2: ${s.grad2};\n --csk-launcher-glow: ${s.glow};\n `:""}\n `}function B(e,n){const t=e.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return e;const r=e=>Math.max(0,Math.min(255,e)),s=r(parseInt(t[1],16)+n),o=r(parseInt(t[2],16)+n),a=r(parseInt(t[3],16)+n);return`#${s.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function q(e){document.querySelector("style[data-csk-sdk]")||(T=document.createElement("style"),T.setAttribute("data-csk-sdk",""),T.textContent=function(e){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${D(e)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n font-size: 14px;\n line-height: 1.55;\n color: #1F2937;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-sizing: border-box;\n}\n.csk-root *, .csk-root *::before, .csk-root *::after { box-sizing: border-box; }\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 24px;\n z-index: 9998;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: var(--csk-bg-user);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #fff;\n user-select: none;\n overflow: visible;\n /* 半透明白色光环边框,在白色页面上清晰分离按钮与背景 */\n border: 2.5px solid rgba(255, 255, 255, 0.55);\n /* 三层投影:接地阴影 + 彩色光晕,把按钮从白底「托」出来 */\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.06),\n 0 4px 16px rgba(0, 0, 0, 0.10),\n 0 6px 24px rgba(var(--csk-primary-rgb), 0.28),\n 0 0 48px rgba(var(--csk-primary-rgb), 0.12);\n transition:\n transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),\n box-shadow 0.25s ease,\n border-color 0.25s ease;\n animation: csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n.csk-launcher--right { right: 24px; }\n.csk-launcher--left { left: 24px; }\n\n/* 高光扫过动效 */\n.csk-launcher::before {\n content: '';\n position: absolute;\n top: -50%;\n left: -50%;\n width: 40%;\n height: 200%;\n border-radius: 50%;\n background: linear-gradient(\n 105deg,\n transparent 30%,\n rgba(255, 255, 255, 0.28) 48%,\n rgba(255, 255, 255, 0.1) 52%,\n transparent 70%\n );\n transform: rotate(25deg);\n animation: csk-shimmer 4s ease-in-out infinite;\n pointer-events: none;\n}\n/* 呼吸色晕 — 配合接地阴影,强化白底上的立体存在感 */\n.csk-launcher::after {\n content: '';\n position: absolute;\n inset: -18px;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.18) 0%, rgba(var(--csk-primary-rgb), 0.05) 45%, transparent 68%);\n animation: csk-breathe 3.5s ease-in-out infinite;\n pointer-events: none;\n}\n.csk-launcher:hover {\n transform: translateY(-3px) scale(1.08);\n border-color: rgba(255, 255, 255, 0.75);\n box-shadow:\n 0 2px 6px rgba(0, 0, 0, 0.10),\n 0 8px 24px rgba(0, 0, 0, 0.14),\n 0 10px 36px rgba(var(--csk-primary-rgb), 0.32),\n 0 0 56px rgba(var(--csk-primary-rgb), 0.14);\n}\n.csk-launcher:hover::before { animation-play-state: paused; }\n.csk-launcher:hover::after {\n animation: none;\n inset: -22px;\n background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.22) 0%, rgba(var(--csk-primary-rgb), 0.06) 45%, transparent 68%);\n}\n.csk-launcher:active { transform: scale(0.93); }\n.csk-launcher svg {\n width: 30px;\n height: 30px;\n position: relative;\n z-index: 1;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15));\n}\n\n@keyframes csk-launcher-in {\n 0% { opacity: 0; transform: scale(0.5) translateY(16px); }\n 60% { transform: scale(1.06) translateY(-2px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n}\n@keyframes csk-shimmer {\n 0%, 100% { left: -60%; opacity: 0; }\n 20% { opacity: 1; }\n 60% { opacity: 1; }\n 80% { left: 120%; opacity: 0; }\n}\n@keyframes csk-breathe {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.15); opacity: 0.35; }\n}\n\n/* SVG 图标内部动效:眨眼 */\n.csk-launcher .csk-ico-eye {\n animation: csk-eye-blink 4s ease-in-out infinite;\n}\n@keyframes csk-eye-blink {\n 0%, 42%, 48%, 100% { opacity: 1; }\n 45% { opacity: 0.1; }\n}\n/* SVG 图标内部动效:天线能量闪烁 */\n.csk-launcher .csk-ico-antenna {\n animation: csk-antenna-glow 2s ease-in-out infinite;\n}\n@keyframes csk-antenna-glow {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n/* ========== 磨砂玻璃质感悬浮按钮 ========== */\n.csk-launcher--glass {\n background: linear-gradient(\n 135deg,\n var(--csk-launcher-grad-1, var(--csk-primary)) 0%,\n var(--csk-launcher-grad-2, var(--csk-primary-light)) 100%\n ) !important;\n backdrop-filter: blur(12px) saturate(180%);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n border: 1.5px solid rgba(255, 255, 255, 0.55) !important;\n /* 多层阴影:接地 + 彩色光晕 + 内阴影立体感 */\n box-shadow:\n 0 2px 4px rgba(0, 0, 0, 0.04),\n 0 6px 20px rgba(0, 0, 0, 0.08),\n 0 8px 32px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.30),\n inset 0 1px 1px rgba(255, 255, 255, 0.35),\n inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important;\n}\n.csk-launcher--glass:hover {\n border-color: rgba(255, 255, 255, 0.75) !important;\n box-shadow:\n 0 4px 8px rgba(0, 0, 0, 0.06),\n 0 10px 28px rgba(0, 0, 0, 0.10),\n 0 12px 40px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.38),\n inset 0 1px 2px rgba(255, 255, 255, 0.45),\n inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important;\n}\n\n/* 玻璃按钮的呼吸色晕 — 更鲜艳、更醒目 */\n.csk-launcher--glass::after {\n background: radial-gradient(\n circle,\n rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.28) 0%,\n rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.10) 40%,\n transparent 65%\n ) !important;\n animation: csk-breathe-glow 3.5s ease-in-out infinite;\n}\n@keyframes csk-breathe-glow {\n 0%, 100% { transform: scale(1); opacity: 0.8; }\n 50% { transform: scale(1.22); opacity: 0.25; }\n}\n\n/* 玻璃按钮的高光扫过 — 更柔和的玻璃质感 */\n.csk-launcher--glass::before {\n background: linear-gradient(\n 115deg,\n transparent 25%,\n rgba(255, 255, 255, 0.35) 45%,\n rgba(255, 255, 255, 0.15) 55%,\n transparent 75%\n ) !important;\n width: 50%;\n animation: csk-shimmer-glass 5s ease-in-out infinite;\n}\n@keyframes csk-shimmer-glass {\n 0%, 100% { left: -70%; opacity: 0; }\n 15% { opacity: 1; }\n 55% { opacity: 1; }\n 70% { left: 130%; opacity: 0; }\n}\n\n/* SVG 内部动效:跳动气泡(3 个小圆点交错弹跳) */\n.csk-launcher .csk-ico-bubble {\n animation: csk-bubble-jump 1.4s ease-in-out infinite;\n}\n.csk-launcher .csk-ico-bubble--1 { animation-delay: 0s; }\n.csk-launcher .csk-ico-bubble--2 { animation-delay: 0.18s; }\n.csk-launcher .csk-ico-bubble--3 { animation-delay: 0.36s; }\n@keyframes csk-bubble-jump {\n 0%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-3.5px); }\n 60% { transform: translateY(-1px); }\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 24px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: var(--csk-window-height);\n max-height: calc(100vh - 48px);\n background: #fff;\n border-radius: var(--csk-radius);\n box-shadow: var(--csk-shadow-window);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform-origin: bottom right;\n transition: opacity 0.24s ease, transform 0.24s cubic-bezier(0.34, 1.2, 0.64, 1), visibility 0.24s;\n opacity: 1;\n transform: translateY(0) scale(1);\n visibility: visible;\n pointer-events: auto;\n}\n.csk-window--right { right: 24px; transform-origin: bottom right; }\n.csk-window--left { left: 24px; transform-origin: bottom left; }\n.csk-window--hidden {\n opacity: 0;\n transform: translateY(12px) scale(0.96);\n visibility: hidden;\n pointer-events: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n min-height: 60px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: move;\n user-select: none;\n position: relative;\n flex-shrink: 0;\n}\n.csk-header::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: 0;\n height: 24px;\n background: linear-gradient(to bottom, rgba(0,0,0,0.04), transparent);\n pointer-events: none;\n}\n.csk-header__left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.csk-header__avatar {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.22);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25);\n}\n.csk-header__avatar svg { width: 22px; height: 22px; }\n.csk-header__info {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: 0.2px;\n}\n.csk-header__status {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n opacity: 0.9;\n margin-top: 2px;\n}\n.csk-status-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #6EE7B7;\n box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7);\n animation: csk-status-pulse 2s infinite;\n}\n@keyframes csk-status-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7); }\n 70% { box-shadow: 0 0 0 6px rgba(110, 231, 183, 0); }\n 100% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0); }\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n}\n.csk-header__btn,\n.csk-history-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.15s, transform 0.15s;\n}\n.csk-header__btn:hover,\n.csk-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-header__btn:active,\n.csk-history-btn:active { transform: scale(0.92); }\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 20px 16px 12px;\n background: var(--csk-bg-app);\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar { width: 6px; }\n.csk-messages::-webkit-scrollbar-track { background: transparent; }\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D8DCE3;\n border-radius: 3px;\n}\n.csk-messages::-webkit-scrollbar-thumb:hover { background: #C2C7D0; }\n\n/* 欢迎空状态 */\n.csk-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px 32px;\n color: #6B7280;\n animation: csk-fade-in 0.3s ease;\n}\n.csk-welcome__avatar {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--csk-bg-user);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 14px;\n box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-welcome__avatar svg { width: 30px; height: 30px; }\n.csk-welcome__title {\n font-size: 15px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.csk-welcome__desc {\n font-size: 13px;\n color: #9CA3AF;\n line-height: 1.6;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n margin-bottom: 18px;\n max-width: 100%;\n word-break: break-word;\n animation: csk-msg-in 0.28s cubic-bezier(0.22, 1, 0.36, 1);\n}\n.csk-msg--user {\n flex-direction: row-reverse;\n align-items: flex-end;\n}\n.csk-msg--ai {\n flex-direction: row;\n align-items: flex-start;\n}\n.csk-msg__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg__avatar svg { width: 18px; height: 18px; }\n.csk-msg__avatar--ai {\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n}\n.csk-msg__avatar--user {\n background: var(--csk-bg-user);\n color: #fff;\n}\n.csk-msg__content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n max-width: calc(100% - 46px);\n}\n.csk-msg--user .csk-msg__content { align-items: flex-end; }\n.csk-msg--ai .csk-msg__content { align-items: flex-start; }\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 16px;\n font-size: 14px;\n line-height: 1.6;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 16px 16px 4px 16px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 16px 16px 16px 4px;\n border: 1px solid var(--csk-border);\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 5px;\n padding: 0 4px;\n}\n\n@keyframes csk-msg-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes csk-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n margin-bottom: 18px;\n animation: csk-msg-in 0.28s ease;\n}\n.csk-loading__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-loading__avatar svg { width: 18px; height: 18px; }\n.csk-loading__bubble {\n background: #fff;\n border: 1px solid var(--csk-border);\n border-radius: 16px 16px 16px 4px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.csk-loading__dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #B4B9C2;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.6; }\n 40% { transform: scale(1); opacity: 1; }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n padding: 10px 12px 14px;\n background: #fff;\n border-top: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-input-wrap {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n background: var(--csk-bg-app);\n border: 1px solid var(--csk-border);\n border-radius: 14px;\n padding: 6px 6px 6px 14px;\n transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;\n}\n.csk-input-wrap--focus {\n border-color: var(--csk-primary);\n background: #fff;\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n.csk-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 8px 0;\n font-size: 14px;\n outline: none;\n font-family: inherit;\n resize: none;\n min-height: 22px;\n max-height: 120px;\n line-height: 1.5;\n color: #1F2937;\n}\n.csk-input::placeholder { color: #9CA3AF; }\n.csk-root .csk-input:focus-visible { outline: none; }\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n min-width: 36px;\n border: none;\n border-radius: 10px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: pointer;\n transition: transform 0.18s, box-shadow 0.18s, opacity 0.18s;\n box-shadow: 0 3px 10px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-send-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 5px 14px rgba(var(--csk-primary-rgb), 0.4);\n}\n.csk-send-btn:active:not(:disabled) { transform: scale(0.92); }\n.csk-send-btn:disabled {\n background: #D1D5DB;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 0.7;\n}\n.csk-send-btn svg { width: 18px; height: 18px; }\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 999px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-clear-btn:hover {\n background: #FEF2F2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n border-top: 1px solid var(--csk-border);\n background: #FBFBFC;\n gap: 8px;\n flex-shrink: 0;\n}\n.csk-category-bar__label {\n font-size: 13px;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 6px 28px 6px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n color: #374151;\n background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239CA3AF' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") no-repeat right 9px center;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s, box-shadow 0.2s;\n max-width: 220px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid var(--csk-border);\n border-radius: 12px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n background: #FAFBFC;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F3F4F7;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover { background: #ECEEF2; }\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 5px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n font-size: 10px;\n}\n.csk-sources--collapsed .csk-sources__arrow { transform: rotate(-90deg); }\n.csk-sources__body {\n border-top: 1px solid var(--csk-border);\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body { display: none; }\n.csk-source-item {\n padding: 9px 12px;\n border-bottom: 1px solid #F0F1F4;\n transition: background 0.15s;\n}\n.csk-source-item:last-child { border-bottom: none; }\n.csk-source-item:hover { background: #fff; }\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 3px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.csk-source-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p { margin: 0 0 8px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { margin-bottom: 0; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h1,\n.csk-msg--ai .csk-msg__bubble .csk-md-h2,\n.csk-msg--ai .csk-msg__bubble .csk-md-h3,\n.csk-msg--ai .csk-msg__bubble .csk-md-h4,\n.csk-msg--ai .csk-msg__bubble .csk-md-h5,\n.csk-msg--ai .csk-msg__bubble .csk-md-h6 {\n margin: 14px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; }\n\n.csk-md-code-block {\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 10px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.55;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', monospace;\n}\n.csk-md-code-block code {\n background: none;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n color: inherit;\n}\n.csk-md-inline-code {\n background: rgba(var(--csk-primary-rgb), 0.1);\n color: var(--csk-primary);\n padding: 1px 6px;\n border-radius: 5px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', monospace;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol {\n padding-left: 22px;\n margin: 6px 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul li,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol li { margin-bottom: 4px; }\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding: 2px 12px;\n margin: 8px 0;\n color: #6B7280;\n background: rgba(var(--csk-primary-rgb), 0.05);\n border-radius: 0 6px 6px 0;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n border-bottom: 1px solid rgba(var(--csk-primary-rgb), 0.3);\n transition: border-color 0.15s;\n}\n.csk-md-link:hover { border-bottom-color: var(--csk-primary); }\n.csk-md-hr {\n border: none;\n border-top: 1px solid var(--csk-border);\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-panel {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n z-index: 10;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: csk-slide-in 0.24s ease;\n}\n.csk-history-panel--hidden { display: none; }\n@keyframes csk-slide-in {\n from { transform: translateX(100%); opacity: 0.4; }\n to { transform: translateX(0); opacity: 1; }\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--csk-border);\n background: var(--csk-bg-app);\n flex-shrink: 0;\n}\n.csk-history-panel__title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n}\n.csk-history-panel__back {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-history-panel__back:hover { background: #F3F4F6; }\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 10px;\n}\n.csk-history-panel__list::-webkit-scrollbar { width: 5px; }\n.csk-history-panel__list::-webkit-scrollbar-thumb { background: #E5E7EB; border-radius: 2px; }\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 11px 12px;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 5px;\n border: 1px solid transparent;\n}\n.csk-history-item:hover { background: #F3F4F6; }\n.csk-history-item--active {\n background: rgba(var(--csk-primary-rgb), 0.08);\n border-color: rgba(var(--csk-primary-rgb), 0.2);\n}\n.csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.12); }\n.csk-history-item__info { flex: 1; min-width: 0; }\n.csk-history-item__id {\n font-size: 13px;\n font-weight: 500;\n color: #1F2937;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-history-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 3px;\n}\n.csk-history-item__actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.csk-history-item:hover .csk-history-item__actions { opacity: 1; }\n.csk-history-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 7px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export { background: #EFF6FF; color: #2563EB; }\n.csk-history-action--export:hover { background: #DBEAFE; }\n.csk-history-action--delete { background: #FEF2F2; color: #DC2626; }\n.csk-history-action--delete:hover { background: #FEE2E2; }\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 34px;\n margin-bottom: 10px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #9CA3AF;\n font-size: 13px;\n}\n.csk-history-panel__loadmore {\n display: block;\n width: 100%;\n padding: 10px;\n border: none;\n background: #F9FAFB;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n text-align: center;\n transition: background 0.15s;\n}\n.csk-history-panel__loadmore:hover { background: #F3F4F6; }\n\n/* ========== 快捷问题芯片 ========== */\n.csk-quick-replies {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: center;\n margin-top: 18px;\n max-width: 320px;\n}\n.csk-quick-reply {\n border: 1px solid var(--csk-border);\n background: #fff;\n color: #374151;\n font-size: 12.5px;\n padding: 7px 13px;\n border-radius: 999px;\n cursor: pointer;\n font-family: inherit;\n line-height: 1.3;\n transition: all 0.18s ease;\n max-width: 100%;\n}\n.csk-quick-reply:hover {\n border-color: var(--csk-primary);\n color: var(--csk-primary);\n background: rgba(var(--csk-primary-rgb), 0.06);\n transform: translateY(-1px);\n}\n.csk-quick-reply:active { transform: scale(0.96); }\n\n/* ========== AI 消息操作条 ========== */\n.csk-msg__actions {\n display: flex;\n gap: 2px;\n margin-top: 5px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.csk-msg--ai:hover .csk-msg__actions { opacity: 1; }\n.csk-msg--streaming .csk-msg__actions { display: none; }\n.csk-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n.csk-action-btn:hover {\n background: #F3F4F6;\n color: #374151;\n}\n.csk-action-btn--done { color: #10B981; }\n.csk-action-btn:active { transform: scale(0.9); }\n\n/* ========== 流式打字光标 ========== */\n.csk-caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-left: 2px;\n vertical-align: text-bottom;\n background: var(--csk-primary);\n border-radius: 1px;\n animation: csk-caret-blink 1s step-end infinite;\n}\n@keyframes csk-caret-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n}\n\n/* ========== 代码块复制按钮 ========== */\n.csk-md-code-block { position: relative; }\n.csk-md-code-copy {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(255, 255, 255, 0.12);\n color: #CBD5E1;\n border-radius: 6px;\n cursor: pointer;\n opacity: 0;\n transition: all 0.15s ease;\n}\n.csk-md-code-block:hover .csk-md-code-copy { opacity: 1; }\n.csk-md-code-copy:hover { background: rgba(255, 255, 255, 0.22); color: #fff; }\n.csk-md-code-copy:active { transform: scale(0.9); }\n\n/* ========== 新消息提示按钮 ========== */\n.csk-newmsg {\n position: absolute;\n bottom: 82px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 5;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 7px 14px;\n border: none;\n background: var(--csk-primary);\n color: #fff;\n font-size: 12px;\n font-family: inherit;\n border-radius: 999px;\n cursor: pointer;\n box-shadow: 0 4px 14px rgba(var(--csk-primary-rgb), 0.38);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n animation: csk-msg-in 0.25s ease;\n white-space: nowrap;\n}\n.csk-newmsg:hover { transform: translateX(-50%) translateY(-1px); box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.48); }\n.csk-newmsg:active { transform: translateX(-50%) scale(0.95); }\n.csk-newmsg--hidden { display: none; }\n\n/* ========== 发送按钮停止态 ========== */\n.csk-send-btn--stop {\n background: #EF4444 !important;\n box-shadow: 0 3px 10px rgba(239, 68, 68, 0.35) !important;\n}\n.csk-send-btn--stop:hover:not(:disabled) {\n box-shadow: 0 5px 14px rgba(239, 68, 68, 0.45) !important;\n}\n\n/* ========== 暗色模式 ========== */\n.csk-root.csk-dark {\n --csk-bg-ai: #1E1E2E;\n --csk-text-ai: #E2E8F0;\n --csk-border: #3B3B52;\n --csk-bg-app: #141421;\n color: #E2E8F0;\n}\n.csk-dark .csk-window {\n background: #1A1A2E;\n box-shadow: 0 12px 48px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.csk-dark .csk-header::after { background: linear-gradient(to bottom, rgba(0,0,0,0.12), transparent); }\n.csk-dark .csk-msg__avatar--ai {\n background: var(--csk-bg-ai);\n color: var(--csk-primary);\n border-color: var(--csk-border);\n}\n.csk-dark .csk-input-area { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-input-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-input-wrap--focus { background: #1A1A2E; border-color: var(--csk-primary); }\n.csk-dark .csk-input { color: #E2E8F0; }\n.csk-dark .csk-loading__avatar { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__bubble { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__dot { background: #6B7280; }\n.csk-dark .csk-category-bar { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-category-select { background-color: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-sources { background: #1E1E2E; border-color: var(--csk-border); }\n.csk-dark .csk-sources__header { background: #25253A; }\n.csk-dark .csk-sources__header:hover { background: #2D2D48; }\n.csk-dark .csk-source-item:hover { background: var(--csk-bg-ai); }\n.csk-dark .csk-source-item__name { color: #E2E8F0; }\n.csk-dark .csk-source-item__meta { color: #6B7280; }\n.csk-dark .csk-history-panel { background: #1A1A2E; }\n.csk-dark .csk-history-panel__header { background: var(--csk-bg-app); border-bottom-color: var(--csk-border); }\n.csk-dark .csk-history-panel__back { background: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-history-panel__back:hover { background: #2D2D48; }\n.csk-dark .csk-history-item:hover { background: #25253A; }\n.csk-dark .csk-history-item__id { color: #E2E8F0; }\n.csk-dark .csk-history-item__meta { color: #6B7280; }\n.csk-dark .csk-history-item--active { background: rgba(var(--csk-primary-rgb), 0.15); }\n.csk-dark .csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.22); }\n.csk-dark .csk-action-btn:hover { background: #2D2D48; color: #E2E8F0; }\n.csk-dark .csk-clear-btn { background: var(--csk-bg-app); border-color: var(--csk-border); color: #9CA3AF; }\n.csk-dark .csk-clear-btn:hover { background: #3B1A1A; border-color: #7F1D1D; color: #FCA5A5; }\n.csk-dark .csk-md-code-block { background: #0F0F1A; }\n.csk-dark .csk-md-blockquote { background: rgba(var(--csk-primary-rgb), 0.08); }\n.csk-dark .csk-md-link { color: var(--csk-primary-light); }\n.csk-dark .csk-msg--ai .csk-msg__bubble { background: var(--csk-bg-ai); color: var(--csk-text-ai); border-color: var(--csk-border); }\n.csk-dark .csk-welcome__title { color: #E2E8F0; }\n.csk-dark .csk-welcome__desc { color: #6B7280; }\n.csk-dark .csk-quick-reply { background: var(--csk-bg-app); border-color: var(--csk-border); color: #CBD5E1; }\n.csk-dark .csk-quick-reply:hover { background: rgba(var(--csk-primary-rgb), 0.12); border-color: var(--csk-primary); color: var(--csk-primary-light); }\n.csk-dark .csk-teaser { background: #2D2D48; color: #E2E8F0; box-shadow: 0 4px 20px rgba(0,0,0,0.35); }\n.csk-dark .csk-teaser::after { border-top-color: #2D2D48; }\n.csk-dark .csk-teaser__close { color: #6B7280; }\n.csk-dark .csk-teaser__close:hover { color: #9CA3AF; }\n.csk-dark .csk-feedback-btn { background: rgba(var(--csk-primary-rgb), 0.1); color: #9CA3AF; }\n.csk-dark .csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.2); color: var(--csk-primary-light); }\n.csk-dark .csk-feedback-btn--active { background: rgba(var(--csk-primary-rgb), 0.28); color: var(--csk-primary-light); }\n.csk-dark .csk-history-panel__search-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-history-panel__search-wrap:focus-within { border-color: var(--csk-primary); }\n.csk-dark .csk-history-panel__search { color: #E2E8F0; }\n.csk-dark .csk-launcher__badge { box-shadow: 0 0 0 2px #1A1A2E; }\n.csk-dark .csk-welcome__avatar { box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.25); }\n.csk-dark .csk-header__avatar { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.1); }\n\n/* Launcher 拖拽态:微放大 + 阴影加深 */\n.csk-launcher--dragging {\n cursor: grabbing !important;\n transform: scale(1.1) !important;\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, 0.14),\n 0 12px 32px rgba(0, 0, 0, 0.18),\n 0 14px 40px rgba(var(--csk-primary-rgb), 0.36),\n 0 0 56px rgba(var(--csk-primary-rgb), 0.18) !important;\n}\n.csk-launcher--dragging::before,\n.csk-launcher--dragging::after { animation-play-state: paused !important; }\n/* 拖拽中隐藏未读徽章 */\n.csk-launcher--dragging .csk-launcher__badge { display: none !important; }\n/* 吸附过渡动画(释放时的缓动) */\n.csk-launcher--snap {\n transition: left 0.3s ease-out, right 0.3s ease-out, bottom 0.3s ease-out !important;\n}\n\n/* ========== Launcher 未读徽章 ========== */\n.csk-launcher__badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #EF4444;\n border: 2px solid #fff;\n box-shadow: 0 0 0 2px #fff;\n animation: csk-badge-in 0.28s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n}\n.csk-launcher__badge--hidden { display: none; }\n@keyframes csk-badge-in {\n from { transform: scale(0); }\n to { transform: scale(1); }\n}\n\n/* ========== Launcher 提示气泡 ========== */\n.csk-teaser {\n position: fixed;\n bottom: 90px;\n z-index: 9997;\n max-width: 240px;\n padding: 10px 14px;\n background: #fff;\n color: #1F2937;\n font-size: 13px;\n line-height: 1.5;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(15, 23, 42, 0.15);\n animation: csk-teaser-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);\n cursor: pointer;\n user-select: none;\n}\n.csk-teaser--right { right: 24px; }\n.csk-teaser--left { left: 24px; }\n.csk-teaser::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: 28px;\n width: 12px;\n height: 12px;\n background: inherit;\n border-radius: 2px;\n transform: rotate(45deg);\n box-shadow: 2px 2px 4px rgba(15, 23, 42, 0.08);\n}\n.csk-teaser--left::after { right: auto; left: 28px; }\n.csk-teaser__close {\n position: absolute;\n top: 4px;\n right: 6px;\n background: none;\n border: none;\n font-size: 16px;\n color: #9CA3AF;\n cursor: pointer;\n padding: 2px 4px;\n line-height: 1;\n border-radius: 4px;\n}\n.csk-teaser__close:hover { color: #374151; }\n.csk-teaser--hidden { display: none; }\n@keyframes csk-teaser-in {\n from { opacity: 0; transform: translateY(8px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n/* ========== 消息反馈按钮(👍 / 👎) ========== */\n.csk-feedback-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(var(--csk-primary-rgb), 0.08);\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n}\n.csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.18); color: var(--csk-primary); }\n.csk-feedback-btn--active {\n background: rgba(var(--csk-primary-rgb), 0.28);\n color: var(--csk-primary);\n}\n.csk-feedback-btn--active.down { background: #FEF2F2; color: #EF4444; }\n.csk-feedback-btn:active { transform: scale(0.9); }\n.csk-msg--streaming .csk-feedback-btn { display: none; }\n\n/* ========== 历史会话搜索框 ========== */\n.csk-history-panel__search-wrap {\n padding: 8px 10px;\n border-bottom: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-history-panel__search-wrap:focus-within {\n border-bottom-color: var(--csk-primary);\n}\n.csk-history-panel__search {\n width: 100%;\n padding: 7px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n font-family: inherit;\n color: #1F2937;\n background: var(--csk-bg-app);\n outline: none;\n transition: border-color 0.2s;\n}\n.csk-history-panel__search:focus { border-color: var(--csk-primary); }\n.csk-history-panel__search::placeholder { color: #9CA3AF; }\n\n/* ========== a11y 焦点指示 ========== */\n.csk-root :focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n}\n.csk-root button:focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n border-radius: inherit;\n}\n/* 弹窗打开时隐藏 launcher 上的焦点环 */\n.csk-launcher:focus-visible {\n outline: none;\n border-color: rgba(255, 255, 255, 0.75);\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.06),\n 0 4px 16px rgba(0, 0, 0, 0.10),\n 0 6px 24px rgba(var(--csk-primary-rgb), 0.28),\n 0 0 48px rgba(var(--csk-primary-rgb), 0.12),\n 0 0 0 4px rgba(var(--csk-primary-rgb), 0.3);\n}\n\n/* ========== a11y aria-live 播报区(视觉隐藏) ========== */\n.csk-sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0,0,0,0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* ========== 会话分组标题 ========== */\n.csk-history-group {\n margin-bottom: 4px;\n}\n.csk-history-group__label {\n font-size: 11px;\n font-weight: 600;\n color: #9CA3AF;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 8px 12px 4px;\n user-select: none;\n}\n.csk-dark .csk-history-group__label { color: #6B7280; }\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n max-height: 100vh;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-window--hidden { transform: translateY(100%); }\n /* 移动端默认位置,仅在未被 JS 拖拽覆盖时生效 */\n .csk-launcher:not([style*="bottom"]) { bottom: 20px; }\n .csk-launcher--right:not([style*="bottom"]) { right: 20px; }\n .csk-launcher--left:not([style*="bottom"]) { left: 20px; }\n}\n`}(e),document.head.appendChild(T))}function z(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const n=16*Math.random()|0;return("x"===e?n:3&n|8).toString(16)})}function H(e){const n={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,e=>n[e]||e)}function j(){return Date.now()}const R='';function P(e,n){const t=document.createElement("div");t.id="csk-launcher";const r=e.launcherTheme?" csk-launcher--glass":"";t.className=`csk-launcher csk-launcher--${"left-bottom"===e.position?"left":"right"}${r}`,t.setAttribute("title",e.title),t.setAttribute("aria-label",e.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=e.launcherIcon;const s=document.createElement("div");s.className="csk-launcher__badge csk-launcher__badge--hidden",t.appendChild(s);const o=function(e,n){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{e.apply(this,r),t=null},n)}}(n,300);return t.addEventListener("click",o),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),o())}),t}function U(){return window.innerHeight-76}function Y(e,n,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const s=document.createElement("div");s.className="csk-msg__avatar csk-msg__avatar--user",s.innerHTML='';const o=document.createElement("div");o.className="csk-msg__content";const a=document.createElement("div");a.className="csk-msg__bubble",a.textContent=n;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=te(t),o.appendChild(a),o.appendChild(i),r.appendChild(s),r.appendChild(o),e.appendChild(r),r}function O(e,n,t,r,s){const o=document.createElement("div");o.className="csk-msg csk-msg--ai",s&&(o.dataset.cskMsgId=s);const a=document.createElement("div");a.className="csk-msg__avatar csk-msg__avatar--ai",a.innerHTML=R;const i=document.createElement("div");i.className="csk-msg__content";const c=document.createElement("div");c.className="csk-msg__bubble",r?c.innerHTML=r(n):c.textContent=n;const l=document.createElement("div");return l.className="csk-msg__time",l.textContent=te(t),i.appendChild(c),i.appendChild(V(c,o)),i.appendChild(l),o.appendChild(a),o.appendChild(i),e.appendChild(o),J(c),o}const W='',G='';function V(e,n){const t=document.createElement("div");t.className="csk-msg__actions";const r=document.createElement("button");r.type="button",r.className="csk-action-btn",r.setAttribute("title",m("copy")),r.setAttribute("aria-label",m("copy")),r.innerHTML=W,r.addEventListener("click",async n=>{n.stopPropagation();const t=e.textContent||"";await K(t,r)});const s=document.createElement("button");s.type="button",s.className="csk-action-btn",s.setAttribute("title",m("retry")),s.setAttribute("aria-label",m("retry")),s.innerHTML=G,s.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:retry",{detail:{msgId:n.dataset.cskMsgId||""}}))});const o=document.createElement("button");o.type="button",o.className="csk-feedback-btn",o.setAttribute("title",m("feedback_up")),o.setAttribute("aria-label",m("feedback_up")),o.innerHTML='',o.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"up"}}))});const a=document.createElement("button");return a.type="button",a.className="csk-feedback-btn",a.setAttribute("title",m("feedback_down")),a.setAttribute("aria-label",m("feedback_down")),a.innerHTML='',a.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"down"}}))}),t.appendChild(r),t.appendChild(s),t.appendChild(o),t.appendChild(a),t}function X(e,n){const t=e.querySelectorAll(".csk-feedback-btn");t.length<2||(t.forEach(e=>e.classList.remove("csk-feedback-btn--active","down")),"up"===n&&t[0]&&t[0].classList.add("csk-feedback-btn--active"),"down"===n&&t[1]&&t[1].classList.add("csk-feedback-btn--active","down"))}async function K(e,n){const t=n.innerHTML;try{if(navigator.clipboard&&window.isSecureContext)await navigator.clipboard.writeText(e);else{const n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}n.innerHTML='',n.classList.add("csk-action-btn--done"),setTimeout(()=>{n.innerHTML=t,n.classList.remove("csk-action-btn--done")},1500)}catch(e){}}function J(e){e.querySelectorAll(".csk-md-code-block").forEach(e=>{if(e.querySelector(".csk-md-code-copy"))return;const n=e.querySelector("code"),t=document.createElement("button");t.type="button",t.className="csk-md-code-copy",t.setAttribute("title",m("copy")),t.setAttribute("aria-label",m("copy")),t.innerHTML=W,t.addEventListener("click",async e=>{e.stopPropagation(),await K((null==n?void 0:n.textContent)||"",t)}),e.appendChild(t)})}function Q(e,n){e.classList.remove("csk-msg--streaming");const t=n.querySelector(".csk-caret");t&&t.remove(),J(n)}function Z(e,n){const t=e.querySelector(".csk-sources");if(t&&t.remove(),!n||0===n.length)return;const r=document.createElement("div");r.className="csk-sources csk-sources--collapsed";const s=document.createElement("div");s.className="csk-sources__header";const o=document.createElement("span");o.className="csk-sources__title",o.textContent=`📚 ${m("source_count",{n:n.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",s.appendChild(o),s.appendChild(a),s.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const i=document.createElement("div");i.className="csk-sources__body";for(const e of n){const n=document.createElement("div");n.className="csk-source-item";const t=document.createElement("div");if(t.className="csk-source-item__name",t.textContent=e.title||e.sourceName||"未知文档",e.snippet){const t=document.createElement("div");t.className="csk-source-item__snippet",t.textContent=e.snippet,n.appendChild(t)}const r=document.createElement("div");r.className="csk-source-item__meta";const s=[];e.sourceName&&s.push(e.sourceName),void 0!==e.chunkIndex&&s.push(`分块 #${e.chunkIndex}`),void 0!==e.score&&s.push(`相关度 ${(100*e.score).toFixed(0)}%`),r.textContent=s.join(" · "),n.appendChild(t),n.appendChild(r),i.appendChild(n)}r.appendChild(s),r.appendChild(i);const c=e.querySelector(".csk-msg__time");c&&c.parentNode?c.parentNode.insertBefore(r,c):e.appendChild(r)}function ee(e,n,t,r,s,o,a){if(e.innerHTML="",0===n.length){const n=document.createElement("div");return n.className="csk-history-panel__empty",n.innerHTML=`\n
💬
\n
${m("history_empty")}
\n `,void e.appendChild(n)}const i=function(e){const n=new Date,t=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime(),r=t-864e5,s=t-864e5*(n.getDay()||7)+864e5,o={today:[],yesterday:[],week:[],earlier:[]};for(const n of e){const e=n.lastMessageTime||n.createdAt,a=e?new Date(e).getTime():0;a>=t?o.today.push(n):a>=r?o.yesterday.push(n):a>=s?o.week.push(n):o.earlier.push(n)}const a=[];return o.today.length&&a.push({label:m("history_group_today"),items:o.today}),o.yesterday.length&&a.push({label:m("history_group_yesterday"),items:o.yesterday}),o.week.length&&a.push({label:m("history_group_week"),items:o.week}),o.earlier.length&&a.push({label:m("history_group_earlier"),items:o.earlier}),a}(n);for(const n of i){if(i.length>1){const t=document.createElement("div");t.className="csk-history-group";const r=document.createElement("div");r.className="csk-history-group__label",r.textContent=n.label,t.appendChild(r),e.appendChild(t)}for(const a of n.items){const n=document.createElement("div");n.className="csk-history-item";const i=a.chatId||a.id;o&&i===o&&n.classList.add("csk-history-item--active");const c=document.createElement("div");c.className="csk-history-item__info";const l=document.createElement("div");l.className="csk-history-item__id",a.lastMessagePreview?l.textContent=a.lastMessagePreview.length>60?a.lastMessagePreview.substring(0,60)+"...":a.lastMessagePreview:l.textContent=i;const d=document.createElement("div");d.className="csk-history-item__meta";const p=[];void 0!==a.messageCount&&p.push(`${a.messageCount} 条消息`),a.lastMessageTime?p.push(a.lastMessageTime):a.createdAt&&p.push(a.createdAt),d.textContent=p.join(" · "),c.appendChild(l),c.appendChild(d);const u=document.createElement("div");u.className="csk-history-item__actions";const g=document.createElement("button");g.className="csk-history-action csk-history-action--export",g.setAttribute("title",m("history_export")),g.innerHTML='',g.addEventListener("click",e=>{e.stopPropagation(),r(a.id)});const k=document.createElement("button");k.className="csk-history-action csk-history-action--delete",k.setAttribute("title",m("history_delete")),k.innerHTML='',k.addEventListener("click",e=>{e.stopPropagation(),s(a.id)}),u.appendChild(g),u.appendChild(k),n.appendChild(c),n.appendChild(u),n.addEventListener("click",()=>{t(i)}),e.appendChild(n)}}}function ne(e){e.scrollTop=e.scrollHeight}function te(e){const n=new Date(e);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function re(e){return`csk_history_${e}`}function se(e,n){try{let t=n;t.length>200&&(t=t.slice(50),o.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const r={messages:t,updatedAt:Date.now()};localStorage.setItem(re(e),JSON.stringify(r))}catch(e){e instanceof Error&&"QuotaExceededError"===e.name?o.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):o.error("保存会话历史失败",e)}}function oe(e){try{localStorage.removeItem(re(e))}catch(e){o.warn("清空会话历史失败",e)}}const ae="\0CODEBLOCK_",ie="\0INLINECODE_";function ce(e){if(!e||"string"!=typeof e)return"";const n=[];let t=e;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(e,t,r)=>{const s=n.length,o=H(r.trimEnd()),a=t?` class="language-${H(t)}"`:"";return n.push(`
${o}
`),`${ae}${s}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(e,n)=>{const t=r.length;return r.push(`${H(n)}`),`${ie}${t}\0`}),t=H(t),t=le(t,ae,n),t=le(t,ie,r);const s=t.split("\n"),o=[];let a=!1,i="",c=!1,l=[];for(let e=0;e')){p(),u(),g(),o.push(n);continue}const t=n.match(/^(#{1,6})\s+(.+)/);if(t){p(),u(),g();const e=t[1].length;o.push(`${t[2]}`);continue}const r=n.match(/^>\s?(.*)/);if(r){p(),u(),c||(c=!0,o.push('
')),o.push(`

${d(r[1])}

`);continue}c&&g();const k=n.match(/^[\-\*]\s+(.+)/);if(k){p(),g(),a&&"ul"===i||(u(),a=!0,i="ul",o.push('":""),a=!1,i="")}function g(){c&&(o.push("
"),c=!1)}}function le(e,n,t){return e.replace(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(e,n)=>t[parseInt(n)]||"")}let de,pe=null,ue=[],ge=null,ke=null,me=null,he=null,be=null,fe=null,ye=null,xe=null,ve=null,we=null,_e=null,Ee=null,Ce=null,Ie=!1,$e=null,Le=!0,Ae=[],Se="",Ne=!1;function Fe(e,n){pe=e,ge=n.messagesContainer,ke=n.inputEl,me=n.inputEl.parentElement,he=n.sendBtn,be=n.clearBtn,fe=n.categorySelect,ye=n.historyPanel,xe=n.welcomeEl,ve=n.newMsgBtn,we=n.searchInput,_e=n.ariaLiveEl,Ee=n.showLoading,Ce=n.hideLoading,de=e.categoryId,Ne=e.enableRag,function(){if(!ke||!he)return;he.addEventListener("click",()=>{Ie&&$e?$e.abort():Re()}),ke.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),Re())}),ke.addEventListener("input",()=>{je(),function(){if(!ke)return;ke.style.height="auto",ke.style.height=`${Math.min(ke.scrollHeight,120)}px`}()}),ke.addEventListener("focus",()=>{me&&me.classList.add("csk-input-wrap--focus")}),ke.addEventListener("blur",()=>{me&&me.classList.remove("csk-input-wrap--focus")}),be&&be.addEventListener("click",()=>function(){if(!pe)return;if(!confirm(m("clear_confirm")))return;if(ue=[],ge){ge.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove())}be&&(be.style.display="none");He(),oe(pe.integrateId);const e=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();b(e),M(pe.integrateId,pe.userId,e),o.lifecycleClear(pe.integrateId),o.info(`新 chatId=${e}`)}())}(),function(){if(!ge)return;ge.addEventListener("scroll",()=>{if(!ge)return;const{scrollTop:e,scrollHeight:n,clientHeight:t}=ge;Le=n-e-t<80,Le&&Te()}),ve&&ve.addEventListener("click",()=>{ge&&ne(ge),Le=!0,Te()})}(),function(){if(!we)return;we.addEventListener("input",()=>{Se=we.value.trim().toLowerCase(),qe()})}(),e.showCategorySwitch&&fe&&async function(){if(!fe)return;try{const e=await async function(){const e=y("/category/tree");try{const n=await v(e);if(!n.ok)throw new w(_(n.status),`http_${n.status}`);const t=await n.json();return t.success&&Array.isArray(t.data)?(o.info(`加载分类树成功 count=${t.data.length}`),t.data):[]}catch(e){return e instanceof w?o.error(`加载分类树失败: ${e.message}`):o.error("加载分类树失败",e),[]}}();if(0===e.length)return;fe.innerHTML=``;const n=(e,t=0)=>{for(const r of e){const e=document.createElement("option");e.value=String(r.id),e.textContent=`${" ".repeat(t)}${r.name}`,void 0!==de&&String(r.id)===String(de)&&(e.selected=!0),fe.appendChild(e),r.children&&r.children.length>0&&n(r.children,t+1)}};n(e),o.info(`知识库分类加载成功 count=${e.length}`)}catch(e){o.error(m("category_load_error"),e)}}()}async function Me(){if(pe&&ge&&(await N(),await async function(){if(!pe||!ge)return;const e=f();if(!e)return;try{const n=await L(e);n.messages.length>0&&(ue=n.messages.map((e,n)=>({id:z(),role:"USER"===e.messageType?"user":"ai",content:e.content,timestamp:new Date(e.createTime).getTime()})),Ue(),o.info(`从后端加载 ${ue.length} 条历史消息`),se(pe.integrateId,ue))}catch(e){o.warn("从后端加载历史消息失败",e)}}(),0===ue.length)){const e=function(e){try{const n=localStorage.getItem(re(e));if(!n)return[];const t=JSON.parse(n);return t&&Array.isArray(t.messages)?(o.info(`加载历史消息 integrateId=${e} count=${t.messages.length}`),t.messages):[]}catch(e){return o.warn("加载会话历史失败",e),[]}}(pe.integrateId);e.length>0&&(ue=e,Ue(),o.info(`从本地缓存恢复 ${e.length} 条消息`))}}function Te(){ve&&ve.classList.add("csk-newmsg--hidden")}function De(){ge&&(Le?ne(ge):ve&&ve.classList.remove("csk-newmsg--hidden"))}function Be(e){he&&("stop"===e?(he.classList.add("csk-send-btn--stop"),he.removeAttribute("disabled"),he.setAttribute("title",m("stop")),he.setAttribute("aria-label",m("stop")),he.innerHTML=''):(he.classList.remove("csk-send-btn--stop"),he.setAttribute("title",m("send")),he.setAttribute("aria-label",m("send")),he.innerHTML='',je()))}function qe(){const e=null==ye?void 0:ye.querySelector("#csk-history-list");if(!e||!pe)return;ee(e,Se?Ae.filter(e=>(e.lastMessagePreview||e.chatId||e.id||"").toLowerCase().includes(Se)):Ae,e=>{Ye(e)},e=>{window.open(S(e),"_blank")},async e=>{if(!confirm(m("history_delete_confirm")))return;await A(e)&&(e===f()&&(ue=[],ge&&ge.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove()),be&&(be.style.display="none"),He()),Ae=Ae.filter(n=>(n.chatId||n.id)!==e),qe())},f())}function ze(e,n){if(!ge)return;const t=ue.find(n=>n.id===e&&"ai"===n.role);if(!t)return;const r=t.feedback===n?void 0:n;t.feedback=r;const s=ge.querySelector(`[data-csk-msg-id="${e}"]`);if(s&&X(s,r),pe&&se(pe.integrateId,ue),r){const n="up"===r?"THUMBS_UP":"THUMBS_DOWN";(async function(e,n){if(!h)return!1;const t=y("/feedback");try{const r=await v(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({messageId:String(e),conversationId:h.chatId,feedbackType:n})});return r.ok?(await r.json()).success||!1:(o.error(`反馈提交失败 status=${r.status}`),!1)}catch(e){return o.error("反馈提交异常",e),!1}})(String(e),n).then(n=>{n?o.info(`消息反馈已提交 msgId=${e} value=${r}`):o.warn(`消息反馈提交失败 msgId=${e}(本地状态已更新)`)})}else o.info(`消息反馈已取消 msgId=${e}`)}function He(){if(!xe)return;const e=ue.length>0||ge&&ge.querySelector(".csk-msg");xe.style.display=e?"none":""}function je(){if(!he||!ke)return;ke.value.trim().length>0&&!Ie?he.removeAttribute("disabled"):he.setAttribute("disabled","true")}async function Re(){if(!ke||!pe||Ie)return;const e=ke.value.trim();if(""===e)return;ke.value="",je(),ke.style.height="auto";const n=j(),t={id:z(),role:"user",content:e,timestamp:n};ge&&Y(ge,e,n),ue.push(t),He(),be&&ue.length>0&&(be.style.display="inline-flex"),ge&&De(),await Pe(e)}async function Pe(e){if(!pe||!ge)return;Ie=!0,Be("stop"),pe.chatId||await N();const n=j(),t=Ne;Ee&&Ee(),ge&&De();const r=z();let s="";try{pe.streaming?s=await async function(e,n,t,r){$e=new AbortController;const s=$e.signal;return new Promise((o,a)=>{let i=null,c=null,l="",d=!1;C(e,e=>{if(l+=e,!d&&ge){Ce&&Ce();const{wrapper:e,bubble:t}=function(e,n,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai csk-msg--streaming",t&&(r.dataset.cskMsgId=t);const s=document.createElement("div");s.className="csk-msg__avatar csk-msg__avatar--ai",s.innerHTML=R;const o=document.createElement("div");o.className="csk-msg__content";const a=document.createElement("div");a.className="csk-msg__bubble",a.innerHTML="";const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=te(n),o.appendChild(a),o.appendChild(V(a,r)),o.appendChild(i),r.appendChild(s),r.appendChild(o),e.appendChild(r),{wrapper:r,bubble:a}}(ge,n,r);c=e,i=t,d=!0}i&&(i.textContent=l,function(e){if(e.querySelector(".csk-caret"))return;const n=document.createElement("span");n.className="csk-caret",n.setAttribute("aria-hidden","true"),e.appendChild(n)}(i)),ge&&De()},()=>{if(c&&i){if(!d&&""===l)return void E(e).then(o).catch(a);l&&(i.innerHTML=ce(l)),Q(c,i)}o(l)},e=>{l.length>0?(i&&(i.innerHTML=ce(l+"\n\n"+m("stream_interrupted")),c&&Q(c,i)),o(l)):a(e)},de,t,s)})}(e,n,t,r):(s=await E(e),Ce&&Ce(),ge&&O(ge,s,n,ce,r));const a={id:r,role:"ai",content:s,timestamp:n};ue.push(a),se(pe.integrateId,ue),ge&&De(),function(e){if(!_e)return;const n=e.length>120?e.substring(0,120)+"...":e;_e.textContent=m("new_msg_announce")+":"+n}(s),ge&&ge.dispatchEvent(new CustomEvent("csk:newMessage",{bubbles:!0,detail:{msg:a}})),t&&async function(e,n){try{const t=await I(e,de);if(t.length>0){const e=t.map(e=>{var n,t;return{documentId:e.documentId||"",title:e.title||"",sourceName:e.sourceName||"",chunkIndex:null!==(n=e.chunkIndex)&&void 0!==n?n:0,score:null!==(t=e.score)&&void 0!==t?t:0,snippet:e.snippet||""}});if(n.sources=e,ge){const n=ge.querySelector(".csk-msg--ai:last-of-type");n&&Z(n,e)}pe&&se(pe.integrateId,ue)}}catch(e){o.warn("获取引用来源失败",e)}}(e,a)}catch(e){Ce&&Ce();const n=e instanceof w?e.message:m("error_send");if(ge){const e=document.createElement("div");e.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${n}`,e.appendChild(t),ge.appendChild(e)}o.error(`发送失败 integrateId=${pe.integrateId}`,e)}finally{Ie=!1,$e=null,Be("send"),je()}}function Ue(){if(!ge)return;const e=ge.querySelector(".csk-history-panel");ge.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove());for(const e of ue)if("user"===e.role)Y(ge,e.content,e.timestamp);else{const n=O(ge,e.content,e.timestamp,ce,e.id);e.sources&&e.sources.length>0&&Z(n,e.sources),e.feedback&&X(n,e.feedback)}Le=!0,ne(ge),be&&ue.length>0&&(be.style.display="inline-flex"),He(),e&&!ge.contains(e)&&ge.appendChild(e)}async function Ye(e){if(!pe||!ge)return;o.info(`切换到会话 conversationId=${e}`),b(e),M(pe.integrateId,pe.userId,e),ye&&ye.classList.add("csk-history-panel--hidden"),ue=[];ge.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove());try{const n=await L(e);n.messages.length>0&&(ue=n.messages.map(e=>({id:z(),role:"USER"===e.messageType?"user":"ai",content:e.content,timestamp:new Date(e.createTime).getTime()})),Ue(),o.info(`加载会话 ${e} 的 ${ue.length} 条消息`),se(pe.integrateId,ue))}catch(n){o.warn(`加载会话消息失败 conversationId=${e}`,n)}be&&ue.length>0&&(be.style.display="inline-flex"),He()}let Oe=null,We=!1,Ge=null,Ve=null,Xe=null,Ke=null,Je=null,Qe=null,Ze=null,en=null,nn=null,tn=null,rn=null,sn=null,on=null,an=null,cn=null,ln=null,dn=null;function pn(){if(!an||!Ge)return;const e=Ge.getBoundingClientRect(),n=on?"left"===on.side:"left-bottom"===(null==Oe?void 0:Oe.position);n?(an.style.left=`${e.left}px`,an.style.right="auto"):(an.style.right=window.innerWidth-e.right+"px",an.style.left="auto"),an.style.bottom=window.innerHeight-e.top+8+"px",an.classList.toggle("csk-teaser--left",!!n),an.classList.toggle("csk-teaser--right",!n)}function un(){if(!an)return;an.classList.add("csk-teaser--hidden"),an.removeEventListener("click",gn);const e=an.querySelector(".csk-teaser__close");e&&e.removeEventListener("click",kn)}function gn(e){e.target.closest(".csk-teaser__close")||(un(),fn())}function kn(e){e.stopPropagation(),un()}function mn(){an&&!an.classList.contains("csk-teaser--hidden")&&pn()}const hn='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';function bn(e){"Escape"===e.key&&Ve&&!Ve.classList.contains("csk-window--hidden")&&yn(),function(e){if(!Ve||Ve.classList.contains("csk-window--hidden"))return;if("Tab"!==e.key)return;const n=Array.from(Ve.querySelectorAll(hn));if(0===n.length)return;const t=n[0],r=n[n.length-1];e.shiftKey?document.activeElement===t&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),t.focus())}(e)}function fn(){Ve&&(Ve.classList.remove("csk-window--hidden"),un(),ln&&ln.classList.add("csk-launcher__badge--hidden"),setTimeout(()=>{Ke&&Ke.focus()},80))}function yn(){Ve&&Ve.classList.add("csk-window--hidden")}function xn(){Ve&&(Ve.classList.contains("csk-window--hidden")?fn():yn())}function vn(e){return`csk_position_${e}`}function wn(e){return`csk_launcher_pos_${e}`}function _n(e){Ve&&(Ve.classList.remove("csk-window--right","csk-window--left"),Ve.classList.add(`csk-window--${e}`),an&&(an.classList.remove("csk-teaser--right","csk-teaser--left"),an.classList.add(`csk-teaser--${e}`)))}const En={init:function(e){if(We)return void o.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const t=function(e){var n,t,r,s,i,g,k,m,h,b,f;if(!e.integrateId||"string"!=typeof e.integrateId&&"number"!=typeof e.integrateId||"string"==typeof e.integrateId&&""===e.integrateId.trim())return o.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;if(!e.requestDomain||"string"!=typeof e.requestDomain||""===e.requestDomain.trim())return o.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;try{new URL(e.requestDomain)}catch(n){return o.error(`requestDomain 不是合法的 URL 格式:${e.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const y=String(e.integrateId).trim(),x=e.launcherTheme||void 0;let v=e.launcherIcon||a,w=e.primaryColor||"#4F46E5";x&&!e.launcherIcon&&(v={"dream-purple":c,"mint-tech":l,"coral-peach":d,"sky-blue":p}[x]||a,e.primaryColor||(w=u[x]||"#4F46E5"));const _={integrateId:y,requestDomain:e.requestDomain.replace(/\/+$/,""),userId:e.userId,categoryId:e.categoryId,showCategorySwitch:null!==(n=e.showCategorySwitch)&&void 0!==n&&n,title:e.title||"AI 智能助手",width:null!==(t=e.width)&&void 0!==t?t:380,height:Math.max(300,null!==(r=e.height)&&void 0!==r?r:520),position:"left-bottom"===e.position?"left-bottom":"right-bottom",primaryColor:w,launcherTheme:x,launcherIcon:v,showClear:null===(s=e.showClear)||void 0===s||s,showAdminPanel:null!==(i=e.showAdminPanel)&&void 0!==i&&i,quickReplies:Array.isArray(e.quickReplies)?e.quickReplies.map(e=>String(e).trim()).filter(Boolean):[],theme:"dark"===e.theme?"dark":"light",showTeaser:null===(g=e.showTeaser)||void 0===g||g,teaserText:"string"==typeof e.teaserText&&e.teaserText.trim()||"",streaming:null===(k=e.streaming)||void 0===k||k,enableRag:null===(m=e.enableRag)||void 0===m||m,rewriteStrategy:e.rewriteStrategy||"REWRITE",locale:e.locale||"zh-CN",debug:null===(h=e.debug)||void 0===h||h,sound:null!==(b=e.sound)&&void 0!==b&&b,notification:null!==(f=e.notification)&&void 0!==f&&f,onError:"function"==typeof e.onError?e.onError:void 0,onReady:"function"==typeof e.onReady?e.onReady:void 0,onMessage:"function"==typeof e.onMessage?e.onMessage:void 0,chatId:""};return o.info(`配置解析完成 integrateId(=roleId)=${_.integrateId} userId(=accountId)=${_.userId||"(未设置)"} requestDomain=${_.requestDomain}`),_}(e);if(!t)return;var s;Oe=t,function(e){if(g[e])k=e;else{const n=e.split("-")[0],t=Object.keys(g).find(e=>e.startsWith(n));t&&(k=t)}}(Oe.locale),s=Oe.debug,n=s,r(Oe.onError),function(e){h=e}(Oe),q(Oe),Ge=P(Oe,xn),document.body.appendChild(Ge),ln=Ge.querySelector(".csk-launcher__badge"),function(e,n){try{const t=localStorage.getItem(wn(e));if(!t)return;const r=JSON.parse(t);if("left"!==r.side&&"right"!==r.side||"number"!=typeof r.bottom)return;const s=window.innerHeight-76,o=Math.max(16,Math.min(r.bottom,s));n.classList.remove("csk-launcher--right","csk-launcher--left"),n.classList.add(`csk-launcher--${r.side}`),n.style.bottom=`${o}px`,on={side:r.side,bottom:o}}catch(e){}}(Oe.integrateId,Ge),sn=function(e,n,t){let r=!1,s=0,o=0,a=!1,i=0,c=0,l=0,d=!1;function p(){const n=parseFloat(getComputedStyle(e).bottom);return isNaN(n)?24:n}function u(n,t){if(d)return;r=!0,a=!1,s=n,o=t,i=p();const u=e.style,g=getComputedStyle(e);c=u.right?parseFloat(u.right):parseFloat(g.right),l=u.left?parseFloat(u.left):parseFloat(g.left)}function g(n,t,d){if(!r)return;const p=n-s,u=t-o;if(!a){if(Math.abs(p)<5&&Math.abs(u)<5)return;a=!0,e.classList.add("csk-launcher--dragging"),e.classList.remove("csk-launcher--right","csk-launcher--left"),e.style.transition="none",!isNaN(c)&&c>=0&&isNaN(l)?(e.style.right=`${c}px`,e.style.left="auto"):!isNaN(l)&&l>=0&&(e.style.left=`${l}px`,e.style.right="auto")}if(a){d.preventDefault();const n=Math.max(16,Math.min(i-u,U()));e.style.bottom=`${n}px`}}function k(){if(!r)return;if(r=!1,!a)return;const n=parseFloat(e.style.bottom)||p(),s=Math.max(16,Math.min(n,U())),o=e.getBoundingClientRect(),i=o.left+o.width/2<=window.innerWidth/2?"left":"right";e.classList.remove("csk-launcher--dragging"),e.classList.add(`csk-launcher--${i}`,"csk-launcher--snap"),e.style.left="",e.style.right="",e.style.bottom=`${s}px`,d=!0;const c=()=>{e.removeEventListener("transitionend",c),e.classList.remove("csk-launcher--snap"),e.style.transition="",d=!1};e.addEventListener("transitionend",c),setTimeout(()=>{d&&c()},350);const l=n=>{n.stopPropagation(),e.removeEventListener("click",l,!0)};e.addEventListener("click",l,!0);const u=e.querySelector(".csk-launcher__badge");u&&(u.style.display=""),t&&t({side:i,bottom:s})}function m(e){u(e.clientX,e.clientY)}function h(e){g(e.clientX,e.clientY,e)}function b(){k()}function f(e){1===e.touches.length&&u(e.touches[0].clientX,e.touches[0].clientY)}function y(e){1===e.touches.length&&g(e.touches[0].clientX,e.touches[0].clientY,e)}function x(){k()}return e.addEventListener("mousedown",m),document.addEventListener("mousemove",h),document.addEventListener("mouseup",b),e.addEventListener("touchstart",f,{passive:!0}),document.addEventListener("touchmove",y,{passive:!1}),document.addEventListener("touchend",x),()=>{e.removeEventListener("mousedown",m),document.removeEventListener("mousemove",h),document.removeEventListener("mouseup",b),e.removeEventListener("touchstart",f),document.removeEventListener("touchmove",y),document.removeEventListener("touchend",x)}}(Ge,0,e=>{on=e,function(e,n){try{localStorage.setItem(wn(e),JSON.stringify(n))}catch(e){}}(Oe.integrateId,e),function(){if(!Ve)return;Ve.style.left="",Ve.style.top="",Ve.style.right="",Ve.style.bottom=""}(),_n(e.side),an&&!an.classList.contains("csk-teaser--hidden")&&pn()}),on&&_n(on.side);const i=function(e){const n=document.createElement("div");n.id="csk-window",n.className=`csk-root csk-window csk-window--${"left-bottom"===e.position?"left":"right"} csk-window--hidden${"dark"===e.theme?" csk-dark":""}`,n.setAttribute("role","dialog"),n.setAttribute("aria-label",e.title),n.setAttribute("aria-modal","false");const t=document.createElement("div");t.className="csk-header";const r=document.createElement("div");r.className="csk-header__left";const s=document.createElement("div");s.className="csk-header__avatar",s.innerHTML=R;const o=document.createElement("div");o.className="csk-header__info";const a=document.createElement("span");a.className="csk-header__title",a.textContent=e.title;const i=document.createElement("span");i.className="csk-header__status",i.innerHTML=`${m("status_online")}`,o.appendChild(a),o.appendChild(i),r.appendChild(s),r.appendChild(o);const c=document.createElement("div");c.className="csk-header__actions";const l=document.createElement("button");l.className="csk-history-btn",l.setAttribute("title",m("history_title")),l.innerHTML='';const d=document.createElement("button");d.className="csk-header__btn csk-header__btn--minimize",d.setAttribute("title",m("minimize")),d.innerHTML='',d.addEventListener("click",()=>{n.classList.add("csk-window--hidden")});const p=document.createElement("button");p.className="csk-header__btn csk-header__btn--close",p.setAttribute("title",m("close")),p.innerHTML='',p.addEventListener("click",()=>{n.classList.add("csk-window--hidden")}),c.appendChild(l),c.appendChild(d),c.appendChild(p),t.appendChild(r),t.appendChild(c);const u=document.createElement("div");u.id="csk-messages",u.className="csk-messages";const g=document.createElement("div");if(g.className="csk-welcome",g.innerHTML=`\n
${R}
\n
${m("welcome_title")}
\n
${m("welcome_desc")}
\n `,e.quickReplies.length>0){const t=document.createElement("div");t.className="csk-quick-replies";for(const r of e.quickReplies){const e=document.createElement("button");e.type="button",e.className="csk-quick-reply",e.textContent=r,e.addEventListener("click",()=>{n.dispatchEvent(new CustomEvent("csk:quickReply",{detail:{text:r}}))}),t.appendChild(e)}g.appendChild(t)}u.appendChild(g);const k=document.createElement("button");k.type="button",k.className="csk-newmsg csk-newmsg--hidden",k.innerHTML=`\n \n ${m("new_message")}\n `,n.appendChild(k);const h=document.createElement("div");h.className="csk-history-panel csk-history-panel--hidden",h.innerHTML=`\n
\n ${m("history_title")}\n \n
\n
\n \n
\n
\n `,u.appendChild(h);const b=h.querySelector("#csk-history-back");b&&b.addEventListener("click",()=>{h.classList.add("csk-history-panel--hidden")}),l.addEventListener("click",e=>{e.stopPropagation();const t=h.classList.contains("csk-history-panel--hidden");h.classList.toggle("csk-history-panel--hidden"),t&&n.dispatchEvent(new CustomEvent("csk:loadHistory"))});let f=null;if(e.showCategorySwitch){const e=document.createElement("div");e.className="csk-category-bar";const r=document.createElement("span");r.className="csk-category-bar__label",r.textContent="📚",f=document.createElement("select"),f.id="csk-category-select",f.className="csk-category-select",f.innerHTML=``,f.addEventListener("change",()=>{const e=f.value;n.dispatchEvent(new CustomEvent("csk:categoryChange",{detail:{categoryId:e?Number(e):void 0}}))}),e.appendChild(r),e.appendChild(f),n.appendChild(t),n.appendChild(u),n.appendChild(e)}else n.appendChild(t),n.appendChild(u);const y=document.createElement("div");y.className="csk-input-area";const x=document.createElement("div");x.className="csk-input-wrap";const v=document.createElement("textarea");v.id="csk-input",v.className="csk-input",v.setAttribute("placeholder",m("placeholder")),v.setAttribute("rows","1"),v.setAttribute("autofocus","");const w=document.createElement("button");w.id="csk-send-btn",w.className="csk-send-btn",w.setAttribute("title",m("send")),w.setAttribute("disabled","true"),w.innerHTML='',x.appendChild(v),x.appendChild(w),y.appendChild(x),n.appendChild(y);let _=null;e.showClear&&(_=document.createElement("button"),_.className="csk-clear-btn",_.textContent=m("clear"),_.style.display="none",n.insertBefore(_,y));let E=null;const C=document.createElement("div");C.className="csk-sr-only",C.setAttribute("aria-live","polite"),C.setAttribute("aria-atomic","true"),n.appendChild(C);const I=h.querySelector("#csk-history-search"),$=document.createElement("div");return $.className=`csk-teaser csk-teaser--${"left-bottom"===e.position?"left":"right"} csk-teaser--hidden`,$.setAttribute("role","status"),$.innerHTML=`\n \n ${e.teaserText||m("teaser_text")}\n `,{window:n,messagesContainer:u,inputEl:v,sendBtn:w,clearBtn:_,categorySelect:f,historyPanel:h,welcomeEl:g,newMsgBtn:k,teaserEl:$,searchInput:I,ariaLiveEl:C,showLoading:function(){if(E)return E.style.display="flex",E;const e=document.createElement("div");return e.className="csk-loading",e.innerHTML=`\n
${R}
\n
\n
\n
\n
\n
\n `,u.appendChild(e),E=e,e},hideLoading:function(){E&&E.parentNode&&(E.parentNode.removeChild(E),E=null)}}}(Oe);Ve=i.window,Xe=i.messagesContainer,Ke=i.inputEl,Je=i.sendBtn,Qe=i.clearBtn,Ze=i.categorySelect,en=i.historyPanel,nn=i.showLoading,tn=i.hideLoading,document.body.appendChild(Ve),an=i.teaserEl,document.body.appendChild(an),pn();const b=Ve.querySelector(".csk-header");if(b&&(rn=function(e,n,t){let r=!1,s=0,o=0,a=0,i=0;const c=e=>{if(e.target.closest("button"))return;r=!0,s=e.clientX,o=e.clientY;const t=n.getBoundingClientRect();a=s-t.left,i=o-t.top,document.addEventListener("mousemove",l),document.addEventListener("mouseup",d)},l=e=>{if(!r)return;const t=e.clientX-a,s=e.clientY-i,o=window.innerWidth-n.offsetWidth,c=window.innerHeight-n.offsetHeight;n.style.right="auto",n.style.bottom="auto",n.style.left=`${Math.max(0,Math.min(t,o))}px`,n.style.top=`${Math.max(0,Math.min(s,c))}px`},d=()=>{if(r=!1,document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d),t){const e=n.getBoundingClientRect();t({x:e.left,y:e.top})}};return e.addEventListener("mousedown",c),()=>{e.removeEventListener("mousedown",c),document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d)}}(b,Ve,e=>{!function(e,n){try{localStorage.setItem(vn(e),JSON.stringify(n))}catch(e){}}(Oe.integrateId,e)})),function(e,n){try{const t=localStorage.getItem(vn(e));if(!t)return;const r=JSON.parse(t);if("number"!=typeof r.x||"number"!=typeof r.y)return;const s=window.innerWidth-n.offsetWidth,o=window.innerHeight-n.offsetHeight,a=Math.max(0,Math.min(r.x,s)),i=Math.max(0,Math.min(r.y,o));n.style.right="auto",n.style.bottom="auto",n.style.left=`${a}px`,n.style.top=`${i}px`}catch(e){}}(Oe.integrateId,Ve),Fe(Oe,{messagesContainer:Xe,inputEl:Ke,sendBtn:Je,clearBtn:Qe,categorySelect:Ze,historyPanel:en,welcomeEl:i.welcomeEl,newMsgBtn:i.newMsgBtn,searchInput:i.searchInput,ariaLiveEl:i.ariaLiveEl,showLoading:nn,hideLoading:tn}),Ve.addEventListener("csk:categoryChange",e=>{var n,t;n=e.detail.categoryId,de=n,Ne=null===(t=null==pe?void 0:pe.enableRag)||void 0===t||t,o.lifecycleCategoryChange(null!=n?n:"全部")}),Ve.addEventListener("csk:loadHistory",()=>{!async function(){if(!ye||!pe)return;const e=ye.querySelector("#csk-history-list");if(e){e.innerHTML='
加载中...
';try{const n=await $(1,50,pe.userId,pe.integrateId);Ae=n.list.map(e=>({id:e.conversationId||"",chatId:e.conversationId||"",messageCount:e.messageCount,lastMessageTime:e.lastMessageTime,lastMessagePreview:e.lastMessagePreview,createdAt:e.firstMessageTime||e.createdAt})),Se="",we&&(we.value=""),ee(e,Ae,e=>{Ye(e)},e=>{window.open(S(e),"_blank")},async e=>{confirm(m("history_delete_confirm"))&&await A(e)&&(e===f()&&(ue=[],ge&&ge.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove()),be&&(be.style.display="none"),He()),Ae=Ae.filter(n=>(n.chatId||n.id)!==e),qe())},f())}catch(n){o.error(m("history_load_error"),n),e.innerHTML=`
${m("history_load_error")}
`}}}()}),Ve.addEventListener("csk:quickReply",e=>{var n;n=e.detail.text,!ke||Ie?Promise.resolve():(ke.value=n,je(),Re())}),Ve.addEventListener("csk:retry",e=>{!async function(e){if(!pe||!ge||Ie)return;const n=ue.findIndex(n=>n.id===e&&"ai"===n.role);if(n<0)return;let t="";for(let e=n-1;e>=0;e--)if("user"===ue[e].role){t=ue[e].content;break}if(!t)return;const r=ue.splice(n),s=new Set(r.map(e=>e.id));ge.querySelectorAll(".csk-msg").forEach(e=>{const n=e.dataset.cskMsgId;n&&s.has(n)&&e.remove()}),se(pe.integrateId,ue),He(),await Pe(t)}(e.detail.msgId)}),Ve.addEventListener("csk:feedback",e=>{ze(e.detail.msgId,e.detail.value)}),Ve.addEventListener("csk:newMessage",e=>{var n;if(Ve&&Ve.classList.contains("csk-window--hidden")&&(ln&&ln.classList.remove("csk-launcher__badge--hidden"),(null==Oe?void 0:Oe.sound)&&function(){try{dn||(dn=new(window.AudioContext||window.webkitAudioContext));const e=dn;if("suspended"===e.state)return void e.resume();const n=e.currentTime;[0,.15].forEach((t,r)=>{const s=e.createOscillator(),o=e.createGain();s.type="sine",s.frequency.value=0===r?880:1100,o.gain.setValueAtTime(.15,n+t),o.gain.exponentialRampToValueAtTime(.001,n+t+.12),s.connect(o),o.connect(e.destination),s.start(n+t),s.stop(n+t+.12)})}catch(e){}}(),(null==Oe?void 0:Oe.notification)&&function(){try{if(!("Notification"in window))return;"granted"===Notification.permission?new Notification((null==Oe?void 0:Oe.title)||"AI 智能助手",{body:"收到新消息",icon:void 0,silent:!0}):"denied"!==Notification.permission&&Notification.requestPermission()}catch(e){}}()),(null==Oe?void 0:Oe.onMessage)&&(null===(n=e.detail)||void 0===n?void 0:n.msg))try{Oe.onMessage(e.detail.msg)}catch(e){}}),document.addEventListener("keydown",bn),window.addEventListener("resize",mn),We=!0,o.lifecycleInit(Oe.integrateId,Oe.requestDomain),Oe.onReady)try{Oe.onReady()}catch(e){}Oe.showTeaser&&(cn=setTimeout(()=>{Ve&&Ve.classList.contains("csk-window--hidden")&&function(){if(!an)return;pn(),an.classList.remove("csk-teaser--hidden"),an.addEventListener("click",gn);const e=an.querySelector(".csk-teaser__close");e&&e.addEventListener("click",kn)}()},1500)),Me().catch(e=>{o.warn("chatId 初始化失败,将在发送消息时重试",e)})},destroy:function(){if(!We)return;cn&&(clearTimeout(cn),cn=null),un(),an&&an.parentNode&&(an.parentNode.removeChild(an),an=null),Ge&&Ge.parentNode&&(Ge.parentNode.removeChild(Ge),Ge=null),Ve&&Ve.parentNode&&(Ve.parentNode.removeChild(Ve),Ve=null),rn&&(rn(),rn=null),sn&&(sn(),sn=null),on=null,T&&T.parentNode&&(T.parentNode.removeChild(T),T=null),document.querySelectorAll("style[data-csk-sdk]").forEach(e=>e.remove()),document.removeEventListener("keydown",bn),window.removeEventListener("resize",mn),r(void 0);const e=null==Oe?void 0:Oe.integrateId;Oe=null,We=!1,Xe=null,Ke=null,Je=null,Qe=null,Ze=null,en=null,nn=null,tn=null,ln=null,dn=null,o.lifecycleDestroy(e||"")},open:fn,close:yn,toggle:xn,clearHistory:function(){Oe&&(Qe?Qe.click():confirm("确定清空所有对话记录?")&&oe(Oe.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=En),En}(); +var ChatbotSDK=function(){"use strict";const e="[ChatbotSDK]";let n=!0,t=null;function r(e){t=e||null}const s={},o={info(t,r){n&&console.log(e,t,void 0!==r?r:"")},warn(t,r){n&&console.warn(e,t,void 0!==r?r:"")},error(n,r){if(console.error(e,n,void 0!==r?r:""),t)try{const e=r instanceof Error&&r.type||"error";t({message:n,code:String(e),detail:r})}catch(e){}},time(e){s[e]=Date.now()},timeEnd(t,r){const o=s[t];if(void 0!==o){const a=Date.now()-o;if(delete s[t],n){const n=r?`${r} ${a}ms`:`${t} ${a}ms`;console.log(e,n)}return a}return 0},lifecycleInit(e,n){this.info(`初始化完成 integrateId=${e} requestDomain=${n}`)},lifecycleDestroy(e){this.info(`销毁实例 integrateId=${e}`)},lifecycleSend(e,n){this.info(`发送消息 integrateId=${e} length=${n}`),this.time(`send_${e}`)},lifecycleReply(e,n){const t=this.timeEnd(`send_${e}`,"AI 回复");this.info(`AI 回复 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleError(e,n,t){this.timeEnd(`send_${e}`),this.error(`请求失败 integrateId=${e} status=${n} message=${t}`)},lifecycleClear(e){this.info(`清空会话 integrateId=${e}`)},lifecycleStreamDone(e,n){const t=this.timeEnd(`send_${e}`,"流式回复");this.info(`流式回复完成 integrateId=${e} length=${n} duration=${t}ms`)},lifecycleCategoryChange(e){this.info(`切换知识库分类 categoryId=${e}`)}};const a={"zh-CN":{title:"AI 智能助手",minimize:"最小化",close:"关闭",status_online:"在线",role_selector_label:"服务角色",welcome_title:"你好,我是 AI 智能助手",welcome_desc:"有什么可以帮你的吗?在下方输入框开始提问吧~",placeholder:"输入您的问题...",send:"发送",stop:"停止生成",new_message:"新消息",copy:"复制",copied:"已复制",retry:"重新生成",retrying:"重新生成中...",loading:"正在思考...",stream_interrupted:"回复被中断",stream_unstable:"网络不稳定,内容可能不完整",category_placeholder:"选择知识库分类",category_all:"全部分类",category_load_error:"加载分类失败",source_title:"参考来源",source_count:"{n} 条参考来源",source_loading:"加载来源中...",clear:"清空对话",clear_confirm:"确定清空所有对话记录?",history_title:"历史会话",history_empty:"暂无历史会话",history_load_error:"加载会话列表失败",history_delete_confirm:"确定删除该会话?",history_export:"导出",history_delete:"删除",history_search:"搜索会话...",history_group_today:"今天",history_group_yesterday:"昨天",history_group_week:"本周",history_group_earlier:"更早",feedback_up:"有帮助",feedback_down:"没帮助",teaser_text:"有什么可以帮你的吗?",new_msg_announce:"收到新消息",resize:"拖拽缩放窗口",error_network:"网络连接失败,请检查网络",error_timeout:"请求超时,请稍后重试",error_server:"服务器异常,请稍后重试",error_cors:"跨域请求被拦截,请联系管理员将当前域名加入 API 白名单",error_auth:"鉴权失败,请联系管理员",error_forbidden:"无访问权限,请联系管理员配置",error_not_found:"请求的资源不存在",error_rate_limit:"请求过于频繁,请稍后重试",error_unavailable:"服务暂不可用,请稍后重试",error_unknown:"请求发生未知错误",error_send:"发送失败,请稍后重试",error_stream_unsupported:"浏览器不支持流式读取"},en:{title:"AI Assistant",minimize:"Minimize",close:"Close",status_online:"Online",role_selector_label:"Service",welcome_title:"Hi, I am your AI assistant",welcome_desc:"How can I help you? Type your question below to get started.",placeholder:"Type your question...",send:"Send",stop:"Stop generating",new_message:"New message",copy:"Copy",copied:"Copied",retry:"Regenerate",retrying:"Regenerating...",loading:"Thinking...",stream_interrupted:"Response interrupted",stream_unstable:"Network unstable, content may be incomplete",category_placeholder:"Select category",category_all:"All categories",category_load_error:"Failed to load categories",source_title:"Sources",source_count:"{n} source(s)",source_loading:"Loading sources...",clear:"Clear chat",clear_confirm:"Clear all conversation history?",history_title:"History",history_empty:"No conversations yet",history_load_error:"Failed to load conversations",history_delete_confirm:"Delete this conversation?",history_export:"Export",history_delete:"Delete",history_search:"Search conversations...",history_group_today:"Today",history_group_yesterday:"Yesterday",history_group_week:"This Week",history_group_earlier:"Earlier",feedback_up:"Helpful",feedback_down:"Not helpful",teaser_text:"How can I help you?",new_msg_announce:"New message received",resize:"Resize window",error_network:"Network connection failed",error_timeout:"Request timed out, please try again",error_server:"Server error, please try again later",error_cors:"CORS request blocked. Please contact admin to whitelist your domain",error_auth:"Authentication failed, please contact admin",error_forbidden:"Access denied, please contact admin",error_not_found:"Resource not found",error_rate_limit:"Too many requests, please try again later",error_unavailable:"Service temporarily unavailable",error_unknown:"Unknown request error",error_send:"Failed to send, please try again",error_stream_unsupported:"Browser does not support streaming"}};let i="zh-CN";function c(e,n){let t=(a[i]||a["zh-CN"])[e]||a["zh-CN"][e]||e;if(n)for(const[e,r]of Object.entries(n))t=t.replace(`{${e}}`,String(r));return t}let l=null,d=null;function p(e){d=e}function u(){var e;return null!==(e=null!=d?d:null==l?void 0:l.integrateId)&&void 0!==e?e:""}function h(e){l&&(l.chatId=e)}function m(){return(null==l?void 0:l.chatId)||""}function k(e){if(!l)throw new Error("API 配置未初始化");return`${l.requestDomain.replace(/\/+$/,"")}${e.startsWith("/")?e:`/${e}`}`}function g(e,n,t){null!=t&&("string"==typeof t&&""===t.trim()||e.set(n,String(t)))}async function b(e,n={},t=3e4,r){const s=new AbortController,a=setTimeout(()=>s.abort(),t);r&&(r.aborted?s.abort():r.addEventListener("abort",()=>s.abort(),{once:!0}));try{const t={};n.headers&&(n.headers instanceof Headers?n.headers.forEach((e,n)=>{t[n]=e}):Array.isArray(n.headers)?n.headers.forEach(([e,n])=>{t[e]=n}):Object.assign(t,n.headers)),(null==l?void 0:l.token)&&e.includes("/ai/")&&(t.Authorization=`Bearer ${l.token}`);const r=await fetch(e,Object.assign(Object.assign({},n),{headers:t,signal:s.signal,mode:"cors",credentials:"include"}));return 401===r.status&&e.includes("/ai/")&&o.error("SDK 认证失败:Token 缺失或已过期,请重新调用 /open-api/auth/token 换取 Token"),r}catch(e){if(null==r?void 0:r.aborted)throw new f("aborted","aborted");if(e instanceof DOMException&&"AbortError"===e.name)throw new f(c("error_timeout"),"timeout");if(e instanceof TypeError&&e.message.includes("Failed to fetch"))throw new f(c("error_cors"),"cors");throw new f(c("error_network"),"network")}finally{clearTimeout(a)}}class f extends Error{constructor(e,n){super(e),this.name="CskError",this.type=n}}function y(e){switch(e){case 401:return c("error_auth");case 403:return c("error_forbidden");case 404:return c("error_not_found");case 429:return c("error_rate_limit");case 500:return c("error_server");case 502:case 503:return c("error_unavailable");default:return`${c("error_unknown")}(${e})`}}async function x(e){const n=function(e){const n=new URLSearchParams;return n.set("message",e),n.set("chatId",l.chatId),g(n,"roleId",u()),g(n,"accountId",l.userId),k(`/ai/assistant_app/chat/sync?${n.toString()}`)}(e);o.lifecycleSend(u(),e.length);try{const e=await b(n);if(!e.ok){const n=y(e.status);throw o.lifecycleError(u(),String(e.status),n),new f(n,`http_${e.status}`)}const t=await e.text();return o.lifecycleReply(u(),t.length),t}catch(e){if(e instanceof f)throw e;throw o.lifecycleError(u(),"unknown",String(e)),new f(c("error_unknown"),"unknown")}}async function v(e,n,t,r,s,a,i){var d;const p=a?function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",l.chatId),t.set("rewriteStrategy",l.rewriteStrategy||"REWRITE"),g(t,"roleId",u()),g(t,"accountId",l.userId),g(t,"categoryId",null!=n?n:l.categoryId),k(`/ai/assistant_app/chat/rag/sse?${t.toString()}`)}(e,s):function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",l.chatId),g(t,"roleId",u()),g(t,"accountId",l.userId),g(t,"categoryId",null!=n?n:l.categoryId),k(`/ai/assistant_app/chat/sse?${t.toString()}`)}(e,s);let h="";o.lifecycleSend(u(),e.length);try{const e=await b(p,{},6e4,i);if(!e.ok){const n=y(e.status);return o.lifecycleError(u(),String(e.status),n),void r(new f(n,`http_${e.status}`))}const s=null===(d=e.body)||void 0===d?void 0:d.getReader();if(!s)return void r(new f(c("error_stream_unsupported"),"stream_unsupported"));const a=new TextDecoder("utf-8",{stream:!0});let l="";try{for(;;){const{done:e,value:t}=await s.read();if(e)break;l+=a.decode(t,{stream:!0});const r=l.split("\n");l=r.pop()||"";for(const e of r){const t=e.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const e=t.substring(5).trim();e&&(h+=e,n(e))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(h+=t,n(t))}}}if(l.trim()){const e=l.trim();if(e.startsWith("data:")){const t=e.substring(5).trim();t&&(h+=t,n(t))}else"[DONE]"!==e&&(h+=e,n(e))}}catch(e){if(null==i?void 0:i.aborted)o.info(`流式被用户中断,保留已生成内容 length=${h.length}`);else{if(!(h.length>0))throw e;n("\n\n"+c("stream_unstable"))}}finally{s.releaseLock()}o.lifecycleStreamDone(u(),h.length),t()}catch(e){if((null==i?void 0:i.aborted)||e instanceof f&&"aborted"===e.type)return void t();e instanceof f?r(e):(o.lifecycleError(u(),"unknown",String(e)),r(new f(c("error_network"),"network")))}}async function w(e,n){const t=function(e,n){const t=new URLSearchParams;return t.set("message",e),t.set("chatId",l.chatId),t.set("rewriteStrategy",l.rewriteStrategy||"REWRITE"),g(t,"roleId",u()),g(t,"accountId",l.userId),g(t,"categoryId",null!=n?n:l.categoryId),k(`/ai/assistant_app/rag/sources?${t.toString()}`)}(e,n);try{const e=await b(t);if(!e.ok)throw new f(y(e.status),`http_${e.status}`);const n=await e.json();return n.success&&Array.isArray(n.data)?(o.info(`获取引用来源 count=${n.data.length}`),n.data):[]}catch(e){return o.error("获取引用来源失败",e),[]}}async function _(e=1,n=20,t,r){const s=new URLSearchParams;s.set("page",String(e)),s.set("size",String(n)),t&&s.set("accountId",t),r&&s.set("roleId",r);const a=k(`/ai/sdk/conversation/list?${s.toString()}`);try{const e=await b(a);if(!e.ok)throw new f(y(e.status),`http_${e.status}`);const n=await e.json();return{list:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0,pages:n.pages||0}}catch(e){return o.error("加载会话列表失败",e),{list:[],total:0,pages:0}}}async function E(e){const n=new URLSearchParams;(null==l?void 0:l.userId)&&n.set("accountId",l.userId),u()&&n.set("roleId",u());const t=k(`/ai/sdk/conversation/${e}/messages?${n.toString()}`);try{const e=await b(t);if(!e.ok)throw new f(y(e.status),`http_${e.status}`);const n=await e.json();return{messages:n.success&&Array.isArray(n.data)?n.data:[],total:n.total||0}}catch(e){return o.error("加载会话消息失败",e),{messages:[],total:0}}}async function C(e){const n=new URLSearchParams;(null==l?void 0:l.userId)&&n.set("accountId",l.userId),u()&&n.set("roleId",u());const t=k(`/ai/sdk/conversation/${e}?${n.toString()}`);try{const n=await b(t,{method:"DELETE"});if(!n.ok)throw new f(y(n.status),`http_${n.status}`);const r=await n.json();return o.info(`删除会话 id=${e} success=${r.success}`),r.success||!1}catch(e){return o.error("删除会话失败",e),!1}}function I(e){const n=new URLSearchParams;return(null==l?void 0:l.userId)&&n.set("accountId",l.userId),u()&&n.set("roleId",u()),k(`/ai/sdk/conversation/${e}/export?${n.toString()}`)}async function L(e=!1){if(!l)return"";const n=u();if(!e){const e=function(e,n){try{return localStorage.getItem($(e,n))||""}catch(e){return""}}(n,l.userId);if(e)return l.chatId=e,o.info(`从缓存恢复 chatId=${e}`),e}try{const e=await _(1,5,l.userId,n);if(e.list.length>0){const t=e.list[0],r=t.conversationId||t.chatId||"";if(r)return l.chatId=r,A(n,l.userId,r),o.info(`从后端恢复会话 chatId=${r} messageCount=${t.messageCount}`),r}}catch(e){o.warn("查询后端会话列表失败,将生成新 chatId",e)}const t=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();return l.chatId=t,A(n,l.userId,t),o.info(`生成新 chatId=${t}`),t}function $(e,n){return`csk_chatId_${e}${n?"_"+n:""}`}function A(e,n,t){try{t?localStorage.setItem($(e,n),t):localStorage.removeItem($(e,n))}catch(e){}}let S=null;function N(e){const n=M(e.primaryColor,-15),t=M(e.primaryColor,18),r=function(e){const n=e.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);return n?`${parseInt(n[1],16)}, ${parseInt(n[2],16)}, ${parseInt(n[3],16)}`:"79, 70, 229"}(e.primaryColor);return`\n --csk-primary: ${e.primaryColor};\n --csk-primary-hover: ${n};\n --csk-primary-light: ${t};\n --csk-primary-rgb: ${r};\n --csk-bg-user: linear-gradient(135deg, ${e.primaryColor}, ${n});\n --csk-bg-ai: #ffffff;\n --csk-text-user: #ffffff;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${e.width}px;\n --csk-window-height: ${e.height}px;\n --csk-radius: 16px;\n --csk-shadow-window: 0 12px 48px rgba(15, 23, 42, 0.18), 0 2px 8px rgba(15, 23, 42, 0.06);\n --csk-shadow-bubble: 0 1px 2px rgba(15, 23, 42, 0.06);\n --csk-border: #ECEEF2;\n --csk-bg-app: #F6F7F9;\n `}function M(e,n){const t=e.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return e;const r=e=>Math.max(0,Math.min(255,e)),s=r(parseInt(t[1],16)+n),o=r(parseInt(t[2],16)+n),a=r(parseInt(t[3],16)+n);return`#${s.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function F(e){document.querySelector("style[data-csk-sdk]")||(S=document.createElement("style"),S.setAttribute("data-csk-sdk",""),S.textContent=function(e){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${N(e)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n font-size: 14px;\n line-height: 1.55;\n color: #1F2937;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-sizing: border-box;\n}\n.csk-root *, .csk-root *::before, .csk-root *::after { box-sizing: border-box; }\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 24px;\n z-index: 9998;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n /* E5 梦幻拖尾 — 四段极光渐变慢旋 */\n background: conic-gradient(from 0deg, #ec4899 0deg, #8b5cf6 90deg, #3b82f6 180deg, #06b6d4 270deg, #ec4899 360deg);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: #fff;\n user-select: none;\n overflow: visible;\n /* 半透明白色光环边框,在白色页面上清晰分离按钮与背景 */\n border: 2.5px solid rgba(255, 255, 255, 0.55);\n /* 三层投影:接地阴影 + 彩色光晕,把按钮从白底「托」出来 */\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.06),\n 0 4px 16px rgba(0, 0, 0, 0.10),\n 0 6px 24px rgba(236, 72, 153, 0.28),\n 0 0 48px rgba(236, 72, 153, 0.12);\n transition:\n transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),\n box-shadow 0.25s ease,\n border-color 0.25s ease;\n animation:\n csk-aurora-spin 5s linear infinite,\n csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n.csk-launcher--right { right: 24px; }\n.csk-launcher--left { left: 24px; }\n\n.csk-launcher:hover {\n transform: translateY(-3px) scale(1.08);\n border-color: rgba(255, 255, 255, 0.75);\n box-shadow:\n 0 2px 6px rgba(0, 0, 0, 0.10),\n 0 8px 24px rgba(0, 0, 0, 0.14),\n 0 10px 36px rgba(236, 72, 153, 0.32),\n 0 0 56px rgba(236, 72, 153, 0.14);\n}\n.csk-launcher:active { transform: scale(0.93); }\n.csk-launcher svg {\n width: 30px;\n height: 30px;\n position: relative;\n z-index: 1;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15));\n}\n\n@keyframes csk-launcher-in {\n 0% { opacity: 0; transform: scale(0.5) translateY(16px); }\n 60% { transform: scale(1.06) translateY(-2px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n}\n\n/* ========== E5 梦幻拖尾·全粒子动画系统 ========== */\n/* 极光旋转 */\n@keyframes csk-aurora-spin {\n to { transform: rotate(360deg); }\n}\n\n/* 粒子通用 */\n.csk-pt {\n position: absolute;\n border-radius: 50%;\n background: #fff;\n z-index: 4;\n top: 50%;\n left: 50%;\n pointer-events: none;\n}\n\n/* ── 爆散粒子(8颗,不同方向/距离/大小/延迟)── */\n.csk-pt-burst { animation: csk-burst 2.8s ease-in-out infinite; }\n.csk-pt-burst:nth-child(1) { width:5px; height:5px; animation-delay:0s; }\n.csk-pt-burst:nth-child(2) { width:4px; height:4px; animation-delay:0.35s; }\n.csk-pt-burst:nth-child(3) { width:5px; height:5px; animation-delay:0.7s; }\n.csk-pt-burst:nth-child(4) { width:3px; height:3px; animation-delay:1.05s; }\n.csk-pt-burst:nth-child(5) { width:5px; height:5px; animation-delay:1.4s; }\n.csk-pt-burst:nth-child(6) { width:4px; height:4px; animation-delay:1.75s; }\n.csk-pt-burst:nth-child(7) { width:3px; height:3px; animation-delay:2.1s; }\n.csk-pt-burst:nth-child(8) { width:5px; height:5px; animation-delay:2.45s; }\n\n@keyframes csk-burst {\n 0% { transform: translate(-50%,-50%) scale(0); opacity: 0; }\n 12% { transform: translate(-50%,-50%) scale(0); opacity: 0; }\n 32% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(1.5); opacity: 1; }\n 48% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0.5); opacity: .55; }\n 62% { transform: translate(-50%,-50%) scale(0); opacity: 0; }\n 100% { transform: translate(-50%,-50%) scale(0); opacity: 0; }\n}\n\n/* ── 浮游粒子(持续轨道运动,永不停歇)── */\n.csk-pt-float {\n animation: csk-float-orbit 3s linear infinite;\n box-shadow: 0 0 4px 1px rgba(255,255,255,.5);\n}\n.csk-pt-float:nth-child(9) { width:3px; height:3px; animation-duration:2.4s; animation-delay:0s; }\n.csk-pt-float:nth-child(10) { width:4px; height:4px; animation-duration:3.2s; animation-delay:-0.6s; }\n.csk-pt-float:nth-child(11) { width:3px; height:3px; animation-duration:2.8s; animation-delay:-1.2s; }\n.csk-pt-float:nth-child(12) { width:4px; height:4px; animation-duration:3.6s; animation-delay:-1.8s; }\n\n@keyframes csk-float-orbit {\n 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(20px) rotate(0deg); }\n 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(20px) rotate(-360deg); }\n}\n\n/* ── 心跳粒子(中心脉冲 + 呼吸缩放)── */\n.csk-pt-pulse {\n animation: csk-heart-pulse 1.4s ease-in-out infinite;\n}\n.csk-pt-pulse:nth-child(13) {\n width: 8px; height: 8px;\n box-shadow: 0 0 14px 4px rgba(255,255,255,.8), 0 0 28px 8px rgba(255,255,255,.3);\n animation-delay: 0s;\n}\n.csk-pt-pulse:nth-child(14) {\n width: 4px; height: 4px;\n box-shadow: 0 0 8px 2px rgba(255,255,255,.6);\n animation-delay: 0.7s;\n}\n\n@keyframes csk-heart-pulse {\n 0%, 100% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; }\n 25% { transform: translate(-50%,-50%) scale(1.6); opacity: 1; }\n 50% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; }\n 75% { transform: translate(-50%,-50%) scale(0.9); opacity: .6; }\n}\n\n/* ── 甩尾粒子(椭圆轨道 + 变速,近大远小)── */\n.csk-pt-elliptic {\n animation: csk-elliptic-orbit 2.6s ease-in-out infinite;\n box-shadow: 0 0 5px 1px rgba(255,255,255,.6);\n}\n.csk-pt-elliptic:nth-child(15) { width:4px; height:4px; animation-delay:0s; }\n.csk-pt-elliptic:nth-child(16) { width:4px; height:4px; animation-delay:-1.3s; }\n\n@keyframes csk-elliptic-orbit {\n 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(18px) rotate(0deg) scaleY(1); }\n 25% { transform: translate(-50%,-50%) rotate(90deg) translateX(18px) rotate(-90deg) scaleY(0.45); }\n 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(18px) rotate(-180deg) scaleY(1); }\n 75% { transform: translate(-50%,-50%) rotate(270deg) translateX(18px) rotate(-270deg) scaleY(0.45); }\n 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(18px) rotate(-360deg) scaleY(1); }\n}\n\n/* ── 环绕流光(外层慢速光环拖尾)── */\n.csk-pt-ring {\n width: 3px; height: 3px;\n background: rgba(255,255,255,.9);\n box-shadow: 0 0 6px 2px rgba(255,255,255,.7);\n animation: csk-ring-orbit 5s linear infinite;\n}\n.csk-pt-ring:nth-child(17) { animation-delay: 0s; }\n.csk-pt-ring:nth-child(18) { animation-delay: -1.25s; }\n.csk-pt-ring:nth-child(19) { animation-delay: -2.5s; }\n.csk-pt-ring:nth-child(20) { animation-delay: -3.75s; }\n\n@keyframes csk-ring-orbit {\n 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(23px) rotate(0deg) scale(1); opacity: .8; }\n 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(23px) rotate(-180deg) scale(1.8); opacity: 1; }\n 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(23px) rotate(-360deg) scale(1); opacity: .8; }\n}\n\n/* ── 极光扫光叠加层 ── */\n.csk-sheen {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n pointer-events: none;\n z-index: 3;\n overflow: hidden;\n}\n.csk-sheen::after {\n content: '';\n position: absolute;\n top: -60%; left: -60%;\n width: 35%; height: 220%;\n background: rgba(255,255,255,.15);\n transform: rotate(22deg);\n animation: csk-shimmer-sweep 2.8s ease-in-out infinite;\n}\n@keyframes csk-shimmer-sweep {\n 0% { left: -60%; }\n 40% { left: 50%; }\n 60% { left: 50%; }\n 100% { left: 130%; }\n}\n\n/* ── 双层极光圈(反向旋转,增加层次)── */\n.csk-dual {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n pointer-events: none;\n z-index: 2;\n background: conic-gradient(from 180deg, transparent 0%, rgba(255,255,255,.08) 35%, transparent 65%);\n animation: csk-aurora-spin 2s linear infinite reverse;\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 24px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: var(--csk-window-height);\n max-height: calc(100vh - 48px);\n background: #fff;\n border-radius: var(--csk-radius);\n box-shadow: var(--csk-shadow-window);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform-origin: bottom right;\n transition: opacity 0.24s ease, transform 0.24s cubic-bezier(0.34, 1.2, 0.64, 1), visibility 0.24s;\n opacity: 1;\n transform: translateY(0) scale(1);\n visibility: visible;\n pointer-events: auto;\n}\n.csk-window--right { right: 24px; transform-origin: bottom right; }\n.csk-window--left { left: 24px; transform-origin: bottom left; }\n.csk-window--hidden {\n opacity: 0;\n transform: translateY(12px) scale(0.96);\n visibility: hidden;\n pointer-events: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n min-height: 60px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: move;\n user-select: none;\n position: relative;\n flex-shrink: 0;\n}\n.csk-header::after {\n content: '';\n position: absolute;\n left: 0; right: 0; bottom: 0;\n height: 24px;\n background: linear-gradient(to bottom, rgba(0,0,0,0.04), transparent);\n pointer-events: none;\n}\n.csk-header__left {\n display: flex;\n align-items: center;\n gap: 12px;\n min-width: 0;\n}\n.csk-header__avatar {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.22);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25);\n}\n.csk-header__avatar svg { width: 22px; height: 22px; }\n.csk-header__info {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n letter-spacing: 0.2px;\n}\n.csk-header__status {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n opacity: 0.9;\n margin-top: 2px;\n}\n.csk-status-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #6EE7B7;\n box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7);\n animation: csk-status-pulse 2s infinite;\n}\n@keyframes csk-status-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0.7); }\n 70% { box-shadow: 0 0 0 6px rgba(110, 231, 183, 0); }\n 100% { box-shadow: 0 0 0 0 rgba(110, 231, 183, 0); }\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-shrink: 0;\n}\n.csk-header__btn,\n.csk-history-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.15s, transform 0.15s;\n}\n.csk-header__btn:hover,\n.csk-history-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n.csk-header__btn:active,\n.csk-history-btn:active { transform: scale(0.92); }\n\n/* ========== 角色选择器 ========== */\n.csk-role-select-wrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n margin: 0 4px;\n}\n.csk-role-select {\n appearance: none;\n -webkit-appearance: none;\n padding: 4px 24px 4px 10px;\n border: 1px solid rgba(255, 255, 255, 0.35);\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.15) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='white' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 6px center;\n color: #fff;\n font-size: 12px;\n font-family: inherit;\n cursor: pointer;\n outline: none;\n transition: background 0.15s, border-color 0.15s;\n max-width: 120px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-role-select:hover {\n background-color: rgba(255, 255, 255, 0.25);\n border-color: rgba(255, 255, 255, 0.55);\n}\n.csk-role-select:focus {\n border-color: rgba(255, 255, 255, 0.7);\n box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);\n}\n.csk-role-select option {\n color: #1F2937;\n background: #fff;\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 20px 16px 12px;\n background: var(--csk-bg-app);\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar { width: 6px; }\n.csk-messages::-webkit-scrollbar-track { background: transparent; }\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D8DCE3;\n border-radius: 3px;\n}\n.csk-messages::-webkit-scrollbar-thumb:hover { background: #C2C7D0; }\n\n/* 欢迎空状态 */\n.csk-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px 32px;\n color: #6B7280;\n animation: csk-fade-in 0.3s ease;\n}\n.csk-welcome__avatar {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: var(--csk-bg-user);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 14px;\n box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-welcome__avatar svg { width: 30px; height: 30px; }\n.csk-welcome__title {\n font-size: 15px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.csk-welcome__desc {\n font-size: 13px;\n color: #9CA3AF;\n line-height: 1.6;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n margin-bottom: 18px;\n max-width: 100%;\n word-break: break-word;\n animation: csk-msg-in 0.28s cubic-bezier(0.22, 1, 0.36, 1);\n}\n.csk-msg--user {\n flex-direction: row-reverse;\n align-items: flex-end;\n}\n.csk-msg--ai {\n flex-direction: row;\n align-items: flex-start;\n}\n.csk-msg__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg__avatar svg { width: 18px; height: 18px; }\n.csk-msg__avatar--ai {\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n}\n.csk-msg__avatar--user {\n background: var(--csk-bg-user);\n color: #fff;\n}\n.csk-msg__content {\n display: flex;\n flex-direction: column;\n min-width: 0;\n max-width: calc(100% - 46px);\n}\n.csk-msg--user .csk-msg__content { align-items: flex-end; }\n.csk-msg--ai .csk-msg__content { align-items: flex-start; }\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 16px;\n font-size: 14px;\n line-height: 1.6;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 16px 16px 4px 16px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 16px 16px 16px 4px;\n border: 1px solid var(--csk-border);\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 5px;\n padding: 0 4px;\n}\n\n@keyframes csk-msg-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes csk-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n margin-bottom: 18px;\n animation: csk-msg-in 0.28s ease;\n}\n.csk-loading__avatar {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n background: #fff;\n color: var(--csk-primary);\n border: 1px solid var(--csk-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0 8px;\n box-shadow: var(--csk-shadow-bubble);\n}\n.csk-loading__avatar svg { width: 18px; height: 18px; }\n.csk-loading__bubble {\n background: #fff;\n border: 1px solid var(--csk-border);\n border-radius: 16px 16px 16px 4px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.csk-loading__dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #B4B9C2;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.6; }\n 40% { transform: scale(1); opacity: 1; }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n padding: 10px 12px 14px;\n background: #fff;\n border-top: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-input-wrap {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n background: var(--csk-bg-app);\n border: 1px solid var(--csk-border);\n border-radius: 14px;\n padding: 6px 6px 6px 14px;\n transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;\n}\n.csk-input-wrap--focus {\n border-color: var(--csk-primary);\n background: #fff;\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n.csk-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 8px 0;\n font-size: 14px;\n outline: none;\n font-family: inherit;\n resize: none;\n min-height: 22px;\n max-height: 120px;\n line-height: 1.5;\n color: #1F2937;\n}\n.csk-input::placeholder { color: #9CA3AF; }\n.csk-root .csk-input:focus-visible { outline: none; }\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n min-width: 36px;\n border: none;\n border-radius: 10px;\n background: var(--csk-bg-user);\n color: #fff;\n cursor: pointer;\n transition: transform 0.18s, box-shadow 0.18s, opacity 0.18s;\n box-shadow: 0 3px 10px rgba(var(--csk-primary-rgb), 0.3);\n}\n.csk-send-btn:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 5px 14px rgba(var(--csk-primary-rgb), 0.4);\n}\n.csk-send-btn:active:not(:disabled) { transform: scale(0.92); }\n.csk-send-btn:disabled {\n background: #D1D5DB;\n box-shadow: none;\n cursor: not-allowed;\n opacity: 0.7;\n}\n.csk-send-btn svg { width: 18px; height: 18px; }\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 999px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-clear-btn:hover {\n background: #FEF2F2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== P1: 知识库分类下拉 ========== */\n.csk-category-bar {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n border-top: 1px solid var(--csk-border);\n background: #FBFBFC;\n gap: 8px;\n flex-shrink: 0;\n}\n.csk-category-bar__label {\n font-size: 13px;\n white-space: nowrap;\n}\n.csk-category-select {\n flex: 1;\n padding: 6px 28px 6px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n color: #374151;\n background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239CA3AF' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") no-repeat right 9px center;\n appearance: none;\n -webkit-appearance: none;\n outline: none;\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.2s, box-shadow 0.2s;\n max-width: 220px;\n}\n.csk-category-select:focus {\n border-color: var(--csk-primary);\n box-shadow: 0 0 0 3px rgba(var(--csk-primary-rgb), 0.12);\n}\n\n/* ========== P1: RAG 引用来源卡片 ========== */\n.csk-sources {\n margin-top: 8px;\n border: 1px solid var(--csk-border);\n border-radius: 12px;\n overflow: hidden;\n font-size: 12px;\n max-width: 100%;\n background: #FAFBFC;\n}\n.csk-sources__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: #F3F4F7;\n cursor: pointer;\n user-select: none;\n transition: background 0.15s;\n}\n.csk-sources__header:hover { background: #ECEEF2; }\n.csk-sources__title {\n display: flex;\n align-items: center;\n gap: 5px;\n font-weight: 500;\n color: #374151;\n}\n.csk-sources__arrow {\n transition: transform 0.2s;\n color: #9CA3AF;\n font-size: 10px;\n}\n.csk-sources--collapsed .csk-sources__arrow { transform: rotate(-90deg); }\n.csk-sources__body {\n border-top: 1px solid var(--csk-border);\n padding: 0;\n}\n.csk-sources--collapsed .csk-sources__body { display: none; }\n.csk-source-item {\n padding: 9px 12px;\n border-bottom: 1px solid #F0F1F4;\n transition: background 0.15s;\n}\n.csk-source-item:last-child { border-bottom: none; }\n.csk-source-item:hover { background: #fff; }\n.csk-source-item__name {\n font-weight: 500;\n color: #1F2937;\n margin-bottom: 3px;\n}\n.csk-source-item__snippet {\n color: #6B7280;\n line-height: 1.5;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.csk-source-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n}\n\n/* ========== P1: Markdown 渲染样式 ========== */\n.csk-msg--ai .csk-msg__bubble .csk-md-p { margin: 0 0 8px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-p:last-child { margin-bottom: 0; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h1,\n.csk-msg--ai .csk-msg__bubble .csk-md-h2,\n.csk-msg--ai .csk-msg__bubble .csk-md-h3,\n.csk-msg--ai .csk-msg__bubble .csk-md-h4,\n.csk-msg--ai .csk-msg__bubble .csk-md-h5,\n.csk-msg--ai .csk-msg__bubble .csk-md-h6 {\n margin: 14px 0 6px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-h1 { font-size: 20px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h2 { font-size: 17px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h3 { font-size: 15px; }\n.csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; }\n\n.csk-md-code-block {\n position: relative;\n background: #1E293B;\n color: #E2E8F0;\n padding: 12px 14px;\n border-radius: 10px;\n overflow-x: auto;\n margin: 8px 0;\n font-size: 13px;\n line-height: 1.55;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', monospace;\n}\n.csk-md-code-block code {\n background: none;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n color: inherit;\n}\n.csk-md-inline-code {\n background: rgba(var(--csk-primary-rgb), 0.1);\n color: var(--csk-primary);\n padding: 1px 6px;\n border-radius: 5px;\n font-size: 13px;\n font-family: 'SF Mono', 'Consolas', 'Menlo', 'Monaco', monospace;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol {\n padding-left: 22px;\n margin: 6px 0;\n}\n.csk-msg--ai .csk-msg__bubble .csk-md-ul li,\n.csk-msg--ai .csk-msg__bubble .csk-md-ol li { margin-bottom: 4px; }\n.csk-md-blockquote {\n border-left: 3px solid var(--csk-primary);\n padding: 2px 12px;\n margin: 8px 0;\n color: #6B7280;\n background: rgba(var(--csk-primary-rgb), 0.05);\n border-radius: 0 6px 6px 0;\n}\n.csk-md-link {\n color: var(--csk-primary);\n text-decoration: none;\n border-bottom: 1px solid rgba(var(--csk-primary-rgb), 0.3);\n transition: border-color 0.15s;\n}\n.csk-md-link:hover { border-bottom-color: var(--csk-primary); }\n.csk-md-hr {\n border: none;\n border-top: 1px solid var(--csk-border);\n margin: 12px 0;\n}\n\n/* ========== P2: 会话管理面板 ========== */\n.csk-history-panel {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: #fff;\n z-index: 10;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: csk-slide-in 0.24s ease;\n}\n.csk-history-panel--hidden { display: none; }\n@keyframes csk-slide-in {\n from { transform: translateX(100%); opacity: 0.4; }\n to { transform: translateX(0); opacity: 1; }\n}\n.csk-history-panel__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--csk-border);\n background: var(--csk-bg-app);\n flex-shrink: 0;\n}\n.csk-history-panel__title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n}\n.csk-history-panel__back {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 5px 12px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n background: #fff;\n color: #374151;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n}\n.csk-history-panel__back:hover { background: #F3F4F6; }\n.csk-history-panel__list {\n flex: 1;\n overflow-y: auto;\n padding: 10px;\n}\n.csk-history-panel__list::-webkit-scrollbar { width: 5px; }\n.csk-history-panel__list::-webkit-scrollbar-thumb { background: #E5E7EB; border-radius: 2px; }\n.csk-history-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 11px 12px;\n border-radius: 10px;\n cursor: pointer;\n transition: background 0.15s;\n margin-bottom: 5px;\n border: 1px solid transparent;\n}\n.csk-history-item:hover { background: #F3F4F6; }\n.csk-history-item--active {\n background: rgba(var(--csk-primary-rgb), 0.08);\n border-color: rgba(var(--csk-primary-rgb), 0.2);\n}\n.csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.12); }\n.csk-history-item__info { flex: 1; min-width: 0; }\n.csk-history-item__id {\n font-size: 13px;\n font-weight: 500;\n color: #1F2937;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-history-item__meta {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 3px;\n}\n.csk-history-item__actions {\n display: flex;\n gap: 4px;\n margin-left: 8px;\n opacity: 0;\n transition: opacity 0.15s;\n}\n.csk-history-item:hover .csk-history-item__actions { opacity: 1; }\n.csk-history-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 7px;\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s;\n}\n.csk-history-action--export { background: #EFF6FF; color: #2563EB; }\n.csk-history-action--export:hover { background: #DBEAFE; }\n.csk-history-action--delete { background: #FEF2F2; color: #DC2626; }\n.csk-history-action--delete:hover { background: #FEE2E2; }\n.csk-history-panel__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 20px;\n color: #9CA3AF;\n font-size: 13px;\n text-align: center;\n}\n.csk-history-panel__empty-icon {\n font-size: 34px;\n margin-bottom: 10px;\n opacity: 0.5;\n}\n.csk-history-panel__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #9CA3AF;\n font-size: 13px;\n}\n\n/* ========== 快捷问题芯片 ========== */\n.csk-quick-replies {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: center;\n margin-top: 18px;\n max-width: 320px;\n}\n.csk-quick-reply {\n border: 1px solid var(--csk-border);\n background: #fff;\n color: #374151;\n font-size: 12.5px;\n padding: 7px 13px;\n border-radius: 999px;\n cursor: pointer;\n font-family: inherit;\n line-height: 1.3;\n transition: all 0.18s ease;\n max-width: 100%;\n}\n.csk-quick-reply:hover {\n border-color: var(--csk-primary);\n color: var(--csk-primary);\n background: rgba(var(--csk-primary-rgb), 0.06);\n transform: translateY(-1px);\n}\n.csk-quick-reply:active { transform: scale(0.96); }\n\n/* ========== AI 消息操作条 ========== */\n.csk-msg__actions {\n display: flex;\n gap: 2px;\n margin-top: 5px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.csk-msg--ai:hover .csk-msg__actions { opacity: 1; }\n.csk-msg--streaming .csk-msg__actions { display: none; }\n.csk-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n.csk-action-btn:hover {\n background: #F3F4F6;\n color: #374151;\n}\n.csk-action-btn--done { color: #10B981; }\n.csk-action-btn:active { transform: scale(0.9); }\n\n/* ========== 流式打字光标 ========== */\n.csk-caret {\n display: inline-block;\n width: 7px;\n height: 15px;\n margin-left: 2px;\n vertical-align: text-bottom;\n background: var(--csk-primary);\n border-radius: 1px;\n animation: csk-caret-blink 1s step-end infinite;\n}\n@keyframes csk-caret-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n}\n\n/* ========== 代码块复制按钮 ========== */\n.csk-md-code-copy {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(255, 255, 255, 0.12);\n color: #CBD5E1;\n border-radius: 6px;\n cursor: pointer;\n opacity: 0;\n transition: all 0.15s ease;\n}\n.csk-md-code-block:hover .csk-md-code-copy { opacity: 1; }\n.csk-md-code-copy:hover { background: rgba(255, 255, 255, 0.22); color: #fff; }\n.csk-md-code-copy:active { transform: scale(0.9); }\n\n/* ========== 新消息提示按钮 ========== */\n.csk-newmsg {\n position: absolute;\n bottom: 82px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 5;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 7px 14px;\n border: none;\n background: var(--csk-primary);\n color: #fff;\n font-size: 12px;\n font-family: inherit;\n border-radius: 999px;\n cursor: pointer;\n box-shadow: 0 4px 14px rgba(var(--csk-primary-rgb), 0.38);\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n animation: csk-msg-in 0.25s ease;\n white-space: nowrap;\n}\n.csk-newmsg:hover { transform: translateX(-50%) translateY(-1px); box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.48); }\n.csk-newmsg:active { transform: translateX(-50%) scale(0.95); }\n.csk-newmsg--hidden { display: none; }\n\n/* ========== 发送按钮停止态 ========== */\n.csk-send-btn--stop {\n background: #EF4444 !important;\n box-shadow: 0 3px 10px rgba(239, 68, 68, 0.35) !important;\n}\n.csk-send-btn--stop:hover:not(:disabled) {\n box-shadow: 0 5px 14px rgba(239, 68, 68, 0.45) !important;\n}\n\n/* ========== 窗口缩放拖拽手柄 ========== */\n.csk-resize-handle {\n position: absolute;\n right: 4px;\n bottom: 4px;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: flex-end;\n justify-content: flex-end;\n cursor: nwse-resize;\n z-index: 5;\n user-select: none;\n -webkit-user-select: none;\n /* 圆形半透明背景,与整体圆润风格一致 */\n border-radius: 50%;\n background: transparent;\n transition: background 0.2s ease;\n}\n.csk-resize-handle:hover {\n background: rgba(var(--csk-primary-rgb), 0.08);\n}\n\n/* 三斜线抓手 — 纯 CSS 绘制,用两条间距微调的线,视觉上是三条 */\n.csk-resize-grip {\n display: block;\n width: 10px;\n height: 10px;\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n #C8CCD2 38%, #C8CCD2 42%,\n transparent 42%, transparent 54%,\n #C8CCD2 54%, #C8CCD2 58%,\n transparent 58%, transparent 70%,\n #C8CCD2 70%, #C8CCD2 74%,\n transparent 74%\n );\n transition: background 0.2s ease;\n border-radius: 2px;\n}\n/* hover 时线条变为主色 */\n.csk-resize-handle:hover .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n var(--csk-primary) 38%, var(--csk-primary) 42%,\n transparent 42%, transparent 54%,\n var(--csk-primary) 54%, var(--csk-primary) 58%,\n transparent 58%, transparent 70%,\n var(--csk-primary) 70%, var(--csk-primary) 74%,\n transparent 74%\n );\n}\n\n/* 暗色模式 */\n.csk-dark .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n #5B6070 38%, #5B6070 42%,\n transparent 42%, transparent 54%,\n #5B6070 54%, #5B6070 58%,\n transparent 58%, transparent 70%,\n #5B6070 70%, #5B6070 74%,\n transparent 74%\n );\n}\n.csk-dark .csk-resize-handle:hover .csk-resize-grip {\n background:\n linear-gradient(135deg,\n transparent 0%, transparent 38%,\n var(--csk-primary-light) 38%, var(--csk-primary-light) 42%,\n transparent 42%, transparent 54%,\n var(--csk-primary-light) 54%, var(--csk-primary-light) 58%,\n transparent 58%, transparent 70%,\n var(--csk-primary-light) 70%, var(--csk-primary-light) 74%,\n transparent 74%\n );\n}\n\n/* 缩放拖拽中:禁用过渡动画 + 全局光标 */\n.csk-window--resizing {\n transition: none !important;\n user-select: none;\n}\n.csk-window--resizing * { cursor: nwse-resize !important; }\n\n/* ========== 暗色模式 ========== */\n.csk-root.csk-dark {\n --csk-bg-ai: #1E1E2E;\n --csk-text-ai: #E2E8F0;\n --csk-border: #3B3B52;\n --csk-bg-app: #141421;\n color: #E2E8F0;\n}\n.csk-dark .csk-window {\n background: #1A1A2E;\n box-shadow: 0 12px 48px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);\n}\n.csk-dark .csk-header::after { background: linear-gradient(to bottom, rgba(0,0,0,0.12), transparent); }\n.csk-dark .csk-msg__avatar--ai {\n background: var(--csk-bg-ai);\n color: var(--csk-primary);\n border-color: var(--csk-border);\n}\n.csk-dark .csk-input-area { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-input-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-input-wrap--focus { background: #1A1A2E; border-color: var(--csk-primary); }\n.csk-dark .csk-input { color: #E2E8F0; }\n.csk-dark .csk-loading__avatar { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__bubble { background: var(--csk-bg-ai); border-color: var(--csk-border); }\n.csk-dark .csk-loading__dot { background: #6B7280; }\n.csk-dark .csk-category-bar { background: #1A1A2E; border-top-color: var(--csk-border); }\n.csk-dark .csk-category-select { background-color: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-sources { background: #1E1E2E; border-color: var(--csk-border); }\n.csk-dark .csk-sources__header { background: #25253A; }\n.csk-dark .csk-sources__header:hover { background: #2D2D48; }\n.csk-dark .csk-source-item:hover { background: var(--csk-bg-ai); }\n.csk-dark .csk-source-item__name { color: #E2E8F0; }\n.csk-dark .csk-source-item__meta { color: #6B7280; }\n.csk-dark .csk-history-panel { background: #1A1A2E; }\n.csk-dark .csk-history-panel__header { background: var(--csk-bg-app); border-bottom-color: var(--csk-border); }\n.csk-dark .csk-history-panel__back { background: var(--csk-bg-app); border-color: var(--csk-border); color: #E2E8F0; }\n.csk-dark .csk-history-panel__back:hover { background: #2D2D48; }\n.csk-dark .csk-history-item:hover { background: #25253A; }\n.csk-dark .csk-history-item__id { color: #E2E8F0; }\n.csk-dark .csk-history-item__meta { color: #6B7280; }\n.csk-dark .csk-history-item--active { background: rgba(var(--csk-primary-rgb), 0.15); }\n.csk-dark .csk-history-item--active:hover { background: rgba(var(--csk-primary-rgb), 0.22); }\n.csk-dark .csk-action-btn:hover { background: #2D2D48; color: #E2E8F0; }\n.csk-dark .csk-clear-btn { background: var(--csk-bg-app); border-color: var(--csk-border); color: #9CA3AF; }\n.csk-dark .csk-clear-btn:hover { background: #3B1A1A; border-color: #7F1D1D; color: #FCA5A5; }\n.csk-dark .csk-md-code-block { background: #0F0F1A; }\n.csk-dark .csk-md-blockquote { background: rgba(var(--csk-primary-rgb), 0.08); }\n.csk-dark .csk-md-link { color: var(--csk-primary-light); }\n.csk-dark .csk-msg--ai .csk-msg__bubble { background: var(--csk-bg-ai); color: var(--csk-text-ai); border-color: var(--csk-border); }\n.csk-dark .csk-welcome__title { color: #E2E8F0; }\n.csk-dark .csk-welcome__desc { color: #6B7280; }\n.csk-dark .csk-quick-reply { background: var(--csk-bg-app); border-color: var(--csk-border); color: #CBD5E1; }\n.csk-dark .csk-quick-reply:hover { background: rgba(var(--csk-primary-rgb), 0.12); border-color: var(--csk-primary); color: var(--csk-primary-light); }\n.csk-dark .csk-teaser { background: #2D2D48; color: #E2E8F0; box-shadow: 0 4px 20px rgba(0,0,0,0.35); }\n.csk-dark .csk-teaser::after { border-top-color: #2D2D48; }\n.csk-dark .csk-teaser__close { color: #6B7280; }\n.csk-dark .csk-teaser__close:hover { color: #9CA3AF; }\n.csk-dark .csk-feedback-btn { background: rgba(var(--csk-primary-rgb), 0.1); color: #9CA3AF; }\n.csk-dark .csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.2); color: var(--csk-primary-light); }\n.csk-dark .csk-feedback-btn--active { background: rgba(var(--csk-primary-rgb), 0.28); color: var(--csk-primary-light); }\n.csk-dark .csk-history-panel__search-wrap { background: var(--csk-bg-app); border-color: var(--csk-border); }\n.csk-dark .csk-history-panel__search-wrap:focus-within { border-color: var(--csk-primary); }\n.csk-dark .csk-history-panel__search { color: #E2E8F0; }\n.csk-dark .csk-launcher__badge { box-shadow: 0 0 0 2px #1A1A2E; }\n.csk-dark .csk-welcome__avatar { box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.25); }\n.csk-dark .csk-header__avatar { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.1); }\n.csk-dark .csk-role-select option {\n background: #1A1A2E;\n color: #E2E8F0;\n}\n\n/* Launcher 拖拽态:微放大 + 阴影加深 */\n.csk-launcher--dragging {\n cursor: grabbing !important;\n transform: scale(1.1) !important;\n box-shadow:\n 0 4px 12px rgba(0, 0, 0, 0.14),\n 0 12px 32px rgba(0, 0, 0, 0.18),\n 0 14px 40px rgba(236, 72, 153, 0.36),\n 0 0 56px rgba(236, 72, 153, 0.18) !important;\n}\n/* 拖拽中隐藏未读徽章 */\n.csk-launcher--dragging .csk-launcher__badge { display: none !important; }\n/* 吸附过渡动画(释放时的缓动) */\n.csk-launcher--snap {\n transition: left 0.3s ease-out, right 0.3s ease-out, bottom 0.3s ease-out !important;\n}\n\n/* ========== Launcher 未读徽章 ========== */\n.csk-launcher__badge {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #EF4444;\n border: 2px solid #fff;\n box-shadow: 0 0 0 2px #fff;\n animation: csk-badge-in 0.28s cubic-bezier(0.34, 1.56, 0.64, 1);\n pointer-events: none;\n}\n.csk-launcher__badge--hidden { display: none; }\n@keyframes csk-badge-in {\n from { transform: scale(0); }\n to { transform: scale(1); }\n}\n\n/* ========== Launcher 提示气泡 ========== */\n.csk-teaser {\n position: fixed;\n bottom: 90px;\n z-index: 9997;\n max-width: 240px;\n padding: 10px 14px;\n background: #fff;\n color: #1F2937;\n font-size: 13px;\n line-height: 1.5;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(15, 23, 42, 0.15);\n animation: csk-teaser-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);\n cursor: pointer;\n user-select: none;\n}\n.csk-teaser--right { right: 24px; }\n.csk-teaser--left { left: 24px; }\n.csk-teaser::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: 28px;\n width: 12px;\n height: 12px;\n background: inherit;\n border-radius: 2px;\n transform: rotate(45deg);\n box-shadow: 2px 2px 4px rgba(15, 23, 42, 0.08);\n}\n.csk-teaser--left::after { right: auto; left: 28px; }\n.csk-teaser__close {\n position: absolute;\n top: 4px;\n right: 6px;\n background: none;\n border: none;\n font-size: 16px;\n color: #9CA3AF;\n cursor: pointer;\n padding: 2px 4px;\n line-height: 1;\n border-radius: 4px;\n}\n.csk-teaser__close:hover { color: #374151; }\n.csk-teaser--hidden { display: none; }\n@keyframes csk-teaser-in {\n from { opacity: 0; transform: translateY(8px) scale(0.95); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n/* ========== 消息反馈按钮(👍 / 👎) ========== */\n.csk-feedback-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: none;\n background: rgba(var(--csk-primary-rgb), 0.08);\n color: #9CA3AF;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0;\n}\n.csk-feedback-btn:hover { background: rgba(var(--csk-primary-rgb), 0.18); color: var(--csk-primary); }\n.csk-feedback-btn--active {\n background: rgba(var(--csk-primary-rgb), 0.28);\n color: var(--csk-primary);\n}\n.csk-feedback-btn--active.down { background: #FEF2F2; color: #EF4444; }\n.csk-feedback-btn:active { transform: scale(0.9); }\n.csk-msg--streaming .csk-feedback-btn { display: none; }\n\n/* ========== 历史会话搜索框 ========== */\n.csk-history-panel__search-wrap {\n padding: 8px 10px;\n border-bottom: 1px solid var(--csk-border);\n flex-shrink: 0;\n}\n.csk-history-panel__search-wrap:focus-within {\n border-bottom-color: var(--csk-primary);\n}\n.csk-history-panel__search {\n width: 100%;\n padding: 7px 10px;\n border: 1px solid var(--csk-border);\n border-radius: 8px;\n font-size: 12.5px;\n font-family: inherit;\n color: #1F2937;\n background: var(--csk-bg-app);\n outline: none;\n transition: border-color 0.2s;\n}\n.csk-history-panel__search:focus { border-color: var(--csk-primary); }\n.csk-history-panel__search::placeholder { color: #9CA3AF; }\n\n/* ========== a11y 焦点指示 ========== */\n.csk-root :focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n}\n.csk-root button:focus-visible {\n outline: 2px solid var(--csk-primary);\n outline-offset: 2px;\n border-radius: inherit;\n}\n/* 弹窗打开时隐藏 launcher 上的焦点环 */\n.csk-launcher:focus-visible {\n outline: none;\n border-color: rgba(255, 255, 255, 0.75);\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.06),\n 0 4px 16px rgba(0, 0, 0, 0.10),\n 0 6px 24px rgba(var(--csk-primary-rgb), 0.28),\n 0 0 48px rgba(var(--csk-primary-rgb), 0.12),\n 0 0 0 4px rgba(var(--csk-primary-rgb), 0.3);\n}\n\n/* ========== a11y aria-live 播报区(视觉隐藏) ========== */\n.csk-sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0,0,0,0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n/* ========== 会话分组标题 ========== */\n.csk-history-group {\n margin-bottom: 4px;\n}\n.csk-history-group__label {\n font-size: 11px;\n font-weight: 600;\n color: #9CA3AF;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: 8px 12px 4px;\n user-select: none;\n}\n.csk-dark .csk-history-group__label { color: #6B7280; }\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n max-height: 100vh;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-resize-handle { display: none !important; }\n .csk-window--hidden { transform: translateY(100%); }\n /* 移动端默认位置,仅在未被 JS 拖拽覆盖时生效 */\n .csk-launcher:not([style*="bottom"]) { bottom: 20px; }\n .csk-launcher--right:not([style*="bottom"]) { right: 20px; }\n .csk-launcher--left:not([style*="bottom"]) { left: 20px; }\n}\n`}(e),document.head.appendChild(S))}function z(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const n=16*Math.random()|0;return("x"===e?n:3&n|8).toString(16)})}function D(e){const n={"&":"&","<":"<",">":">",'"':""","'":"'"};return e.replace(/[&<>"']/g,e=>n[e]||e)}function T(e){const n=new Date(e);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function B(){return Date.now()}const q='';function H(e,n){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===e.position?"left":"right"),t.setAttribute("title",e.title),t.setAttribute("aria-label",e.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=e.launcherIcon;const r=document.createElement("div");r.className="csk-launcher__badge csk-launcher__badge--hidden",t.appendChild(r);const s=function(e,n){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{e.apply(this,r),t=null},n)}}(n,300);return t.addEventListener("click",s),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),s())}),t}function j(){return window.innerHeight-76}function R(e,n,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const s=document.createElement("div");s.className="csk-msg__avatar csk-msg__avatar--user",s.innerHTML='';const o=document.createElement("div");o.className="csk-msg__content";const a=document.createElement("div");a.className="csk-msg__bubble",a.textContent=n;const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=T(t),o.appendChild(a),o.appendChild(i),r.appendChild(s),r.appendChild(o),e.appendChild(r),r}function P(e,n,t,r,s){const o=document.createElement("div");o.className="csk-msg csk-msg--ai",s&&(o.dataset.cskMsgId=s);const a=document.createElement("div");a.className="csk-msg__avatar csk-msg__avatar--ai",a.innerHTML=q;const i=document.createElement("div");i.className="csk-msg__content";const c=document.createElement("div");c.className="csk-msg__bubble",r?c.innerHTML=r(n):c.textContent=n;const l=document.createElement("div");return l.className="csk-msg__time",l.textContent=T(t),i.appendChild(c),i.appendChild(O(c,o)),i.appendChild(l),o.appendChild(a),o.appendChild(i),e.appendChild(o),K(c),o}const Y='',U='';function O(e,n){const t=document.createElement("div");t.className="csk-msg__actions";const r=document.createElement("button");r.type="button",r.className="csk-action-btn",r.setAttribute("title",c("copy")),r.setAttribute("aria-label",c("copy")),r.innerHTML=Y,r.addEventListener("click",async n=>{n.stopPropagation();const t=e.textContent||"";await W(t,r)});const s=document.createElement("button");s.type="button",s.className="csk-action-btn",s.setAttribute("title",c("retry")),s.setAttribute("aria-label",c("retry")),s.innerHTML=U,s.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:retry",{detail:{msgId:n.dataset.cskMsgId||""}}))});const o=document.createElement("button");o.type="button",o.className="csk-feedback-btn",o.setAttribute("title",c("feedback_up")),o.setAttribute("aria-label",c("feedback_up")),o.innerHTML='',o.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"up"}}))});const a=document.createElement("button");return a.type="button",a.className="csk-feedback-btn",a.setAttribute("title",c("feedback_down")),a.setAttribute("aria-label",c("feedback_down")),a.innerHTML='',a.addEventListener("click",e=>{e.stopPropagation();const t=n.closest(".csk-window");t&&t.dispatchEvent(new CustomEvent("csk:feedback",{detail:{msgId:n.dataset.cskMsgId||"",value:"down"}}))}),t.appendChild(r),t.appendChild(s),t.appendChild(o),t.appendChild(a),t}function X(e,n){const t=e.querySelectorAll(".csk-feedback-btn");t.length<2||(t.forEach(e=>e.classList.remove("csk-feedback-btn--active","down")),"up"===n&&t[0]&&t[0].classList.add("csk-feedback-btn--active"),"down"===n&&t[1]&&t[1].classList.add("csk-feedback-btn--active","down"))}async function W(e,n){const t=n.innerHTML;try{if(navigator.clipboard&&window.isSecureContext)await navigator.clipboard.writeText(e);else{const n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}n.innerHTML='',n.classList.add("csk-action-btn--done"),setTimeout(()=>{n.innerHTML=t,n.classList.remove("csk-action-btn--done")},1500)}catch(e){}}function K(e){e.querySelectorAll(".csk-md-code-block").forEach(e=>{if(e.querySelector(".csk-md-code-copy"))return;const n=e.querySelector("code"),t=document.createElement("button");t.type="button",t.className="csk-md-code-copy",t.setAttribute("title",c("copy")),t.setAttribute("aria-label",c("copy")),t.innerHTML=Y,t.addEventListener("click",async e=>{e.stopPropagation(),await W((null==n?void 0:n.textContent)||"",t)}),e.appendChild(t)})}function J(e,n){e.classList.remove("csk-msg--streaming");const t=n.querySelector(".csk-caret");t&&t.remove(),K(n)}function V(e,n){const t=e.querySelector(".csk-sources");if(t&&t.remove(),!n||0===n.length)return;const r=document.createElement("div");r.className="csk-sources csk-sources--collapsed";const s=document.createElement("div");s.className="csk-sources__header";const o=document.createElement("span");o.className="csk-sources__title",o.textContent=`📚 ${c("source_count",{n:n.length})}`;const a=document.createElement("span");a.className="csk-sources__arrow",a.textContent="▼",s.appendChild(o),s.appendChild(a),s.addEventListener("click",()=>{r.classList.toggle("csk-sources--collapsed")});const i=document.createElement("div");i.className="csk-sources__body";for(const e of n){const n=document.createElement("div");n.className="csk-source-item";const t=document.createElement("div");if(t.className="csk-source-item__name",t.textContent=e.title||e.sourceName||"未知文档",e.snippet){const t=document.createElement("div");t.className="csk-source-item__snippet",t.textContent=e.snippet,n.appendChild(t)}const r=document.createElement("div");r.className="csk-source-item__meta";const s=[];e.sourceName&&s.push(e.sourceName),void 0!==e.chunkIndex&&s.push(`分块 #${e.chunkIndex}`),void 0!==e.score&&s.push(`相关度 ${(100*e.score).toFixed(0)}%`),r.textContent=s.join(" · "),n.appendChild(t),n.appendChild(r),i.appendChild(n)}r.appendChild(s),r.appendChild(i);const l=e.querySelector(".csk-msg__time");l&&l.parentNode?l.parentNode.insertBefore(r,l):e.appendChild(r)}function G(e,n,t,r,s,o,a){if(e.innerHTML="",0===n.length){const n=document.createElement("div");return n.className="csk-history-panel__empty",n.innerHTML=`\n
💬
\n
${c("history_empty")}
\n `,void e.appendChild(n)}const i=function(e){const n=new Date,t=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime(),r=t-864e5,s=t-864e5*(n.getDay()||7)+864e5,o={today:[],yesterday:[],week:[],earlier:[]};for(const n of e){const e=n.lastMessageTime||n.createdAt,a=e?new Date(e).getTime():0;a>=t?o.today.push(n):a>=r?o.yesterday.push(n):a>=s?o.week.push(n):o.earlier.push(n)}const a=[];return o.today.length&&a.push({label:c("history_group_today"),items:o.today}),o.yesterday.length&&a.push({label:c("history_group_yesterday"),items:o.yesterday}),o.week.length&&a.push({label:c("history_group_week"),items:o.week}),o.earlier.length&&a.push({label:c("history_group_earlier"),items:o.earlier}),a}(n);for(const n of i){if(i.length>1){const t=document.createElement("div");t.className="csk-history-group";const r=document.createElement("div");r.className="csk-history-group__label",r.textContent=n.label,t.appendChild(r),e.appendChild(t)}for(const a of n.items){const n=document.createElement("div");n.className="csk-history-item";const i=a.chatId||a.id;o&&i===o&&n.classList.add("csk-history-item--active");const l=document.createElement("div");l.className="csk-history-item__info";const d=document.createElement("div");d.className="csk-history-item__id",a.lastMessagePreview?d.textContent=a.lastMessagePreview.length>60?a.lastMessagePreview.substring(0,60)+"...":a.lastMessagePreview:d.textContent=i;const p=document.createElement("div");p.className="csk-history-item__meta";const u=[];a.roleName&&u.push(a.roleName),void 0!==a.messageCount&&u.push(`${a.messageCount} 条消息`),a.lastMessageTime?u.push(a.lastMessageTime):a.createdAt&&u.push(a.createdAt),p.textContent=u.join(" · "),l.appendChild(d),l.appendChild(p);const h=document.createElement("div");h.className="csk-history-item__actions";const m=document.createElement("button");m.className="csk-history-action csk-history-action--export",m.setAttribute("title",c("history_export")),m.innerHTML='',m.addEventListener("click",e=>{e.stopPropagation(),r(a.id)});const k=document.createElement("button");k.className="csk-history-action csk-history-action--delete",k.setAttribute("title",c("history_delete")),k.innerHTML='',k.addEventListener("click",e=>{e.stopPropagation(),s(a.id)}),h.appendChild(m),h.appendChild(k),n.appendChild(l),n.appendChild(h),n.addEventListener("click",()=>{t(i)}),e.appendChild(n)}}}function Q(e){e.scrollTop=e.scrollHeight}function Z(e){return`csk_history_${e}`}function ee(e,n){try{let t=n;t.length>200&&(t=t.slice(50),o.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${t.length} 条`));const r={messages:t,updatedAt:Date.now()};localStorage.setItem(Z(e),JSON.stringify(r))}catch(e){e instanceof Error&&"QuotaExceededError"===e.name?o.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):o.error("保存会话历史失败",e)}}function ne(e){try{localStorage.removeItem(Z(e))}catch(e){o.warn("清空会话历史失败",e)}}const te="\0CODEBLOCK_",re="\0INLINECODE_";function se(e){if(!e||"string"!=typeof e)return"";const n=[];let t=e;t=t.replace(/```(\w*)\n([\s\S]*?)```/g,(e,t,r)=>{const s=n.length,o=D(r.trimEnd()),a=t?` class="language-${D(t)}"`:"";return n.push(`
${o}
`),`${te}${s}\0`});const r=[];t=t.replace(/`([^`\n]+)`/g,(e,n)=>{const t=r.length;return r.push(`${D(n)}`),`${re}${t}\0`}),t=D(t),t=oe(t,te,n),t=oe(t,re,r);const s=t.split("\n"),o=[];let a=!1,i="",c=!1,l=[];for(let e=0;e')){p(),u(),h(),o.push(n);continue}const t=n.match(/^(#{1,6})\s+(.+)/);if(t){p(),u(),h();const e=t[1].length;o.push(`${t[2]}`);continue}const r=n.match(/^>\s?(.*)/);if(r){p(),u(),c||(c=!0,o.push('
')),o.push(`

${d(r[1])}

`);continue}c&&h();const m=n.match(/^[\-\*]\s+(.+)/);if(m){p(),h(),a&&"ul"===i||(u(),a=!0,i="ul",o.push('
    ')),o.push(`
  • ${d(m[1])}
  • `);continue}const k=n.match(/^\d+\.\s+(.+)/);k?(p(),h(),a&&"ol"===i||(u(),a=!0,i="ol",o.push('
      ')),o.push(`
    1. ${d(k[1])}
    2. `)):""!==n.trim()?/^(\*{3,}|-{3,}|_{3,})$/.test(n.trim())?(p(),u(),h(),o.push('
      ')):(u(),h(),l.push(d(n))):(p(),u())}return p(),u(),h(),o.join("\n");function d(e){return e=(e=(e=(e=(e=(e=e.replace(/\*\*(.+?)\*\*/g,"$1")).replace(/__(.+?)__/g,"$1")).replace(/\*(.+?)\*/g,"$1")).replace(/(?$1")).replace(/~~(.+?)~~/g,"$1")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,(e,n,t)=>`${n}`)}function p(){l.length>0&&(o.push(`

      ${l.join("
      ")}

      `),l=[])}function u(){a&&(o.push("ul"===i?"
":""),a=!1,i="")}function h(){c&&(o.push("
"),c=!1)}}function oe(e,n,t){return e.replace(new RegExp(n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(\\d+)\0","g"),(e,n)=>t[parseInt(n)]||"")}let ae,ie=null,ce=[],le=null,de=null,pe=null,ue=null,he=null,me=null,ke=null,ge=null,be=null,fe=null,ye=null,xe=null,ve=null,we=null,_e=!1,Ee=null,Ce=!0,Ie=[],Le="",$e=!1;function Ae(e,n){ie=e,le=n.messagesContainer,de=n.inputEl,pe=n.inputEl.parentElement,ue=n.sendBtn,he=n.clearBtn,me=n.categorySelect,ke=n.roleSelect,ge=n.historyPanel,be=n.welcomeEl,fe=n.newMsgBtn,ye=n.searchInput,xe=n.ariaLiveEl,ve=n.showLoading,we=n.hideLoading,ae=e.categoryId,$e=e.enableRag,function(){if(!de||!ue)return;ue.addEventListener("click",()=>{_e&&Ee?Ee.abort():He()}),de.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),He())}),de.addEventListener("input",()=>{qe(),function(){if(!de)return;de.style.height="auto",de.style.height=`${Math.min(de.scrollHeight,120)}px`}()}),de.addEventListener("focus",()=>{pe&&pe.classList.add("csk-input-wrap--focus")}),de.addEventListener("blur",()=>{pe&&pe.classList.remove("csk-input-wrap--focus")}),he&&he.addEventListener("click",()=>function(){if(!ie)return;if(!confirm(c("clear_confirm")))return;if(ce=[],le){le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove())}he&&(he.style.display="none");Be(),ne(ie.integrateId);const e=function(){const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID().substring(0,8):Math.random().toString(36).substring(2,10);return`sdk_${Date.now()}_${e}`}();h(e),A(ie.integrateId,ie.userId,e),o.lifecycleClear(ie.integrateId),o.info(`新 chatId=${e}`)}())}(),function(){if(!le)return;le.addEventListener("scroll",()=>{if(!le)return;const{scrollTop:e,scrollHeight:n,clientHeight:t}=le;Ce=n-e-t<80,Ce&&Me()}),fe&&fe.addEventListener("click",()=>{le&&Q(le),Ce=!0,Me()})}(),function(){if(!ye)return;ye.addEventListener("input",()=>{Le=ye.value.trim().toLowerCase(),De()})}(),e.showCategorySwitch&&me&&async function(){if(!me)return;try{const e=await async function(){const e=k("/category/tree");try{const n=await b(e);if(!n.ok)throw new f(y(n.status),`http_${n.status}`);const t=await n.json();return t.success&&Array.isArray(t.data)?(o.info(`加载分类树成功 count=${t.data.length}`),t.data):[]}catch(e){return e instanceof f?o.error(`加载分类树失败: ${e.message}`):o.error("加载分类树失败",e),[]}}();if(0===e.length)return;me.innerHTML=``;const n=(e,t=0)=>{for(const r of e){const e=document.createElement("option");e.value=String(r.id),e.textContent=`${" ".repeat(t)}${r.name}`,void 0!==ae&&String(r.id)===String(ae)&&(e.selected=!0),me.appendChild(e),r.children&&r.children.length>0&&n(r.children,t+1)}};n(e),o.info(`知识库分类加载成功 count=${e.length}`)}catch(e){o.error(c("category_load_error"),e)}}()}async function Se(){if(ie&&le&&(await L(),await Ne(),0===ce.length)){const e=function(e){try{const n=localStorage.getItem(Z(e));if(!n)return[];const t=JSON.parse(n);return t&&Array.isArray(t.messages)?(o.info(`加载历史消息 integrateId=${e} count=${t.messages.length}`),t.messages):[]}catch(e){return o.warn("加载会话历史失败",e),[]}}(ie.integrateId);e.length>0&&(ce=e,Re(),o.info(`从本地缓存恢复 ${e.length} 条消息`))}}async function Ne(){if(!ie||!le)return;const e=m();if(e)try{const n=await E(e);n.messages.length>0&&(ce=n.messages.map((e,n)=>({id:z(),role:"USER"===e.messageType?"user":"ai",content:e.content,timestamp:new Date(e.createTime).getTime()})),Re(),o.info(`从后端加载 ${ce.length} 条历史消息`),ee(u(),ce))}catch(e){o.warn("从后端加载历史消息失败",e)}}function Me(){fe&&fe.classList.add("csk-newmsg--hidden")}function Fe(){le&&(Ce?Q(le):fe&&fe.classList.remove("csk-newmsg--hidden"))}function ze(e){ue&&("stop"===e?(ue.classList.add("csk-send-btn--stop"),ue.removeAttribute("disabled"),ue.setAttribute("title",c("stop")),ue.setAttribute("aria-label",c("stop")),ue.innerHTML=''):(ue.classList.remove("csk-send-btn--stop"),ue.setAttribute("title",c("send")),ue.setAttribute("aria-label",c("send")),ue.innerHTML='',qe()))}function De(){const e=null==ge?void 0:ge.querySelector("#csk-history-list");if(!e||!ie)return;G(e,Le?Ie.filter(e=>(e.lastMessagePreview||e.chatId||e.id||"").toLowerCase().includes(Le)):Ie,e=>{Pe(e)},e=>{window.open(I(e),"_blank")},async e=>{if(!confirm(c("history_delete_confirm")))return;await C(e)&&(e===m()&&(ce=[],le&&le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove()),he&&(he.style.display="none"),Be()),Ie=Ie.filter(n=>(n.chatId||n.id)!==e),De())},m())}function Te(e,n){if(!le)return;const t=ce.find(n=>n.id===e&&"ai"===n.role);if(!t)return;const r=t.feedback===n?void 0:n;t.feedback=r;const s=le.querySelector(`[data-csk-msg-id="${e}"]`);if(s&&X(s,r),ie&&ee(ie.integrateId,ce),r){const n="up"===r?"THUMBS_UP":"THUMBS_DOWN";(async function(e,n){if(!l)return!1;const t=k("/feedback");try{const r=await b(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({messageId:String(e),conversationId:l.chatId,feedbackType:n})});return r.ok?(await r.json()).success||!1:(o.error(`反馈提交失败 status=${r.status}`),!1)}catch(e){return o.error("反馈提交异常",e),!1}})(String(e),n).then(n=>{n?o.info(`消息反馈已提交 msgId=${e} value=${r}`):o.warn(`消息反馈提交失败 msgId=${e}(本地状态已更新)`)})}else o.info(`消息反馈已取消 msgId=${e}`)}function Be(){if(!be)return;const e=ce.length>0||le&&le.querySelector(".csk-msg");be.style.display=e?"none":""}function qe(){if(!ue||!de)return;de.value.trim().length>0&&!_e?ue.removeAttribute("disabled"):ue.setAttribute("disabled","true")}async function He(){if(!de||!ie||_e)return;const e=de.value.trim();if(""===e)return;de.value="",qe(),de.style.height="auto";const n=B(),t={id:z(),role:"user",content:e,timestamp:n};le&&R(le,e,n),ce.push(t),Be(),he&&ce.length>0&&(he.style.display="inline-flex"),le&&Fe(),await je(e)}async function je(e){if(!ie||!le)return;_e=!0,ze("stop"),ie.chatId||await L();const n=B(),t=$e;ve&&ve(),le&&Fe();const r=z();let s="";try{ie.streaming?s=await async function(e,n,t,r){Ee=new AbortController;const s=Ee.signal;return new Promise((o,a)=>{let i=null,l=null,d="",p=!1;v(e,e=>{if(d+=e,!p&&le){we&&we();const{wrapper:e,bubble:t}=function(e,n,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai csk-msg--streaming",t&&(r.dataset.cskMsgId=t);const s=document.createElement("div");s.className="csk-msg__avatar csk-msg__avatar--ai",s.innerHTML=q;const o=document.createElement("div");o.className="csk-msg__content";const a=document.createElement("div");a.className="csk-msg__bubble",a.innerHTML="";const i=document.createElement("div");return i.className="csk-msg__time",i.textContent=T(n),o.appendChild(a),o.appendChild(O(a,r)),o.appendChild(i),r.appendChild(s),r.appendChild(o),e.appendChild(r),{wrapper:r,bubble:a}}(le,n,r);l=e,i=t,p=!0}i&&(i.textContent=d,function(e){if(e.querySelector(".csk-caret"))return;const n=document.createElement("span");n.className="csk-caret",n.setAttribute("aria-hidden","true"),e.appendChild(n)}(i)),le&&Fe()},()=>{if(l&&i){if(!p&&""===d)return void x(e).then(o).catch(a);d&&(i.innerHTML=se(d)),J(l,i)}o(d)},e=>{d.length>0?(i&&(i.innerHTML=se(d+"\n\n"+c("stream_interrupted")),l&&J(l,i)),o(d)):a(e)},ae,t,s)})}(e,n,t,r):(s=await x(e),we&&we(),le&&P(le,s,n,se,r));const a={id:r,role:"ai",content:s,timestamp:n};ce.push(a),ee(ie.integrateId,ce),le&&Fe(),function(e){if(!xe)return;const n=e.length>120?e.substring(0,120)+"...":e;xe.textContent=c("new_msg_announce")+":"+n}(s),le&&le.dispatchEvent(new CustomEvent("csk:newMessage",{bubbles:!0,detail:{msg:a}})),t&&async function(e,n){try{const t=await w(e,ae);if(t.length>0){const e=t.map(e=>{var n,t;return{documentId:e.documentId||"",title:e.title||"",sourceName:e.sourceName||"",chunkIndex:null!==(n=e.chunkIndex)&&void 0!==n?n:0,score:null!==(t=e.score)&&void 0!==t?t:0,snippet:e.snippet||""}});if(n.sources=e,le){const n=le.querySelector(".csk-msg--ai:last-of-type");n&&V(n,e)}ie&&ee(ie.integrateId,ce)}}catch(e){o.warn("获取引用来源失败",e)}}(e,a)}catch(e){we&&we();const n=e instanceof f?e.message:c("error_send");if(le){const e=document.createElement("div");e.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${n}`,e.appendChild(t),le.appendChild(e)}o.error(`发送失败 integrateId=${ie.integrateId}`,e)}finally{_e=!1,Ee=null,ze("send"),qe()}}function Re(){if(!le)return;const e=le.querySelector(".csk-history-panel");le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove());for(const e of ce)if("user"===e.role)R(le,e.content,e.timestamp);else{const n=P(le,e.content,e.timestamp,se,e.id);e.sources&&e.sources.length>0&&V(n,e.sources),e.feedback&&X(n,e.feedback)}Ce=!0,Q(le),he&&ce.length>0&&(he.style.display="inline-flex"),Be(),e&&!le.contains(e)&&le.appendChild(e)}async function Pe(e){if(!ie||!le)return;const n=Ie.find(n=>(n.chatId||n.id)===e);if(n&&void 0!==n.roleId){const e=String(n.roleId),t=u();e&&e!==t&&(o.info(`会话角色不匹配,自动切换角色 ${t} -> ${e}`),p(e),ke&&(ke.value=e))}o.info(`切换到会话 conversationId=${e}`),h(e),A(u(),ie.userId,e),ge&&ge.classList.add("csk-history-panel--hidden"),ce=[];le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove());try{const n=await E(e);n.messages.length>0&&(ce=n.messages.map(e=>({id:z(),role:"USER"===e.messageType?"user":"ai",content:e.content,timestamp:new Date(e.createTime).getTime()})),Re(),o.info(`加载会话 ${e} 的 ${ce.length} 条消息`),ee(ie.integrateId,ce))}catch(n){o.warn(`加载会话消息失败 conversationId=${e}`,n)}he&&ce.length>0&&(he.style.display="inline-flex"),Be()}let Ye=null,Ue=!1,Oe=null,Xe=null,We=null,Ke=null,Je=null,Ve=null,Ge=null,Qe=null,Ze=null,en=null,nn=null,tn=null,rn=null,sn=null,on=null,an=null,cn=null,ln=null;function dn(){if(!on||!Oe)return;const e=Oe.getBoundingClientRect(),n=sn?"left"===sn.side:"left-bottom"===(null==Ye?void 0:Ye.position);n?(on.style.left=`${e.left}px`,on.style.right="auto"):(on.style.right=window.innerWidth-e.right+"px",on.style.left="auto"),on.style.bottom=window.innerHeight-e.top+8+"px",on.classList.toggle("csk-teaser--left",!!n),on.classList.toggle("csk-teaser--right",!n)}function pn(){if(!on)return;on.classList.add("csk-teaser--hidden"),on.removeEventListener("click",un);const e=on.querySelector(".csk-teaser__close");e&&e.removeEventListener("click",hn)}function un(e){e.target.closest(".csk-teaser__close")||(pn(),bn())}function hn(e){e.stopPropagation(),pn()}function mn(){on&&!on.classList.contains("csk-teaser--hidden")&&dn()}const kn='button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])';function gn(e){"Escape"===e.key&&Xe&&!Xe.classList.contains("csk-window--hidden")&&fn(),function(e){if(!Xe||Xe.classList.contains("csk-window--hidden"))return;if("Tab"!==e.key)return;const n=Array.from(Xe.querySelectorAll(kn));if(0===n.length)return;const t=n[0],r=n[n.length-1];e.shiftKey?document.activeElement===t&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),t.focus())}(e)}function bn(){Xe&&(Xe.classList.remove("csk-window--hidden"),pn(),cn&&cn.classList.add("csk-launcher__badge--hidden"),setTimeout(()=>{Ke&&Ke.focus()},80))}function fn(){Xe&&Xe.classList.add("csk-window--hidden")}function yn(){Xe&&(Xe.classList.contains("csk-window--hidden")?bn():fn())}function xn(e){return`csk_size_${e}`}function vn(e){return`csk_position_${e}`}function wn(e){return`csk_launcher_pos_${e}`}function _n(e){Xe&&(Xe.classList.remove("csk-window--right","csk-window--left"),Xe.classList.add(`csk-window--${e}`),on&&(on.classList.remove("csk-teaser--right","csk-teaser--left"),on.classList.add(`csk-teaser--${e}`)))}const En={init:function(e){if(Ue)return void o.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const t=function(e){var n,t,r,s,a,i,c,l,d,p,u,h;if(!e.integrateId||"string"!=typeof e.integrateId&&"number"!=typeof e.integrateId||"string"==typeof e.integrateId&&""===e.integrateId.trim())return o.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;if(!e.requestDomain||"string"!=typeof e.requestDomain||""===e.requestDomain.trim())return o.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })'),null;try{new URL(e.requestDomain)}catch(n){return o.error(`requestDomain 不是合法的 URL 格式:${e.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const m=String(e.integrateId).trim(),k=e.launcherIcon||'',g=e.primaryColor||"#4F46E5",b={integrateId:m,requestDomain:e.requestDomain.replace(/\/+$/,""),userId:e.userId,categoryId:e.categoryId,showCategorySwitch:null!==(n=e.showCategorySwitch)&&void 0!==n&&n,title:e.title||"AI 智能助手",width:null!==(t=e.width)&&void 0!==t?t:380,height:Math.max(300,null!==(r=e.height)&&void 0!==r?r:520),position:"left-bottom"===e.position?"left-bottom":"right-bottom",primaryColor:g,launcherIcon:k,showClear:null===(s=e.showClear)||void 0===s||s,showAdminPanel:null!==(a=e.showAdminPanel)&&void 0!==a&&a,quickReplies:Array.isArray(e.quickReplies)?e.quickReplies.map(e=>String(e).trim()).filter(Boolean):[],theme:"dark"===e.theme?"dark":"light",showTeaser:null===(i=e.showTeaser)||void 0===i||i,teaserText:"string"==typeof e.teaserText&&e.teaserText.trim()||"",resizable:null===(c=e.resizable)||void 0===c||c,streaming:null===(l=e.streaming)||void 0===l||l,enableRag:null===(d=e.enableRag)||void 0===d||d,rewriteStrategy:e.rewriteStrategy||"REWRITE",locale:e.locale||"zh-CN",debug:null===(p=e.debug)||void 0===p||p,sound:null!==(u=e.sound)&&void 0!==u&&u,notification:null!==(h=e.notification)&&void 0!==h&&h,onError:"function"==typeof e.onError?e.onError:void 0,onReady:"function"==typeof e.onReady?e.onReady:void 0,onMessage:"function"==typeof e.onMessage?e.onMessage:void 0,token:e.token,roles:e.roles,chatId:""};return o.info(`配置解析完成 integrateId(=roleId)=${b.integrateId} userId(=accountId)=${b.userId||"(未设置)"} requestDomain=${b.requestDomain}`),b}(e);if(!t)return;var s;Ye=t,function(e){if(a[e])i=e;else{const n=e.split("-")[0],t=Object.keys(a).find(e=>e.startsWith(n));t&&(i=t)}}(Ye.locale),s=Ye.debug,n=s,r(Ye.onError),function(e){l=e}(Ye),F(Ye),Oe=H(Ye,yn),document.body.appendChild(Oe),cn=Oe.querySelector(".csk-launcher__badge"),function(e,n){try{const t=localStorage.getItem(wn(e));if(!t)return;const r=JSON.parse(t);if("left"!==r.side&&"right"!==r.side||"number"!=typeof r.bottom)return;const s=window.innerHeight-76,o=Math.max(16,Math.min(r.bottom,s));n.classList.remove("csk-launcher--right","csk-launcher--left"),n.classList.add(`csk-launcher--${r.side}`),n.style.bottom=`${o}px`,sn={side:r.side,bottom:o}}catch(e){}}(Ye.integrateId,Oe),tn=function(e,n,t){let r=!1,s=0,o=0,a=!1,i=0,c=0,l=0,d=!1;function p(){const n=parseFloat(getComputedStyle(e).bottom);return isNaN(n)?24:n}function u(n,t){if(d)return;r=!0,a=!1,s=n,o=t,i=p();const u=e.style,h=getComputedStyle(e);c=u.right?parseFloat(u.right):parseFloat(h.right),l=u.left?parseFloat(u.left):parseFloat(h.left)}function h(n,t,d){if(!r)return;const p=n-s,u=t-o;if(!a){if(Math.abs(p)<5&&Math.abs(u)<5)return;a=!0,e.classList.add("csk-launcher--dragging"),e.classList.remove("csk-launcher--right","csk-launcher--left"),e.style.transition="none",!isNaN(c)&&c>=0&&isNaN(l)?(e.style.right=`${c}px`,e.style.left="auto"):!isNaN(l)&&l>=0&&(e.style.left=`${l}px`,e.style.right="auto")}if(a){d.preventDefault();const n=Math.max(16,Math.min(i-u,j()));e.style.bottom=`${n}px`}}function m(){if(!r)return;if(r=!1,!a)return;const n=parseFloat(e.style.bottom)||p(),s=Math.max(16,Math.min(n,j())),o=e.getBoundingClientRect(),i=o.left+o.width/2<=window.innerWidth/2?"left":"right";e.classList.remove("csk-launcher--dragging"),e.classList.add(`csk-launcher--${i}`,"csk-launcher--snap"),e.style.left="",e.style.right="",e.style.bottom=`${s}px`,d=!0;const c=()=>{e.removeEventListener("transitionend",c),e.classList.remove("csk-launcher--snap"),e.style.transition="",d=!1};e.addEventListener("transitionend",c),setTimeout(()=>{d&&c()},350);const l=n=>{n.stopPropagation(),e.removeEventListener("click",l,!0)};e.addEventListener("click",l,!0);const u=e.querySelector(".csk-launcher__badge");u&&(u.style.display=""),t&&t({side:i,bottom:s})}function k(e){u(e.clientX,e.clientY)}function g(e){h(e.clientX,e.clientY,e)}function b(){m()}function f(e){1===e.touches.length&&u(e.touches[0].clientX,e.touches[0].clientY)}function y(e){1===e.touches.length&&h(e.touches[0].clientX,e.touches[0].clientY,e)}function x(){m()}return e.addEventListener("mousedown",k),document.addEventListener("mousemove",g),document.addEventListener("mouseup",b),e.addEventListener("touchstart",f,{passive:!0}),document.addEventListener("touchmove",y,{passive:!1}),document.addEventListener("touchend",x),()=>{e.removeEventListener("mousedown",k),document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",b),e.removeEventListener("touchstart",f),document.removeEventListener("touchmove",y),document.removeEventListener("touchend",x)}}(Oe,0,e=>{sn=e,function(e,n){try{localStorage.setItem(wn(e),JSON.stringify(n))}catch(e){}}(Ye.integrateId,e),function(){if(!Xe)return;Xe.style.left="",Xe.style.top="",Xe.style.right="",Xe.style.bottom=""}(),_n(e.side),on&&!on.classList.contains("csk-teaser--hidden")&&dn()}),sn&&_n(sn.side);const d=function(e){const n=document.createElement("div");n.id="csk-window",n.className=`csk-root csk-window csk-window--${"left-bottom"===e.position?"left":"right"} csk-window--hidden${"dark"===e.theme?" csk-dark":""}`,n.setAttribute("role","dialog"),n.setAttribute("aria-label",e.title),n.setAttribute("aria-modal","false");const t=document.createElement("div");t.className="csk-header";const r=document.createElement("div");r.className="csk-header__left";const s=document.createElement("div");s.className="csk-header__avatar",s.innerHTML=q;const o=document.createElement("div");o.className="csk-header__info";const a=document.createElement("span");a.className="csk-header__title",a.textContent=e.title;const i=document.createElement("span");i.className="csk-header__status",i.innerHTML=`${c("status_online")}`,o.appendChild(a),o.appendChild(i),r.appendChild(s),r.appendChild(o);let l=null;const d=e.roles;if(d&&d.length>1){l=document.createElement("select"),l.className="csk-role-select",l.setAttribute("aria-label",c("role_selector_label"));for(const n of d){const t=document.createElement("option");t.value=String(n.id),t.textContent=n.name||String(n.id),String(n.id)===String(e.integrateId)&&(t.selected=!0),l.appendChild(t)}l.addEventListener("change",()=>{const e=l.value;n.dispatchEvent(new CustomEvent("csk:roleChange",{detail:{roleId:e}}))});const s=document.createElement("div");s.className="csk-role-select-wrap",s.appendChild(l),t.appendChild(r),t.appendChild(s)}else t.appendChild(r);const p=document.createElement("div");p.className="csk-header__actions";const u=document.createElement("button");u.className="csk-history-btn",u.setAttribute("title",c("history_title")),u.innerHTML='';const h=document.createElement("button");h.className="csk-header__btn csk-header__btn--minimize",h.setAttribute("title",c("minimize")),h.innerHTML='',h.addEventListener("click",()=>{n.classList.add("csk-window--hidden")});const m=document.createElement("button");m.className="csk-header__btn csk-header__btn--close",m.setAttribute("title",c("close")),m.innerHTML='',m.addEventListener("click",()=>{n.classList.add("csk-window--hidden")}),p.appendChild(u),p.appendChild(h),p.appendChild(m),t.appendChild(p);const k=document.createElement("div");k.id="csk-messages",k.className="csk-messages";const g=document.createElement("div");if(g.className="csk-welcome",g.innerHTML=`\n
${q}
\n
${c("welcome_title")}
\n
${c("welcome_desc")}
\n `,e.quickReplies.length>0){const t=document.createElement("div");t.className="csk-quick-replies";for(const r of e.quickReplies){const e=document.createElement("button");e.type="button",e.className="csk-quick-reply",e.textContent=r,e.addEventListener("click",()=>{n.dispatchEvent(new CustomEvent("csk:quickReply",{detail:{text:r}}))}),t.appendChild(e)}g.appendChild(t)}k.appendChild(g);const b=document.createElement("button");b.type="button",b.className="csk-newmsg csk-newmsg--hidden",b.innerHTML=`\n \n ${c("new_message")}\n `,n.appendChild(b);const f=document.createElement("div");f.className="csk-history-panel csk-history-panel--hidden",f.innerHTML=`\n
\n ${c("history_title")}\n \n
\n
\n \n
\n
\n `,k.appendChild(f);const y=f.querySelector("#csk-history-back");y&&y.addEventListener("click",()=>{f.classList.add("csk-history-panel--hidden")}),u.addEventListener("click",e=>{e.stopPropagation();const t=f.classList.contains("csk-history-panel--hidden");f.classList.toggle("csk-history-panel--hidden"),t&&n.dispatchEvent(new CustomEvent("csk:loadHistory"))});let x=null;if(e.showCategorySwitch){const e=document.createElement("div");e.className="csk-category-bar";const r=document.createElement("span");r.className="csk-category-bar__label",r.textContent="📚",x=document.createElement("select"),x.id="csk-category-select",x.className="csk-category-select",x.innerHTML=``,x.addEventListener("change",()=>{const e=x.value;n.dispatchEvent(new CustomEvent("csk:categoryChange",{detail:{categoryId:e?Number(e):void 0}}))}),e.appendChild(r),e.appendChild(x),n.appendChild(t),n.appendChild(k),n.appendChild(e)}else n.appendChild(t),n.appendChild(k);const v=document.createElement("div");v.className="csk-input-area";const w=document.createElement("div");w.className="csk-input-wrap";const _=document.createElement("textarea");_.id="csk-input",_.className="csk-input",_.setAttribute("placeholder",c("placeholder")),_.setAttribute("rows","1"),_.setAttribute("autofocus","");const E=document.createElement("button");E.id="csk-send-btn",E.className="csk-send-btn",E.setAttribute("title",c("send")),E.setAttribute("disabled","true"),E.innerHTML='',w.appendChild(_),w.appendChild(E),v.appendChild(w),n.appendChild(v);let C=null;e.showClear&&(C=document.createElement("button"),C.className="csk-clear-btn",C.textContent=c("clear"),C.style.display="none",n.insertBefore(C,v));let I=null;const L=document.createElement("div");L.className="csk-sr-only",L.setAttribute("aria-live","polite"),L.setAttribute("aria-atomic","true"),n.appendChild(L);const $=f.querySelector("#csk-history-search"),A=document.createElement("div");A.className=`csk-teaser csk-teaser--${"left-bottom"===e.position?"left":"right"} csk-teaser--hidden`,A.setAttribute("role","status"),A.innerHTML=`\n \n ${e.teaserText||c("teaser_text")}\n `;const S=document.createElement("div");return S.className="csk-resize-handle",S.setAttribute("aria-label",c("resize")),S.innerHTML='',n.appendChild(S),{window:n,messagesContainer:k,inputEl:_,sendBtn:E,clearBtn:C,categorySelect:x,historyPanel:f,welcomeEl:g,newMsgBtn:b,teaserEl:A,resizeHandle:S,searchInput:$,ariaLiveEl:L,roleSelect:l,showLoading:function(){if(I)return I.style.display="flex",I;const e=document.createElement("div");return e.className="csk-loading",e.innerHTML=`\n
${q}
\n
\n
\n
\n
\n
\n `,k.appendChild(e),I=e,e},hideLoading:function(){I&&I.parentNode&&(I.parentNode.removeChild(I),I=null)}}}(Ye);Xe=d.window,We=d.messagesContainer,Ke=d.inputEl,Je=d.sendBtn,Ve=d.clearBtn,Ge=d.categorySelect,Qe=d.historyPanel,Ze=d.showLoading,en=d.hideLoading,document.body.appendChild(Xe),on=d.teaserEl,document.body.appendChild(on),dn();const h=Xe.querySelector(".csk-header");if(h&&(nn=function(e,n,t){let r=!1,s=0,o=0,a=0,i=0;const c=e=>{if(e.target.closest("button"))return;r=!0,s=e.clientX,o=e.clientY;const t=n.getBoundingClientRect();a=s-t.left,i=o-t.top,document.addEventListener("mousemove",l),document.addEventListener("mouseup",d)},l=e=>{if(!r)return;const t=e.clientX-a,s=e.clientY-i,o=window.innerWidth-n.offsetWidth,c=window.innerHeight-n.offsetHeight;n.style.right="auto",n.style.bottom="auto",n.style.left=`${Math.max(0,Math.min(t,o))}px`,n.style.top=`${Math.max(0,Math.min(s,c))}px`},d=()=>{if(r=!1,document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d),t){const e=n.getBoundingClientRect();t({x:e.left,y:e.top})}};return e.addEventListener("mousedown",c),()=>{e.removeEventListener("mousedown",c),document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",d)}}(h,Xe,e=>{!function(e,n){try{localStorage.setItem(vn(e),JSON.stringify(n))}catch(e){}}(Ye.integrateId,e)})),function(e,n){try{const t=localStorage.getItem(vn(e));if(!t)return;const r=JSON.parse(t);if("number"!=typeof r.x||"number"!=typeof r.y)return;const s=window.innerWidth-n.offsetWidth,o=window.innerHeight-n.offsetHeight,a=Math.max(0,Math.min(r.x,s)),i=Math.max(0,Math.min(r.y,o));n.style.right="auto",n.style.bottom="auto",n.style.left=`${a}px`,n.style.top=`${i}px`}catch(e){}}(Ye.integrateId,Xe),Ye.resizable){const e=d.resizeHandle;rn=function(e,n,t){let r=!1,s=0,o=0,a=0,i=0;const c=(e,t)=>{r=!0,s=e,o=t;const c=n.getBoundingClientRect();a=c.width,i=c.height,n.classList.add("csk-window--resizing"),document.addEventListener("mousemove",p),document.addEventListener("mouseup",u),document.addEventListener("touchmove",k,{passive:!1}),document.addEventListener("touchend",g)},l=(e,t,c)=>{if(!r)return;c&&c.preventDefault();const l=e-s,d=t-o,p=Math.max(300,Math.min(a+l,window.innerWidth-24)),u=Math.max(300,Math.min(i+d,window.innerHeight-24));n.style.width=`${p}px`,n.style.height=`${u}px`,n.style.setProperty("--csk-window-width",`${p}px`),n.style.setProperty("--csk-window-height",`${u}px`),n.style.bottom="",n.style.right=""},d=()=>{if(!r)return;r=!1,n.classList.remove("csk-window--resizing"),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchmove",k),document.removeEventListener("touchend",g);const e=n.getBoundingClientRect();t&&t({width:e.width,height:e.height})};function p(e){l(e.clientX,e.clientY,e)}function u(){d()}function h(e){e.preventDefault(),e.stopPropagation(),c(e.clientX,e.clientY)}function m(e){e.preventDefault(),e.stopPropagation(),1===e.touches.length&&c(e.touches[0].clientX,e.touches[0].clientY)}function k(e){1===e.touches.length&&l(e.touches[0].clientX,e.touches[0].clientY,e)}function g(){d()}return e.addEventListener("mousedown",h),e.addEventListener("touchstart",m,{passive:!1}),()=>{e.removeEventListener("mousedown",h),e.removeEventListener("touchstart",m),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchmove",k),document.removeEventListener("touchend",g)}}(e,Xe,e=>{!function(e,n){try{localStorage.setItem(xn(e),JSON.stringify(n))}catch(e){}}(Ye.integrateId,e)}),function(e,n){try{const t=localStorage.getItem(xn(e));if(!t)return;const r=JSON.parse(t);if("number"!=typeof r.width||"number"!=typeof r.height)return;const s=Math.max(300,Math.min(r.width,window.innerWidth-24)),o=Math.max(300,Math.min(r.height,window.innerHeight-24));n.style.width=`${s}px`,n.style.height=`${o}px`,n.style.setProperty("--csk-window-width",`${s}px`),n.style.setProperty("--csk-window-height",`${o}px`)}catch(e){}}(Ye.integrateId,Xe)}if(Ae(Ye,{messagesContainer:We,inputEl:Ke,sendBtn:Je,clearBtn:Ve,categorySelect:Ge,historyPanel:Qe,welcomeEl:d.welcomeEl,newMsgBtn:d.newMsgBtn,searchInput:d.searchInput,ariaLiveEl:d.ariaLiveEl,roleSelect:d.roleSelect,showLoading:Ze,hideLoading:en}),Xe.addEventListener("csk:categoryChange",e=>{var n,t;n=e.detail.categoryId,ae=n,$e=null===(t=null==ie?void 0:ie.enableRag)||void 0===t||t,o.lifecycleCategoryChange(null!=n?n:"全部")}),Xe.addEventListener("csk:loadHistory",()=>{!async function(){if(!ge||!ie)return;const e=ge.querySelector("#csk-history-list");if(e){e.innerHTML='
加载中...
';try{const n=await _(1,50,ie.userId,u());Ie=n.list.map(e=>({id:e.conversationId||"",chatId:e.conversationId||"",roleId:e.roleId,roleName:e.roleName,messageCount:e.messageCount,lastMessageTime:e.lastMessageTime,lastMessagePreview:e.lastMessagePreview,createdAt:e.firstMessageTime||e.createdAt})),Le="",ye&&(ye.value=""),G(e,Ie,e=>{Pe(e)},e=>{window.open(I(e),"_blank")},async e=>{confirm(c("history_delete_confirm"))&&await C(e)&&(e===m()&&(ce=[],le&&le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove()),he&&(he.style.display="none"),Be()),Ie=Ie.filter(n=>(n.chatId||n.id)!==e),De())},m())}catch(n){o.error(c("history_load_error"),n),e.innerHTML=`
${c("history_load_error")}
`}}}()}),Xe.addEventListener("csk:quickReply",e=>{var n;n=e.detail.text,!de||_e?Promise.resolve():(de.value=n,qe(),He())}),Xe.addEventListener("csk:retry",e=>{!async function(e){if(!ie||!le||_e)return;const n=ce.findIndex(n=>n.id===e&&"ai"===n.role);if(n<0)return;let t="";for(let e=n-1;e>=0;e--)if("user"===ce[e].role){t=ce[e].content;break}if(!t)return;const r=ce.splice(n),s=new Set(r.map(e=>e.id));le.querySelectorAll(".csk-msg").forEach(e=>{const n=e.dataset.cskMsgId;n&&s.has(n)&&e.remove()}),ee(ie.integrateId,ce),Be(),await je(t)}(e.detail.msgId)}),Xe.addEventListener("csk:feedback",e=>{Te(e.detail.msgId,e.detail.value)}),Xe.addEventListener("csk:newMessage",e=>{var n;if(Xe&&Xe.classList.contains("csk-window--hidden")&&(cn&&cn.classList.remove("csk-launcher__badge--hidden"),(null==Ye?void 0:Ye.sound)&&function(){try{ln||(ln=new(window.AudioContext||window.webkitAudioContext));const e=ln;if("suspended"===e.state)return void e.resume();const n=e.currentTime;[0,.15].forEach((t,r)=>{const s=e.createOscillator(),o=e.createGain();s.type="sine",s.frequency.value=0===r?880:1100,o.gain.setValueAtTime(.15,n+t),o.gain.exponentialRampToValueAtTime(.001,n+t+.12),s.connect(o),o.connect(e.destination),s.start(n+t),s.stop(n+t+.12)})}catch(e){}}(),(null==Ye?void 0:Ye.notification)&&function(){try{if(!("Notification"in window))return;"granted"===Notification.permission?new Notification((null==Ye?void 0:Ye.title)||"AI 智能助手",{body:"收到新消息",icon:void 0,silent:!0}):"denied"!==Notification.permission&&Notification.requestPermission()}catch(e){}}()),(null==Ye?void 0:Ye.onMessage)&&(null===(n=e.detail)||void 0===n?void 0:n.msg))try{Ye.onMessage(e.detail.msg)}catch(e){}}),Xe.addEventListener("csk:roleChange",e=>{e.detail.roleId&&async function(e){if(!ie||!le)return;const n=u();if(e===n)return;ce.length>0&&ee(n,ce),Ee&&(Ee.abort(),Ee=null),_e=!1,ze("send"),ce=[],le.querySelectorAll(".csk-msg, .csk-loading").forEach(e=>e.remove()),ne(n),A(n,ie.userId,void 0),ne(e),A(e,ie.userId,void 0),p(e),ke&&(ke.value=e);const t=await L(!0);if(o.info(`角色切换 initChatId 完成 chatId=${t} roleId=${e}`),t)try{await Ne()}catch(n){o.warn(`切换角色后加载后端历史失败 roleId=${e}`,n)}he&&0===ce.length&&(he.style.display="none"),Be(),Ce=!0,le&&Q(le),o.info(`角色切换完成 ${n} -> ${e}`)}(String(e.detail.roleId))}),document.addEventListener("keydown",gn),window.addEventListener("resize",mn),Ue=!0,o.lifecycleInit(Ye.integrateId,Ye.requestDomain),Ye.onReady)try{Ye.onReady()}catch(e){}Ye.showTeaser&&(an=setTimeout(()=>{Xe&&Xe.classList.contains("csk-window--hidden")&&function(){if(!on)return;dn(),on.classList.remove("csk-teaser--hidden"),on.addEventListener("click",un);const e=on.querySelector(".csk-teaser__close");e&&e.addEventListener("click",hn)}()},1500)),Se().catch(e=>{o.warn("chatId 初始化失败,将在发送消息时重试",e)})},destroy:function(){if(!Ue)return;an&&(clearTimeout(an),an=null),pn(),on&&on.parentNode&&(on.parentNode.removeChild(on),on=null),Oe&&Oe.parentNode&&(Oe.parentNode.removeChild(Oe),Oe=null),Xe&&Xe.parentNode&&(Xe.parentNode.removeChild(Xe),Xe=null),nn&&(nn(),nn=null),tn&&(tn(),tn=null),rn&&(rn(),rn=null),sn=null,S&&S.parentNode&&(S.parentNode.removeChild(S),S=null),document.querySelectorAll("style[data-csk-sdk]").forEach(e=>e.remove()),document.removeEventListener("keydown",gn),window.removeEventListener("resize",mn),r(void 0);const e=null==Ye?void 0:Ye.integrateId;Ye=null,Ue=!1,We=null,Ke=null,Je=null,Ve=null,Ge=null,Qe=null,Ze=null,en=null,cn=null,ln=null,l=null,d=null,o.lifecycleDestroy(e||"")},open:bn,close:fn,toggle:yn,clearHistory:function(){Ye&&(Ve?Ve.click():confirm("确定清空所有对话记录?")&&ne(Ye.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=En),En}(); //# 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 1c0dad6..5faf005 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/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":["PREFIX","debugEnabled","errorCallback","setErrorCallback","cb","timers","logger","info","msg","data","console","log","undefined","warn","error","code","Error","type","message","String","detail","_a","time","label","Date","now","timeEnd","prefix","start","duration","lifecycleInit","integrateId","requestDomain","this","lifecycleDestroy","lifecycleSend","length","lifecycleReply","lifecycleError","status","lifecycleClear","lifecycleStreamDone","lifecycleCategoryChange","categoryId","DEFAULT_LAUNCHER_ICON","buildGlassIcon","eyeColor","smileColor","bubbleColor","GLASS_ICON_DREAM_PURPLE","GLASS_ICON_MINT_TECH","GLASS_ICON_CORAL_PEACH","GLASS_ICON_SKY_BLUE","THEME_PRIMARY_COLORS","dictionaries","title","minimize","close","status_online","welcome_title","welcome_desc","placeholder","send","stop","new_message","copy","copied","retry","retrying","loading","stream_interrupted","stream_unstable","category_placeholder","category_all","category_load_error","source_title","source_count","source_loading","clear","clear_confirm","history_title","history_empty","history_load_error","history_delete_confirm","history_export","history_delete","history_search","history_group_today","history_group_yesterday","history_group_week","history_group_earlier","feedback_up","feedback_down","teaser_text","new_msg_announce","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","currentConfig","updateChatId","chatId","getChatId","buildUrl","path","startsWith","setIfPresent","value","trim","set","async","safeFetch","url","options","timeout","externalSignal","controller","AbortController","timer","setTimeout","abort","aborted","addEventListener","once","fetch","assign","signal","mode","credentials","err","CskError","DOMException","name","TypeError","includes","clearTimeout","constructor","super","getHttpErrorMessage","chatRequest","URLSearchParams","userId","toString","buildChatUrl","response","ok","errorMsg","chatSSERequest","onChunk","onDone","onError","useRag","rewriteStrategy","buildChatRAGSSEUrl","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","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","list","total","pages","fetchConversationMessages","conversationId","messages","deleteConversation","method","getConversationExportUrl","initChatId","cachedChatId","localStorage","getItem","chatIdStorageKey","loadCachedChatId","result","latestConv","saveCachedChatId","messageCount","newChatId","random","crypto","randomUUID","Math","generateChatId","setItem","removeItem","styleElement","cssVars","config","darker","adjustColor","primaryColor","lighter","rgb","hex","match","parseInt","hexToRgb","themeColors","launcherTheme","grad1","grad2","glow","width","height","amount","clamp","max","min","r","g","b","padStart","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","c","escapeHtml","map","ch","BOT_ICON","createLauncher","onClick","launcher","id","glassClass","className","position","innerHTML","launcherIcon","badge","debouncedClick","fn","delay","args","apply","debounce","e","preventDefault","launcherMaxBottom","window","innerHeight","renderUserBubble","container","timestamp","wrapper","avatar","content","bubble","formatTime","renderAIBubble","renderMd","msgId","dataset","cskMsgId","buildAIActions","enhanceCodeBlocks","COPY_ICON","RETRY_ICON","bar","copyBtn","stopPropagation","copyToClipboard","retryBtn","root","closest","dispatchEvent","CustomEvent","upBtn","downBtn","updateFeedbackUI","btns","querySelectorAll","forEach","btn","classList","remove","add","original","navigator","clipboard","isSecureContext","writeText","ta","style","opacity","select","execCommand","removeChild","pre","codeEl","finalizeAIBubble","caret","renderSources","sources","existing","sourcesEl","header","titleSpan","n","arrow","toggle","src","item","sourceName","snippet","meta","metaParts","push","chunkIndex","score","toFixed","join","timeEl","parentNode","insertBefore","renderHistoryList","listEl","items","onSelect","onExport","onDelete","activeChatId","emptyText","empty","groups","todayStart","getFullYear","getMonth","getDate","getTime","yesterdayStart","weekStart","getDay","today","yesterday","week","earlier","timeStr","lastMessageTime","createdAt","ts","groupHistoryByDate","group","groupEl","labelEl","el","convId","idEl","lastMessagePreview","metaEl","actionsEl","exportBtn","deleteBtn","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","saveMessages","slice","updatedAt","JSON","stringify","clearMessages","CODE_BLOCK_PREFIX","INLINE_CODE_PREFIX","renderMarkdown","codeBlocks","processed","_match","lang","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","inputWrap","sendBtn","clearBtn","categorySelect","historyPanel","welcomeEl","newMsgBtn","searchInput","ariaLiveEl","showLoadingFn","hideLoadingFn","isSending","abortController","isNearBottom","historyItems","historySearchText","initChat","cfg","dom","parentElement","showLoading","hideLoading","enableRag","handleSend","shiftKey","isComposing","updateSendBtnState","autoResizeInput","confirm","display","updateEmptyState","newId","generateNewChatId","handleClear","bindSendEvents","clientHeight","hideNewMsgBtn","bindScrollEvents","toLowerCase","renderFilteredHistory","bindHistorySearch","showCategorySwitch","tree","fetchCategoryTree","addOptions","nodes","indent","node","option","repeat","selected","children","loadCategories","initChatHistory","role","messageType","createTime","renderHistory","loadHistoryFromBackend","cached","raw","parse","loadMessages","smartScrollToBottom","setSendButtonMode","removeAttribute","filter","switchToConversation","open","it","handleFeedback","find","m","newValue","feedback","feedbackType","messageId","headers","submitFeedbackApi","then","hasMessages","userTimestamp","userMsg","produceAIReply","userText","aiTimestamp","shouldUseRag","aiMsgId","aiContent","streaming","Promise","resolve","reject","bubbleEl","wrapperEl","accumulated","streamStarted","chunk","createEmptyAIBubble","appendStreamingCaret","catch","sendStreamMessage","aiMsg","announceMessage","bubbles","ragSources","s","documentId","_b","lastAiMsg","fetchAndRenderSources","errMsg","errorBubble","color","historyPanelEl","contains","isInitialized","launcherEl","windowEl","dragCleanup","launcherDragCleanup","launcherPos","teaserEl","teaserTimer","badgeEl","audioCtx","positionTeaser","rect","getBoundingClientRect","isLeft","side","left","right","innerWidth","bottom","top","hideTeaser","removeEventListener","onTeaserClick","closeBtn","onTeaserClose","target","onResize","FOCUSABLE","onKeyDown","focusables","from","first","last","activeElement","focus","trapFocus","positionKey","launcherPosKey","syncWindowAlignment","ChatbotSDK","init","rawConfig","parsed","URL","integrateIdStr","resolvedLauncherIcon","resolvedPrimaryColor","_c","showClear","_d","showAdminPanel","_e","quickReplies","Boolean","theme","showTeaser","_f","teaserText","_g","_h","locale","debug","_j","sound","_k","notification","_l","onReady","onMessage","parseConfig","enabled","matched","keys","setLocale","setApiConfig","pos","maxBottom","clampedBottom","restoreLauncherPosition","onDragEnd","dragging","startX","startY","hasMoved","startBottom","startRight","startLeft","isSnapping","getCurrentBottom","val","parseFloat","getComputedStyle","isNaN","onPointerDown","clientX","clientY","cs","onPointerMove","dx","dy","abs","transition","newBottom","onPointerUp","currentBottom","snapSide","onTransitionEnd","preventClick","ev","onMouseDown","onMouseMove","onMouseUp","onTouchStart","touches","onTouchMove","onTouchEnd","passive","enableLauncherDrag","saveLauncherPosition","resetWindowPosition","headerLeft","headerAvatar","headerInfo","titleEl","statusEl","actions","historyBtn","minimizeBtn","chips","reply","chip","backBtn","isHidden","categoryBar","categoryLabel","selectedId","Number","inputArea","loadingEl","createChatWindow","headerEl","offsetX","offsetY","x","y","maxX","offsetWidth","maxY","offsetHeight","enableDrag","saveWindowPosition","winEl","restoreWindowPosition","firstMessageTime","loadHistoryConversations","aiIndex","findIndex","removed","splice","removedIds","Set","has","retryFromMessage","AudioContext","webkitAudioContext","ctx","state","resume","currentTime","offset","osc","createOscillator","gain","createGain","frequency","setValueAtTime","exponentialRampToValueAtTime","connect","destination","playNotificationSound","Notification","permission","icon","silent","requestPermission","sendDesktopNotification","destroy","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","errorCallback","setErrorCallback","cb","timers","logger","info","msg","data","console","log","undefined","warn","error","code","Error","type","message","String","detail","_a","time","label","Date","now","timeEnd","prefix","start","duration","lifecycleInit","integrateId","requestDomain","this","lifecycleDestroy","lifecycleSend","length","lifecycleReply","lifecycleError","status","lifecycleClear","lifecycleStreamDone","lifecycleCategoryChange","categoryId","dictionaries","title","minimize","close","status_online","role_selector_label","welcome_title","welcome_desc","placeholder","send","stop","new_message","copy","copied","retry","retrying","loading","stream_interrupted","stream_unstable","category_placeholder","category_all","category_load_error","source_title","source_count","source_loading","clear","clear_confirm","history_title","history_empty","history_load_error","history_delete_confirm","history_export","history_delete","history_search","history_group_today","history_group_yesterday","history_group_week","history_group_earlier","feedback_up","feedback_down","teaser_text","new_msg_announce","resize","error_network","error_timeout","error_server","error_cors","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","currentConfig","activeIntegrateId","setActiveRoleId","roleId","getActiveIntegrateId","updateChatId","chatId","getChatId","buildUrl","path","startsWith","setIfPresent","value","trim","set","async","safeFetch","url","options","timeout","externalSignal","controller","AbortController","timer","setTimeout","abort","aborted","addEventListener","once","headers","Headers","forEach","Array","isArray","assign","token","includes","response","fetch","signal","mode","credentials","err","CskError","DOMException","name","TypeError","clearTimeout","constructor","super","getHttpErrorMessage","chatRequest","URLSearchParams","userId","toString","buildChatUrl","ok","errorMsg","chatSSERequest","onChunk","onDone","onError","useRag","rewriteStrategy","buildChatRAGSSEUrl","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","body","getReader","decoder","TextDecoder","stream","buffer","done","read","decode","lines","split","pop","line","trimmed","substring","readErr","releaseLock","fetchRagSources","buildRagSourcesUrl","json","success","fetchConversationList","page","size","accountId","list","total","pages","fetchConversationMessages","conversationId","messages","deleteConversation","method","getConversationExportUrl","initChatId","forceRefresh","activeId","cachedChatId","localStorage","getItem","chatIdStorageKey","loadCachedChatId","result","latestConv","saveCachedChatId","messageCount","newChatId","random","crypto","randomUUID","Math","generateChatId","setItem","removeItem","styleElement","cssVars","config","darker","adjustColor","primaryColor","lighter","rgb","hex","match","parseInt","hexToRgb","width","height","amount","clamp","max","min","r","g","b","padStart","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","c","escapeHtml","map","ch","formatTime","timestamp","d","getHours","getMinutes","BOT_ICON","createLauncher","onClick","launcher","id","className","position","innerHTML","launcherIcon","badge","debouncedClick","fn","delay","args","apply","debounce","e","preventDefault","launcherMaxBottom","window","innerHeight","renderUserBubble","container","wrapper","avatar","content","bubble","renderAIBubble","renderMd","msgId","dataset","cskMsgId","buildAIActions","enhanceCodeBlocks","COPY_ICON","RETRY_ICON","bar","copyBtn","stopPropagation","copyToClipboard","retryBtn","root","closest","dispatchEvent","CustomEvent","upBtn","downBtn","updateFeedbackUI","btns","querySelectorAll","btn","classList","remove","add","original","navigator","clipboard","isSecureContext","writeText","ta","style","opacity","select","execCommand","removeChild","pre","codeEl","finalizeAIBubble","caret","renderSources","sources","existing","sourcesEl","header","titleSpan","n","arrow","toggle","src","item","sourceName","snippet","meta","metaParts","push","chunkIndex","score","toFixed","join","timeEl","parentNode","insertBefore","renderHistoryList","listEl","items","onSelect","onExport","onDelete","activeChatId","emptyText","empty","groups","todayStart","getFullYear","getMonth","getDate","getTime","yesterdayStart","weekStart","getDay","today","yesterday","week","earlier","timeStr","lastMessageTime","createdAt","ts","groupHistoryByDate","group","groupEl","labelEl","el","convId","idEl","lastMessagePreview","metaEl","roleName","actionsEl","exportBtn","deleteBtn","scrollToBottom","scrollTop","scrollHeight","storageKey","saveMessages","slice","updatedAt","JSON","stringify","clearMessages","CODE_BLOCK_PREFIX","INLINE_CODE_PREFIX","renderMarkdown","codeBlocks","processed","_match","lang","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","inputWrap","sendBtn","clearBtn","categorySelect","roleSelect","historyPanel","welcomeEl","newMsgBtn","searchInput","ariaLiveEl","showLoadingFn","hideLoadingFn","isSending","abortController","isNearBottom","historyItems","historySearchText","initChat","cfg","dom","parentElement","showLoading","hideLoading","enableRag","handleSend","shiftKey","isComposing","updateSendBtnState","autoResizeInput","confirm","display","updateEmptyState","newId","generateNewChatId","handleClear","bindSendEvents","clientHeight","hideNewMsgBtn","bindScrollEvents","toLowerCase","renderFilteredHistory","bindHistorySearch","showCategorySwitch","tree","fetchCategoryTree","addOptions","nodes","indent","node","option","repeat","selected","children","loadCategories","initChatHistory","loadHistoryFromBackend","cached","raw","parse","loadMessages","renderHistory","role","messageType","createTime","smartScrollToBottom","setSendButtonMode","removeAttribute","filter","switchToConversation","open","it","handleFeedback","find","m","newValue","feedback","feedbackType","messageId","submitFeedbackApi","then","hasMessages","userTimestamp","userMsg","produceAIReply","userText","aiTimestamp","shouldUseRag","aiMsgId","aiContent","streaming","Promise","resolve","reject","bubbleEl","wrapperEl","accumulated","streamStarted","chunk","createEmptyAIBubble","appendStreamingCaret","catch","sendStreamMessage","aiMsg","announceMessage","bubbles","ragSources","s","documentId","_b","lastAiMsg","fetchAndRenderSources","errMsg","errorBubble","color","historyPanelEl","contains","historyItem","convRoleId","currentRoleId","isInitialized","launcherEl","windowEl","dragCleanup","launcherDragCleanup","resizeCleanup","launcherPos","teaserEl","teaserTimer","badgeEl","audioCtx","positionTeaser","rect","getBoundingClientRect","isLeft","side","left","right","innerWidth","bottom","top","hideTeaser","removeEventListener","onTeaserClick","closeBtn","onTeaserClose","target","onResize","FOCUSABLE","onKeyDown","focusables","from","first","last","activeElement","focus","trapFocus","sizeKey","positionKey","launcherPosKey","syncWindowAlignment","ChatbotSDK","init","rawConfig","parsed","URL","_o","integrateIdStr","resolvedLauncherIcon","resolvedPrimaryColor","_c","showClear","_d","showAdminPanel","_e","quickReplies","Boolean","theme","showTeaser","_f","teaserText","resizable","_g","_h","_j","locale","debug","_k","sound","_l","notification","onReady","onMessage","roles","parseConfig","enabled","matched","keys","setLocale","setApiConfig","pos","maxBottom","clampedBottom","restoreLauncherPosition","onDragEnd","dragging","startX","startY","hasMoved","startBottom","startRight","startLeft","isSnapping","getCurrentBottom","val","parseFloat","getComputedStyle","isNaN","onPointerDown","clientX","clientY","cs","onPointerMove","dx","dy","abs","transition","newBottom","onPointerUp","currentBottom","snapSide","onTransitionEnd","preventClick","ev","onMouseDown","onMouseMove","onMouseUp","onTouchStart","touches","onTouchMove","onTouchEnd","passive","enableLauncherDrag","saveLauncherPosition","resetWindowPosition","headerLeft","headerAvatar","headerInfo","titleEl","statusEl","selectedValue","roleWrap","actions","historyBtn","minimizeBtn","chips","reply","chip","backBtn","isHidden","categoryBar","categoryLabel","selectedId","Number","inputArea","loadingEl","resizeHandle","createChatWindow","headerEl","offsetX","offsetY","x","y","maxX","offsetWidth","maxY","offsetHeight","enableDrag","saveWindowPosition","winEl","restoreWindowPosition","handleEl","onResizeEnd","resizing","startWidth","startHeight","newWidth","newHeight","setProperty","enableResize","saveWindowSize","w","h","restoreWindowSize","firstMessageTime","loadHistoryConversations","aiIndex","findIndex","removed","splice","removedIds","Set","has","retryFromMessage","AudioContext","webkitAudioContext","ctx","state","resume","currentTime","offset","osc","createOscillator","gain","createGain","frequency","setValueAtTime","exponentialRampToValueAtTime","connect","destination","playNotificationSound","Notification","permission","icon","silent","requestPermission","sendDesktopNotification","newRoleId","oldRoleId","foundChatId","switchRole","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 567bb74..fdb497e 100644 --- a/client/src/api.ts +++ b/client/src/api.ts @@ -15,11 +15,30 @@ const REQUEST_TIMEOUT = 30000; let currentConfig: ResolvedConfig | null = null; +/** 运行时动态设置的角色 ID(通过角色选择器切换),优先于 currentConfig.integrateId */ +let activeIntegrateId: string | null = null; + /** 设置当前配置 */ export function setApiConfig(config: ResolvedConfig): void { currentConfig = config; } +/** 清空当前配置(销毁 SDK 时调用) */ +export function clearApiConfig(): void { + currentConfig = null; + activeIntegrateId = null; +} + +/** 设置当前活跃角色 ID(角色切换时调用),影响后续所有 API 调用的 roleId 参数 */ +export function setActiveRoleId(roleId: string | null): void { + activeIntegrateId = roleId; +} + +/** 获取当前有效的 integrateId(优先使用运行时设置,回退到配置默认值) */ +export function getActiveIntegrateId(): string { + return activeIntegrateId ?? currentConfig?.integrateId ?? ''; +} + /** 更新当前 chatId(对话 ID) */ export function updateChatId(chatId: string): void { if (currentConfig) { @@ -33,7 +52,7 @@ export function getChatId(): string { } /** 构建完整请求 URL,自动防御双斜杠 */ -export function buildUrl(path: string): string { +function buildUrl(path: string): string { if (!currentConfig) { throw new Error('API 配置未初始化'); } @@ -65,7 +84,7 @@ function buildChatUrl(message: string): string { params.set('chatId', currentConfig!.chatId); // integrateId 映射为 roleId - setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); // userId 映射为 accountId setIfPresent(params, 'accountId', currentConfig!.userId); @@ -80,7 +99,7 @@ function buildChatSSEUrl(message: string, categoryId?: number): string { params.set('message', message); params.set('chatId', currentConfig!.chatId); - setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); setIfPresent(params, 'accountId', currentConfig!.userId); setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); @@ -96,7 +115,7 @@ function buildChatRAGSSEUrl(message: string, categoryId?: number): string { params.set('chatId', currentConfig!.chatId); params.set('rewriteStrategy', currentConfig!.rewriteStrategy || 'REWRITE'); - setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); setIfPresent(params, 'accountId', currentConfig!.userId); setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); @@ -112,7 +131,7 @@ function buildRagSourcesUrl(message: string, categoryId?: number): string { params.set('chatId', currentConfig!.chatId); params.set('rewriteStrategy', currentConfig!.rewriteStrategy || 'REWRITE'); - setIfPresent(params, 'roleId', currentConfig!.integrateId); + setIfPresent(params, 'roleId', getActiveIntegrateId()); setIfPresent(params, 'accountId', currentConfig!.userId); setIfPresent(params, 'categoryId', categoryId ?? currentConfig!.categoryId); @@ -141,12 +160,31 @@ async function safeFetch( } try { + // 注入 SDK Token 认证头(仅对 /ai/ 路径注入,避免将 SDK Token 发送到管理接口) + const headers: Record = {}; + if (options.headers) { + if (options.headers instanceof Headers) { + options.headers.forEach((value, key) => { headers[key] = value; }); + } else if (Array.isArray(options.headers)) { + options.headers.forEach(([key, value]) => { headers[key] = value; }); + } else { + Object.assign(headers, options.headers as Record); + } + } + if (currentConfig?.token && url.includes('/ai/')) { + headers['Authorization'] = `Bearer ${currentConfig.token}`; + } + const response = await fetch(url, { ...options, + headers, signal: controller.signal, mode: 'cors', credentials: 'include', }); + if (response.status === 401 && url.includes('/ai/')) { + logger.error('SDK 认证失败:Token 缺失或已过期,请重新调用 /open-api/auth/token 换取 Token'); + } return response; } catch (err: unknown) { // 用户主动中断(停止生成),不算错误 @@ -196,22 +234,22 @@ function getHttpErrorMessage(status: number): string { */ export async function chatRequest(message: string): Promise { const url = buildChatUrl(message); - logger.lifecycleSend(currentConfig!.integrateId, message.length); + logger.lifecycleSend(getActiveIntegrateId(), message.length); try { const response = await safeFetch(url); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.lifecycleError(currentConfig!.integrateId, String(response.status), errorMsg); + logger.lifecycleError(getActiveIntegrateId(), String(response.status), errorMsg); throw new CskError(errorMsg, `http_${response.status}`); } const text = await response.text(); - logger.lifecycleReply(currentConfig!.integrateId, text.length); + logger.lifecycleReply(getActiveIntegrateId(), text.length); return text; } catch (err) { if (err instanceof CskError) throw err; - logger.lifecycleError(currentConfig!.integrateId, 'unknown', String(err)); + logger.lifecycleError(getActiveIntegrateId(), 'unknown', String(err)); throw new CskError(t('error_unknown'), 'unknown'); } } @@ -235,14 +273,14 @@ export async function chatSSERequest( : buildChatSSEUrl(message, categoryId); let totalText = ''; - logger.lifecycleSend(currentConfig!.integrateId, message.length); + logger.lifecycleSend(getActiveIntegrateId(), message.length); try { const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2, signal); if (!response.ok) { const errorMsg = getHttpErrorMessage(response.status); - logger.lifecycleError(currentConfig!.integrateId, String(response.status), errorMsg); + logger.lifecycleError(getActiveIntegrateId(), String(response.status), errorMsg); onError(new CskError(errorMsg, `http_${response.status}`)); return; } @@ -304,7 +342,7 @@ export async function chatSSERequest( reader.releaseLock(); } - logger.lifecycleStreamDone(currentConfig!.integrateId, totalText.length); + logger.lifecycleStreamDone(getActiveIntegrateId(), totalText.length); onDone(); } catch (err) { // 用户主动中断不触发 onError,走 onDone @@ -315,7 +353,7 @@ export async function chatSSERequest( if (err instanceof CskError) { onError(err); } else { - logger.lifecycleError(currentConfig!.integrateId, 'unknown', String(err)); + logger.lifecycleError(getActiveIntegrateId(), 'unknown', String(err)); onError(new CskError(t('error_network'), 'network')); } } @@ -417,6 +455,7 @@ interface ConversationItem { chatId?: string; accountId?: string; roleId?: number; + roleName?: string; messageCount?: number; lastMessageTime?: string; firstMessageTime?: string; @@ -470,7 +509,7 @@ export async function fetchConversationMessages(conversationId: string): Promise }> { const params = new URLSearchParams(); if (currentConfig?.userId) params.set('accountId', currentConfig.userId); - if (currentConfig?.integrateId) params.set('roleId', currentConfig.integrateId); + if (getActiveIntegrateId()) params.set('roleId', getActiveIntegrateId()); const url = buildUrl(`/ai/sdk/conversation/${conversationId}/messages?${params.toString()}`); try { const response = await safeFetch(url); @@ -493,7 +532,7 @@ export async function fetchConversationMessages(conversationId: string): Promise export async function deleteConversation(conversationId: string): Promise { const params = new URLSearchParams(); if (currentConfig?.userId) params.set('accountId', currentConfig.userId); - if (currentConfig?.integrateId) params.set('roleId', currentConfig.integrateId); + if (getActiveIntegrateId()) params.set('roleId', getActiveIntegrateId()); const url = buildUrl(`/ai/sdk/conversation/${conversationId}?${params.toString()}`); try { const response = await safeFetch(url, { method: 'DELETE' }); @@ -514,7 +553,7 @@ export async function deleteConversation(conversationId: string): Promise { +export async function initChatId(forceRefresh: boolean = false): Promise { if (!currentConfig) return ''; - // 1. 先尝试从 localStorage 恢复 - const cachedChatId = loadCachedChatId(currentConfig.integrateId, currentConfig.userId); - if (cachedChatId) { - currentConfig.chatId = cachedChatId; - logger.info(`从缓存恢复 chatId=${cachedChatId}`); - return cachedChatId; + const activeId = getActiveIntegrateId(); + + // 1. 先从 localStorage 恢复(非强制刷新时) + if (!forceRefresh) { + const cachedChatId = loadCachedChatId(activeId, 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); + const result = await fetchConversationList(1, 5, currentConfig.userId, activeId); 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); + saveCachedChatId(activeId, currentConfig.userId, chatId); logger.info(`从后端恢复会话 chatId=${chatId} messageCount=${latestConv.messageCount}`); return chatId; } @@ -561,7 +600,7 @@ export async function initChatId(): Promise { // 3. 生成新的 chatId const newChatId = generateChatId(); currentConfig.chatId = newChatId; - saveCachedChatId(currentConfig.integrateId, currentConfig.userId, newChatId); + saveCachedChatId(activeId, currentConfig.userId, newChatId); logger.info(`生成新 chatId=${newChatId}`); return newChatId; } diff --git a/client/src/chat.ts b/client/src/chat.ts index c03d328..565f52c 100644 --- a/client/src/chat.ts +++ b/client/src/chat.ts @@ -21,6 +21,8 @@ import { getChatId, saveCachedChatId, submitFeedbackApi, + setActiveRoleId, + getActiveIntegrateId, CskError, } from './api'; import { @@ -49,6 +51,7 @@ let inputWrap: HTMLElement | null = null; let sendBtn: HTMLElement | null = null; let clearBtn: HTMLElement | null = null; let categorySelect: HTMLSelectElement | null = null; +let roleSelect: HTMLSelectElement | null = null; let historyPanel: HTMLElement | null = null; let welcomeEl: HTMLElement | null = null; let newMsgBtn: HTMLElement | null = null; @@ -85,6 +88,7 @@ export function initChat( sendBtn: HTMLElement; clearBtn: HTMLElement | null; categorySelect: HTMLSelectElement | null; + roleSelect: HTMLSelectElement | null; historyPanel: HTMLElement; welcomeEl: HTMLElement; newMsgBtn: HTMLElement; @@ -101,6 +105,7 @@ export function initChat( sendBtn = dom.sendBtn; clearBtn = dom.clearBtn; categorySelect = dom.categorySelect; + roleSelect = dom.roleSelect; historyPanel = dom.historyPanel; welcomeEl = dom.welcomeEl; newMsgBtn = dom.newMsgBtn; @@ -175,8 +180,8 @@ async function loadHistoryFromBackend(): Promise { renderHistory(); logger.info(`从后端加载 ${messages.length} 条历史消息`); - // 同步到 localStorage - saveMessages(config.integrateId, messages); + // 同步到 localStorage(使用当前活跃角色 ID) + saveMessages(getActiveIntegrateId(), messages); } } catch (err) { logger.warn('从后端加载历史消息失败', err); @@ -721,6 +726,78 @@ export function setCategory(categoryId: number | undefined): void { logger.lifecycleCategoryChange(categoryId ?? '全部'); } +// ==================== 角色切换 ==================== + +/** + * 切换客服角色 + * - 清理当前对话 + 生成新 chatId + * - 更新 API 层的 roleId 参数 + * - 重新加载新角色的对话历史 + */ +export async function switchRole(newRoleId: string): Promise { + if (!config || !messagesContainer) return; + + const oldRoleId = getActiveIntegrateId(); + + // 1. 判断是否与当前角色相同(防重复切换) + if (newRoleId === oldRoleId) return; + + // 2. 保存当前消息到 localStorage(与旧 integrateId 关联) + if (messages.length > 0) { + saveMessages(oldRoleId, messages); + } + + // 3. 中断正在进行的流式请求 + if (abortController) { + abortController.abort(); + abortController = null; + } + isSending = false; + setSendButtonMode('send'); + + // 4. 清空消息数组和 DOM + messages = []; + const msgNodes = messagesContainer.querySelectorAll('.csk-msg, .csk-loading'); + msgNodes.forEach(el => el.remove()); + + // 5. 清空新旧角色的 localStorage 缓存(消息 + chatId),必须在 setActiveRoleId 之前 + clearMessages(oldRoleId); + saveCachedChatId(oldRoleId, config.userId, undefined); + clearMessages(newRoleId); + saveCachedChatId(newRoleId, config.userId, undefined); + + // 6. 更新 API 层的 integrateId(必须在 initChatId 之前) + setActiveRoleId(newRoleId); + + // 7. 更新角色下拉框高亮项 + if (roleSelect) { + roleSelect.value = newRoleId; + } + + // 8. 强制查询后端会话列表(跳过 localStorage 缓存) + const foundChatId = await initChatId(true); + logger.info(`角色切换 initChatId 完成 chatId=${foundChatId} roleId=${newRoleId}`); + + // 9. 从后端加载新角色的对话历史 + if (foundChatId) { + try { + await loadHistoryFromBackend(); + } catch (err) { + logger.warn(`切换角色后加载后端历史失败 roleId=${newRoleId}`, err); + } + } + + // 10. 隐藏清空按钮 + 更新欢迎态 + if (clearBtn && messages.length === 0) clearBtn.style.display = 'none'; + updateEmptyState(); + + // 11. 重置滚动状态 + isNearBottom = true; + if (messagesContainer) scrollToBottom(messagesContainer); + + logger.info(`角色切换完成 ${oldRoleId} -> ${newRoleId}`); +} + // ==================== 会话管理面板 ==================== /** 加载会话列表并渲染 */ @@ -733,10 +810,12 @@ export async function loadHistoryConversations(): Promise { listEl.innerHTML = `
加载中...
`; try { - const result = await fetchConversationList(1, 50, config.userId, config.integrateId); + const result = await fetchConversationList(1, 50, config.userId, getActiveIntegrateId()); historyItems = result.list.map(c => ({ id: c.conversationId || '', chatId: c.conversationId || '', + roleId: c.roleId, + roleName: c.roleName, messageCount: c.messageCount, lastMessageTime: c.lastMessageTime, lastMessagePreview: c.lastMessagePreview, @@ -779,16 +858,36 @@ export async function loadHistoryConversations(): Promise { /** * 切换到指定会话:加载上下文并继续对话 + * 如果会话所属角色与当前角色不同,自动同步切换角色 * @param conversationId 会话 ID(即 chatId) */ export async function switchToConversation(conversationId: string): Promise { if (!config || !messagesContainer) return; + // 找到该会话对应的历史条目,获取其所属角色 + const historyItem = historyItems.find( + it => (it.chatId || it.id) === conversationId + ); + + // 如果会话所属角色与当前活跃角色不同,先静默切换角色 + if (historyItem && historyItem.roleId !== undefined) { + const convRoleId = String(historyItem.roleId); + const currentRoleId = getActiveIntegrateId(); + if (convRoleId && convRoleId !== currentRoleId) { + logger.info(`会话角色不匹配,自动切换角色 ${currentRoleId} -> ${convRoleId}`); + setActiveRoleId(convRoleId); + // 更新角色下拉框高亮项 + if (roleSelect) { + roleSelect.value = convRoleId; + } + } + } + logger.info(`切换到会话 conversationId=${conversationId}`); // 1. 更新 chatId updateChatId(conversationId); - saveCachedChatId(config.integrateId, config.userId, conversationId); + saveCachedChatId(getActiveIntegrateId(), config.userId, conversationId); // 2. 关闭历史面板 if (historyPanel) { diff --git a/client/src/config.ts b/client/src/config.ts index 30200ec..eddf040 100644 --- a/client/src/config.ts +++ b/client/src/config.ts @@ -9,103 +9,8 @@ import { SDKConfig, ResolvedConfig } from './types'; import { logger } from './logger'; -/** 默认悬浮按钮 SVG 图标(赛博机器人:对话气泡 + 机器人面孔 + 天线能量灯 + 眨眼动效) */ -const DEFAULT_LAUNCHER_ICON = ` - - - - - - - - - - - - - - - -`; - -// ==================== 马卡龙色系玻璃质感图标 ==================== - -/** - * 生成玻璃质感机器人 SVG 图标 - * 包含:圆润机器人头部 + 眨眼动效 + 跳动气泡 + 高光反射层 - */ -function buildGlassIcon(eyeColor: string, smileColor: string, bubbleColor: string): string { - return ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -`; -} - -/** 梦幻紫粉主题图标 */ -const GLASS_ICON_DREAM_PURPLE = buildGlassIcon( - 'rgba(139,92,246,0.6)', // 眼睛:紫色 - 'rgba(139,92,246,0.45)', // 微笑 - 'rgba(240,171,252,0.85)' // 气泡:粉紫 -); - -/** 薄荷青绿主题图标 */ -const GLASS_ICON_MINT_TECH = buildGlassIcon( - 'rgba(16,185,129,0.6)', // 眼睛:翠绿 - 'rgba(16,185,129,0.45)', // 微笑 - 'rgba(110,231,183,0.85)' // 气泡:薄荷 -); - -/** 珊瑚蜜桃主题图标 */ -const GLASS_ICON_CORAL_PEACH = buildGlassIcon( - 'rgba(244,63,94,0.55)', // 眼睛:珊瑚红 - 'rgba(244,63,94,0.4)', // 微笑 - 'rgba(253,186,116,0.85)' // 气泡:蜜桃 -); - -/** 天空蓝紫主题图标 */ -const GLASS_ICON_SKY_BLUE = buildGlassIcon( - 'rgba(56,189,248,0.6)', // 眼睛:天蓝 - 'rgba(56,189,248,0.45)', // 微笑 - 'rgba(167,139,250,0.85)' // 气泡:淡紫 -); - -/** 主题 → 默认主色映射(当用户未指定 primaryColor 时自动使用) */ -const THEME_PRIMARY_COLORS: Record = { - 'dream-purple': '#A78BFA', - 'mint-tech': '#34D399', - 'coral-peach': '#FB7185', - 'sky-blue': '#7DD3FC', -}; +/** 默认悬浮按钮图标 — E5 梦幻拖尾·全粒子:极光旋转渐变底 + 20 颗粒子系统 */ +const DEFAULT_LAUNCHER_ICON = ``; /** * 解析并校验用户传入的配置,填充默认值 @@ -135,26 +40,9 @@ export function parseConfig(raw: SDKConfig): ResolvedConfig | null { // integrateId 统一转为字符串(后端 roleId 为 Long,但 query param 传字符串也可接收) const integrateIdStr = String(raw.integrateId).trim(); - // 解析 launcherTheme:根据主题自动选择图标和默认主色 - const launcherTheme = raw.launcherTheme || undefined; - let resolvedLauncherIcon = raw.launcherIcon || DEFAULT_LAUNCHER_ICON; - let resolvedPrimaryColor = raw.primaryColor || '#4F46E5'; - - if (launcherTheme && !raw.launcherIcon) { - // 有主题且未自定义图标 → 使用主题专属玻璃质感图标 - const themeIconsMap: Record = { - 'dream-purple': GLASS_ICON_DREAM_PURPLE, - 'mint-tech': GLASS_ICON_MINT_TECH, - 'coral-peach': GLASS_ICON_CORAL_PEACH, - 'sky-blue': GLASS_ICON_SKY_BLUE, - }; - resolvedLauncherIcon = themeIconsMap[launcherTheme] || DEFAULT_LAUNCHER_ICON; - - // 若未自定义主色 → 使用主题默认色 - if (!raw.primaryColor) { - resolvedPrimaryColor = THEME_PRIMARY_COLORS[launcherTheme] || '#4F46E5'; - } - } + // 解析图标:用户传入优先,否则使用默认极光粒子图标 + const resolvedLauncherIcon = raw.launcherIcon || DEFAULT_LAUNCHER_ICON; + const resolvedPrimaryColor = raw.primaryColor || '#4F46E5'; // 填充默认值 const config: ResolvedConfig = { @@ -168,7 +56,6 @@ export function parseConfig(raw: SDKConfig): ResolvedConfig | null { height: Math.max(300, raw.height ?? 520), position: raw.position === 'left-bottom' ? 'left-bottom' : 'right-bottom', primaryColor: resolvedPrimaryColor, - launcherTheme: launcherTheme, launcherIcon: resolvedLauncherIcon, showClear: raw.showClear ?? true, showAdminPanel: raw.showAdminPanel ?? false, @@ -178,6 +65,7 @@ export function parseConfig(raw: SDKConfig): ResolvedConfig | null { theme: raw.theme === 'dark' ? 'dark' : 'light', showTeaser: raw.showTeaser ?? true, teaserText: (typeof raw.teaserText === 'string' && raw.teaserText.trim()) || '', + resizable: raw.resizable ?? true, streaming: raw.streaming ?? true, enableRag: raw.enableRag ?? true, rewriteStrategy: raw.rewriteStrategy || 'REWRITE', @@ -188,6 +76,8 @@ export function parseConfig(raw: SDKConfig): ResolvedConfig | null { onError: typeof raw.onError === 'function' ? raw.onError : undefined, onReady: typeof raw.onReady === 'function' ? raw.onReady : undefined, onMessage: typeof raw.onMessage === 'function' ? raw.onMessage : undefined, + token: raw.token, + roles: raw.roles, chatId: '', // 初始为空,由 chatId 初始化流程填充 }; diff --git a/client/src/dom.ts b/client/src/dom.ts index ffddbd1..e44d6e5 100644 --- a/client/src/dom.ts +++ b/client/src/dom.ts @@ -8,7 +8,7 @@ * - 输入区采用圆角容器包裹文本框与发送按钮 */ import { ResolvedConfig, RagSource } from './types'; -import { debounce } from './utils'; +import { debounce, formatTime } from './utils'; import { t } from './i18n'; // ==================== 图标常量 ==================== @@ -25,9 +25,7 @@ const USER_ICON = ` void): HTMLElement { const launcher = document.createElement('div'); launcher.id = 'csk-launcher'; - // 有玻璃主题时追加 --glass 类名,启用磨砂玻璃质感样式 - const glassClass = config.launcherTheme ? ' csk-launcher--glass' : ''; - launcher.className = `csk-launcher csk-launcher--${config.position === 'left-bottom' ? 'left' : 'right'}${glassClass}`; + launcher.className = `csk-launcher csk-launcher--${config.position === 'left-bottom' ? 'left' : 'right'}`; launcher.setAttribute('title', config.title); launcher.setAttribute('aria-label', config.title); launcher.setAttribute('role', 'button'); @@ -66,10 +64,12 @@ export function createChatWindow(config: ResolvedConfig): { sendBtn: HTMLElement; clearBtn: HTMLElement | null; categorySelect: HTMLSelectElement | null; + roleSelect: HTMLSelectElement | null; historyPanel: HTMLElement; welcomeEl: HTMLElement; newMsgBtn: HTMLElement; teaserEl: HTMLElement; + resizeHandle: HTMLElement; searchInput: HTMLInputElement | null; ariaLiveEl: HTMLElement; showLoading: () => HTMLElement; @@ -110,6 +110,42 @@ export function createChatWindow(config: ResolvedConfig): { headerLeft.appendChild(headerAvatar); headerLeft.appendChild(headerInfo); + // === 角色选择器(仅当有多个角色时显示) === + let roleSelect: HTMLSelectElement | null = null; + const roles = config.roles; + if (roles && roles.length > 1) { + roleSelect = document.createElement('select'); + roleSelect.className = 'csk-role-select'; + roleSelect.setAttribute('aria-label', t('role_selector_label')); + + for (const role of roles) { + const option = document.createElement('option'); + option.value = String(role.id); + option.textContent = role.name || String(role.id); + if (String(role.id) === String(config.integrateId)) { + option.selected = true; + } + roleSelect.appendChild(option); + } + + // onChange 触发自定义事件 + roleSelect.addEventListener('change', () => { + const selectedValue = roleSelect!.value; + windowEl.dispatchEvent(new CustomEvent('csk:roleChange', { + detail: { roleId: selectedValue } + })); + }); + + // 包装后插入到 headerLeft 之后、actions 之前 + const roleWrap = document.createElement('div'); + roleWrap.className = 'csk-role-select-wrap'; + roleWrap.appendChild(roleSelect); + header.appendChild(headerLeft); + header.appendChild(roleWrap); + } else { + header.appendChild(headerLeft); + } + const actions = document.createElement('div'); actions.className = 'csk-header__actions'; @@ -140,7 +176,6 @@ export function createChatWindow(config: ResolvedConfig): { actions.appendChild(historyBtn); actions.appendChild(minimizeBtn); actions.appendChild(closeBtn); - header.appendChild(headerLeft); header.appendChild(actions); // === 消息区 === @@ -345,6 +380,14 @@ export function createChatWindow(config: ResolvedConfig): { ${config.teaserText || t('teaser_text')} `; + // === 缩放拖拽手柄(右下角) === + const resizeHandle = document.createElement('div'); + resizeHandle.className = 'csk-resize-handle'; + resizeHandle.setAttribute('aria-label', t('resize')); + // 纯 CSS 渲染三条斜线,无需 SVG + resizeHandle.innerHTML = ''; + windowEl.appendChild(resizeHandle); + return { window: windowEl, messagesContainer, @@ -356,8 +399,10 @@ export function createChatWindow(config: ResolvedConfig): { welcomeEl, newMsgBtn, teaserEl, + resizeHandle, searchInput, ariaLiveEl, + roleSelect, showLoading, hideLoading, }; @@ -586,6 +631,115 @@ export function enableLauncherDrag( }; } +// ==================== 窗口缩放支持 ==================== + +/** 窗口最小尺寸 */ +const MIN_WIDTH = 300; +const MIN_HEIGHT = 300; + +/** + * 启用窗口右下角拖拽缩放 + * @param handleEl 缩放手柄元素 + * @param windowEl 聊天窗口元素 + * @param onResizeEnd 缩放结束回调,返回最终宽高用于持久化 + * @returns 清理函数 + */ +export function enableResize( + handleEl: HTMLElement, + windowEl: HTMLElement, + onResizeEnd?: (size: { width: number; height: number }) => void, +): () => void { + let resizing = false; + let startX = 0; + let startY = 0; + let startWidth = 0; + let startHeight = 0; + + const onPointerDown = (clientX: number, clientY: number): void => { + resizing = true; + startX = clientX; + startY = clientY; + const rect = windowEl.getBoundingClientRect(); + startWidth = rect.width; + startHeight = rect.height; + windowEl.classList.add('csk-window--resizing'); + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + document.addEventListener('touchmove', onTouchMove, { passive: false }); + document.addEventListener('touchend', onTouchEnd); + }; + + const onPointerMove = (clientX: number, clientY: number, e?: Event): void => { + if (!resizing) return; + if (e) e.preventDefault(); + + const dx = clientX - startX; + const dy = clientY - startY; + const newWidth = Math.max(MIN_WIDTH, Math.min(startWidth + dx, window.innerWidth - 24)); + const newHeight = Math.max(MIN_HEIGHT, Math.min(startHeight + dy, window.innerHeight - 24)); + + windowEl.style.width = `${newWidth}px`; + windowEl.style.height = `${newHeight}px`; + // 同步更新 CSS 变量(供内部布局使用) + windowEl.style.setProperty('--csk-window-width', `${newWidth}px`); + windowEl.style.setProperty('--csk-window-height', `${newHeight}px`); + // 拖拽缩放后清除 bottom/right 定位,避免与固定定位冲突 + windowEl.style.bottom = ''; + windowEl.style.right = ''; + }; + + const onPointerUp = (): void => { + if (!resizing) return; + resizing = false; + windowEl.classList.remove('csk-window--resizing'); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); + + const rect = windowEl.getBoundingClientRect(); + if (onResizeEnd) { + onResizeEnd({ width: rect.width, height: rect.height }); + } + }; + + // 鼠标事件(DOM 事件监听器包装) + function onMouseMove(e: MouseEvent): void { onPointerMove(e.clientX, e.clientY, e); } + function onMouseUp(): void { onPointerUp(); } + + // 鼠标事件 + function onMouseDown(e: MouseEvent): void { + e.preventDefault(); + e.stopPropagation(); + onPointerDown(e.clientX, e.clientY); + } + + // 触摸事件 + function onTouchStart(e: TouchEvent): void { + e.preventDefault(); + e.stopPropagation(); + if (e.touches.length === 1) onPointerDown(e.touches[0].clientX, e.touches[0].clientY); + } + + function onTouchMove(e: TouchEvent): void { + if (e.touches.length === 1) onPointerMove(e.touches[0].clientX, e.touches[0].clientY, e); + } + + function onTouchEnd(): void { onPointerUp(); } + + handleEl.addEventListener('mousedown', onMouseDown); + handleEl.addEventListener('touchstart', onTouchStart, { passive: false }); + + return () => { + handleEl.removeEventListener('mousedown', onMouseDown); + handleEl.removeEventListener('touchstart', onTouchStart); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); + }; +} + // ==================== 消息渲染 ==================== /** 渲染用户消息气泡 */ @@ -815,7 +969,7 @@ async function copyToClipboard(text: string, btn: HTMLElement): Promise { } /** 为气泡内所有代码块添加复制按钮 */ -export function enhanceCodeBlocks(bubble: HTMLElement): void { +function enhanceCodeBlocks(bubble: HTMLElement): void { const blocks = bubble.querySelectorAll('.csk-md-code-block'); blocks.forEach((pre) => { if (pre.querySelector('.csk-md-code-copy')) return; @@ -934,6 +1088,10 @@ export function renderSources(wrapper: HTMLElement, sources: RagSource[]): void export interface HistoryItemData { id: string; chatId?: string; + /** 会话所属角色 ID */ + roleId?: number; + /** 会话所属角色名称 */ + roleName?: string; messageCount?: number; lastMessageTime?: string; lastMessagePreview?: string; @@ -1041,6 +1199,7 @@ export function renderHistoryList( const metaEl = document.createElement('div'); metaEl.className = 'csk-history-item__meta'; const metaParts: string[] = []; + if (item.roleName) metaParts.push(item.roleName); if (item.messageCount !== undefined) metaParts.push(`${item.messageCount} 条消息`); if (item.lastMessageTime) metaParts.push(item.lastMessageTime); else if (item.createdAt) metaParts.push(item.createdAt); @@ -1092,11 +1251,3 @@ export function renderHistoryList( export function scrollToBottom(container: HTMLElement): void { container.scrollTop = container.scrollHeight; } - -/** 格式化时间戳 */ -function formatTime(timestamp: number): string { - const d = new Date(timestamp); - const hh = String(d.getHours()).padStart(2, '0'); - const mm = String(d.getMinutes()).padStart(2, '0'); - return `${hh}:${mm}`; -} diff --git a/client/src/i18n.ts b/client/src/i18n.ts index 907f37f..ab625ae 100644 --- a/client/src/i18n.ts +++ b/client/src/i18n.ts @@ -10,6 +10,7 @@ const dictionaries: Record> = { minimize: '最小化', close: '关闭', status_online: '在线', + role_selector_label: '服务角色', // 欢迎空状态 welcome_title: '你好,我是 AI 智能助手', @@ -64,6 +65,7 @@ const dictionaries: Record> = { // 提示气泡 teaser_text: '有什么可以帮你的吗?', new_msg_announce: '收到新消息', + resize: '拖拽缩放窗口', // 错误提示 error_network: '网络连接失败,请检查网络', @@ -86,6 +88,7 @@ const dictionaries: Record> = { minimize: 'Minimize', close: 'Close', status_online: 'Online', + role_selector_label: 'Service', // Welcome welcome_title: 'Hi, I am your AI assistant', @@ -140,6 +143,7 @@ const dictionaries: Record> = { // Teaser teaser_text: 'How can I help you?', new_msg_announce: 'New message received', + resize: 'Resize window', // Errors error_network: 'Network connection failed', @@ -199,6 +203,6 @@ export function t(key: string, params?: Record): string /** * 获取当前语言 */ -export function getLocale(): string { +function getLocale(): string { return currentLocale; } diff --git a/client/src/index.ts b/client/src/index.ts index 0ddf469..2a637fb 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -10,10 +10,10 @@ import { SDKConfig, ResolvedConfig, ChatbotSDKInstance } from './types'; import { parseConfig } from './config'; import { setDebug, logger, setErrorCallback } from './logger'; -import { setApiConfig } from './api'; +import { setApiConfig, clearApiConfig } from './api'; import { injectStyles, removeStyles } from './styles'; -import { createLauncher, createChatWindow, enableDrag, enableLauncherDrag } from './dom'; -import { initChat, initChatHistory, getMessages, setCategory, loadHistoryConversations, sendQuickReply, retryFromMessage, handleFeedback } from './chat'; +import { createLauncher, createChatWindow, enableDrag, enableLauncherDrag, enableResize } from './dom'; +import { initChat, initChatHistory, setCategory, loadHistoryConversations, sendQuickReply, retryFromMessage, handleFeedback, switchRole } from './chat'; import { clearMessages } from './storage'; import { setLocale } from './i18n'; @@ -46,6 +46,7 @@ let showLoadingFn: (() => HTMLElement) | null = null; let hideLoadingFn: (() => void) | null = null; let dragCleanup: (() => void) | null = null; let launcherDragCleanup: (() => void) | null = null; +let resizeCleanup: (() => void) | null = null; /** Launcher 位置记忆状态(拖拽后更新) */ let launcherPos: { side: 'left' | 'right'; bottom: number } | null = null; @@ -146,6 +147,16 @@ function init(rawConfig: SDKConfig): void { // 9.1 恢复上次拖拽位置 restoreWindowPosition(config.integrateId, windowEl); + // 9.2 启用缩放(resizable 配置控制) + if (config.resizable) { + const resizeHandle = dom.resizeHandle; + resizeCleanup = enableResize(resizeHandle, windowEl, (size) => { + saveWindowSize(config!.integrateId, size); + }); + // 恢复上次缩放的尺寸 + restoreWindowSize(config.integrateId, windowEl); + } + // 10. 初始化对话模块 initChat(config, { messagesContainer, @@ -158,6 +169,7 @@ function init(rawConfig: SDKConfig): void { newMsgBtn: dom.newMsgBtn, searchInput: dom.searchInput, ariaLiveEl: dom.ariaLiveEl, + roleSelect: dom.roleSelect, showLoading: showLoadingFn, hideLoading: hideLoadingFn, }); @@ -196,6 +208,11 @@ function init(rawConfig: SDKConfig): void { } }) as EventListener); + // 16.5 监听角色切换事件 + windowEl.addEventListener('csk:roleChange', ((e: CustomEvent) => { + if (e.detail.roleId) switchRole(String(e.detail.roleId)); + }) as EventListener); + // 17. ESC 键关闭弹窗 document.addEventListener('keydown', onKeyDown); @@ -358,6 +375,7 @@ function destroy(): void { if (windowEl && windowEl.parentNode) { windowEl.parentNode.removeChild(windowEl); windowEl = null; } if (dragCleanup) { dragCleanup(); dragCleanup = null; } if (launcherDragCleanup) { launcherDragCleanup(); launcherDragCleanup = null; } + if (resizeCleanup) { resizeCleanup(); resizeCleanup = null; } launcherPos = null; removeStyles(); @@ -378,6 +396,7 @@ function destroy(): void { hideLoadingFn = null; badgeEl = null; audioCtx = null; + clearApiConfig(); logger.lifecycleDestroy(oldIntegrateId || ''); } @@ -410,6 +429,36 @@ function clearHistory(): void { else if (confirm('确定清空所有对话记录?')) { clearMessages(config.integrateId); } } +// ==================== 窗口尺寸记忆 ==================== + +/** localStorage key:窗口尺寸 */ +function sizeKey(integrateId: string): string { + return `csk_size_${integrateId}`; +} + +/** 保存窗口缩放的尺寸到 localStorage */ +function saveWindowSize(integrateId: string, size: { width: number; height: number }): void { + try { + localStorage.setItem(sizeKey(integrateId), JSON.stringify(size)); + } catch { /* 忽略 */ } +} + +/** 恢复窗口缩放尺寸 */ +function restoreWindowSize(integrateId: string, winEl: HTMLElement): void { + try { + const raw = localStorage.getItem(sizeKey(integrateId)); + if (!raw) return; + const size = JSON.parse(raw) as { width: number; height: number }; + if (typeof size.width !== 'number' || typeof size.height !== 'number') return; + const w = Math.max(300, Math.min(size.width, window.innerWidth - 24)); + const h = Math.max(300, Math.min(size.height, window.innerHeight - 24)); + winEl.style.width = `${w}px`; + winEl.style.height = `${h}px`; + winEl.style.setProperty('--csk-window-width', `${w}px`); + winEl.style.setProperty('--csk-window-height', `${h}px`); + } catch { /* 忽略 */ } +} + // ==================== 窗口位置记忆 ==================== /** localStorage key:窗口位置 */ diff --git a/client/src/styles.ts b/client/src/styles.ts index 54372c8..673ad7f 100644 --- a/client/src/styles.ts +++ b/client/src/styles.ts @@ -21,16 +21,6 @@ function cssVars(config: ResolvedConfig): string { const lighter = adjustColor(config.primaryColor, 18); const rgb = hexToRgb(config.primaryColor); - // 马卡龙主题渐变色映射 - const themeGradients: Record = { - 'dream-purple': { grad1: '#A78BFA', grad2: '#F0ABFC', glow: '167, 139, 250' }, - 'mint-tech': { grad1: '#6EE7B7', grad2: '#34D399', glow: '52, 211, 153' }, - 'coral-peach': { grad1: '#FB7185', grad2: '#FDBA74', glow: '251, 113, 133' }, - 'sky-blue': { grad1: '#7DD3FC', grad2: '#A78BFA', glow: '125, 211, 252' }, - }; - - const themeColors = config.launcherTheme ? themeGradients[config.launcherTheme] : null; - return ` --csk-primary: ${config.primaryColor}; --csk-primary-hover: ${darker}; @@ -47,11 +37,6 @@ function cssVars(config: ResolvedConfig): string { --csk-shadow-bubble: 0 1px 2px rgba(15, 23, 42, 0.06); --csk-border: #ECEEF2; --csk-bg-app: #F6F7F9; - ${themeColors ? ` - --csk-launcher-grad-1: ${themeColors.grad1}; - --csk-launcher-grad-2: ${themeColors.grad2}; - --csk-launcher-glow: ${themeColors.glow}; - ` : ''} `; } @@ -92,7 +77,8 @@ function getStyles(config: ResolvedConfig): string { width: 60px; height: 60px; border-radius: 50%; - background: var(--csk-bg-user); + /* E5 梦幻拖尾 — 四段极光渐变慢旋 */ + background: conic-gradient(from 0deg, #ec4899 0deg, #8b5cf6 90deg, #3b82f6 180deg, #06b6d4 270deg, #ec4899 360deg); display: flex; align-items: center; justify-content: center; @@ -106,61 +92,27 @@ function getStyles(config: ResolvedConfig): string { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 4px 16px rgba(0, 0, 0, 0.10), - 0 6px 24px rgba(var(--csk-primary-rgb), 0.28), - 0 0 48px rgba(var(--csk-primary-rgb), 0.12); + 0 6px 24px rgba(236, 72, 153, 0.28), + 0 0 48px rgba(236, 72, 153, 0.12); transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.25s ease, border-color 0.25s ease; - animation: csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both; + animation: + csk-aurora-spin 5s linear infinite, + csk-launcher-in 0.55s cubic-bezier(0.22, 1, 0.36, 1) both; } .csk-launcher--right { right: 24px; } .csk-launcher--left { left: 24px; } -/* 高光扫过动效 */ -.csk-launcher::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 40%; - height: 200%; - border-radius: 50%; - background: linear-gradient( - 105deg, - transparent 30%, - rgba(255, 255, 255, 0.28) 48%, - rgba(255, 255, 255, 0.1) 52%, - transparent 70% - ); - transform: rotate(25deg); - animation: csk-shimmer 4s ease-in-out infinite; - pointer-events: none; -} -/* 呼吸色晕 — 配合接地阴影,强化白底上的立体存在感 */ -.csk-launcher::after { - content: ''; - position: absolute; - inset: -18px; - border-radius: 50%; - background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.18) 0%, rgba(var(--csk-primary-rgb), 0.05) 45%, transparent 68%); - animation: csk-breathe 3.5s ease-in-out infinite; - pointer-events: none; -} .csk-launcher:hover { transform: translateY(-3px) scale(1.08); border-color: rgba(255, 255, 255, 0.75); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.10), 0 8px 24px rgba(0, 0, 0, 0.14), - 0 10px 36px rgba(var(--csk-primary-rgb), 0.32), - 0 0 56px rgba(var(--csk-primary-rgb), 0.14); -} -.csk-launcher:hover::before { animation-play-state: paused; } -.csk-launcher:hover::after { - animation: none; - inset: -22px; - background: radial-gradient(circle, rgba(var(--csk-primary-rgb), 0.22) 0%, rgba(var(--csk-primary-rgb), 0.06) 45%, transparent 68%); + 0 10px 36px rgba(236, 72, 153, 0.32), + 0 0 56px rgba(236, 72, 153, 0.14); } .csk-launcher:active { transform: scale(0.93); } .csk-launcher svg { @@ -176,107 +128,149 @@ function getStyles(config: ResolvedConfig): string { 60% { transform: scale(1.06) translateY(-2px); } 100% { opacity: 1; transform: scale(1) translateY(0); } } -@keyframes csk-shimmer { - 0%, 100% { left: -60%; opacity: 0; } - 20% { opacity: 1; } - 60% { opacity: 1; } - 80% { left: 120%; opacity: 0; } + +/* ========== E5 梦幻拖尾·全粒子动画系统 ========== */ +/* 极光旋转 */ +@keyframes csk-aurora-spin { + to { transform: rotate(360deg); } } -@keyframes csk-breathe { - 0%, 100% { transform: scale(1); opacity: 1; } - 50% { transform: scale(1.15); opacity: 0.35; } + +/* 粒子通用 */ +.csk-pt { + position: absolute; + border-radius: 50%; + background: #fff; + z-index: 4; + top: 50%; + left: 50%; + pointer-events: none; +} + +/* ── 爆散粒子(8颗,不同方向/距离/大小/延迟)── */ +.csk-pt-burst { animation: csk-burst 2.8s ease-in-out infinite; } +.csk-pt-burst:nth-child(1) { width:5px; height:5px; animation-delay:0s; } +.csk-pt-burst:nth-child(2) { width:4px; height:4px; animation-delay:0.35s; } +.csk-pt-burst:nth-child(3) { width:5px; height:5px; animation-delay:0.7s; } +.csk-pt-burst:nth-child(4) { width:3px; height:3px; animation-delay:1.05s; } +.csk-pt-burst:nth-child(5) { width:5px; height:5px; animation-delay:1.4s; } +.csk-pt-burst:nth-child(6) { width:4px; height:4px; animation-delay:1.75s; } +.csk-pt-burst:nth-child(7) { width:3px; height:3px; animation-delay:2.1s; } +.csk-pt-burst:nth-child(8) { width:5px; height:5px; animation-delay:2.45s; } + +@keyframes csk-burst { + 0% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 12% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 32% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(1.5); opacity: 1; } + 48% { transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy))) scale(0.5); opacity: .55; } + 62% { transform: translate(-50%,-50%) scale(0); opacity: 0; } + 100% { transform: translate(-50%,-50%) scale(0); opacity: 0; } } -/* SVG 图标内部动效:眨眼 */ -.csk-launcher .csk-ico-eye { - animation: csk-eye-blink 4s ease-in-out infinite; +/* ── 浮游粒子(持续轨道运动,永不停歇)── */ +.csk-pt-float { + animation: csk-float-orbit 3s linear infinite; + box-shadow: 0 0 4px 1px rgba(255,255,255,.5); +} +.csk-pt-float:nth-child(9) { width:3px; height:3px; animation-duration:2.4s; animation-delay:0s; } +.csk-pt-float:nth-child(10) { width:4px; height:4px; animation-duration:3.2s; animation-delay:-0.6s; } +.csk-pt-float:nth-child(11) { width:3px; height:3px; animation-duration:2.8s; animation-delay:-1.2s; } +.csk-pt-float:nth-child(12) { width:4px; height:4px; animation-duration:3.6s; animation-delay:-1.8s; } + +@keyframes csk-float-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(20px) rotate(0deg); } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(20px) rotate(-360deg); } } -@keyframes csk-eye-blink { - 0%, 42%, 48%, 100% { opacity: 1; } - 45% { opacity: 0.1; } + +/* ── 心跳粒子(中心脉冲 + 呼吸缩放)── */ +.csk-pt-pulse { + animation: csk-heart-pulse 1.4s ease-in-out infinite; } -/* SVG 图标内部动效:天线能量闪烁 */ -.csk-launcher .csk-ico-antenna { - animation: csk-antenna-glow 2s ease-in-out infinite; +.csk-pt-pulse:nth-child(13) { + width: 8px; height: 8px; + box-shadow: 0 0 14px 4px rgba(255,255,255,.8), 0 0 28px 8px rgba(255,255,255,.3); + animation-delay: 0s; } -@keyframes csk-antenna-glow { - 0%, 100% { opacity: 0.5; } - 50% { opacity: 1; } +.csk-pt-pulse:nth-child(14) { + width: 4px; height: 4px; + box-shadow: 0 0 8px 2px rgba(255,255,255,.6); + animation-delay: 0.7s; } -/* ========== 磨砂玻璃质感悬浮按钮 ========== */ -.csk-launcher--glass { - background: linear-gradient( - 135deg, - var(--csk-launcher-grad-1, var(--csk-primary)) 0%, - var(--csk-launcher-grad-2, var(--csk-primary-light)) 100% - ) !important; - backdrop-filter: blur(12px) saturate(180%); - -webkit-backdrop-filter: blur(12px) saturate(180%); - border: 1.5px solid rgba(255, 255, 255, 0.55) !important; - /* 多层阴影:接地 + 彩色光晕 + 内阴影立体感 */ - box-shadow: - 0 2px 4px rgba(0, 0, 0, 0.04), - 0 6px 20px rgba(0, 0, 0, 0.08), - 0 8px 32px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.30), - inset 0 1px 1px rgba(255, 255, 255, 0.35), - inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important; -} -.csk-launcher--glass:hover { - border-color: rgba(255, 255, 255, 0.75) !important; - box-shadow: - 0 4px 8px rgba(0, 0, 0, 0.06), - 0 10px 28px rgba(0, 0, 0, 0.10), - 0 12px 40px rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.38), - inset 0 1px 2px rgba(255, 255, 255, 0.45), - inset 0 -1px 1px rgba(0, 0, 0, 0.04) !important; +@keyframes csk-heart-pulse { + 0%, 100% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; } + 25% { transform: translate(-50%,-50%) scale(1.6); opacity: 1; } + 50% { transform: translate(-50%,-50%) scale(0.4); opacity: .3; } + 75% { transform: translate(-50%,-50%) scale(0.9); opacity: .6; } +} + +/* ── 甩尾粒子(椭圆轨道 + 变速,近大远小)── */ +.csk-pt-elliptic { + animation: csk-elliptic-orbit 2.6s ease-in-out infinite; + box-shadow: 0 0 5px 1px rgba(255,255,255,.6); } +.csk-pt-elliptic:nth-child(15) { width:4px; height:4px; animation-delay:0s; } +.csk-pt-elliptic:nth-child(16) { width:4px; height:4px; animation-delay:-1.3s; } + +@keyframes csk-elliptic-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(18px) rotate(0deg) scaleY(1); } + 25% { transform: translate(-50%,-50%) rotate(90deg) translateX(18px) rotate(-90deg) scaleY(0.45); } + 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(18px) rotate(-180deg) scaleY(1); } + 75% { transform: translate(-50%,-50%) rotate(270deg) translateX(18px) rotate(-270deg) scaleY(0.45); } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(18px) rotate(-360deg) scaleY(1); } +} + +/* ── 环绕流光(外层慢速光环拖尾)── */ +.csk-pt-ring { + width: 3px; height: 3px; + background: rgba(255,255,255,.9); + box-shadow: 0 0 6px 2px rgba(255,255,255,.7); + animation: csk-ring-orbit 5s linear infinite; +} +.csk-pt-ring:nth-child(17) { animation-delay: 0s; } +.csk-pt-ring:nth-child(18) { animation-delay: -1.25s; } +.csk-pt-ring:nth-child(19) { animation-delay: -2.5s; } +.csk-pt-ring:nth-child(20) { animation-delay: -3.75s; } -/* 玻璃按钮的呼吸色晕 — 更鲜艳、更醒目 */ -.csk-launcher--glass::after { - background: radial-gradient( - circle, - rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.28) 0%, - rgba(var(--csk-launcher-glow, var(--csk-primary-rgb)), 0.10) 40%, - transparent 65% - ) !important; - animation: csk-breathe-glow 3.5s ease-in-out infinite; -} -@keyframes csk-breathe-glow { - 0%, 100% { transform: scale(1); opacity: 0.8; } - 50% { transform: scale(1.22); opacity: 0.25; } +@keyframes csk-ring-orbit { + 0% { transform: translate(-50%,-50%) rotate(0deg) translateX(23px) rotate(0deg) scale(1); opacity: .8; } + 50% { transform: translate(-50%,-50%) rotate(180deg) translateX(23px) rotate(-180deg) scale(1.8); opacity: 1; } + 100% { transform: translate(-50%,-50%) rotate(360deg) translateX(23px) rotate(-360deg) scale(1); opacity: .8; } } -/* 玻璃按钮的高光扫过 — 更柔和的玻璃质感 */ -.csk-launcher--glass::before { - background: linear-gradient( - 115deg, - transparent 25%, - rgba(255, 255, 255, 0.35) 45%, - rgba(255, 255, 255, 0.15) 55%, - transparent 75% - ) !important; - width: 50%; - animation: csk-shimmer-glass 5s ease-in-out infinite; -} -@keyframes csk-shimmer-glass { - 0%, 100% { left: -70%; opacity: 0; } - 15% { opacity: 1; } - 55% { opacity: 1; } - 70% { left: 130%; opacity: 0; } +/* ── 极光扫光叠加层 ── */ +.csk-sheen { + position: absolute; + inset: 0; + border-radius: 50%; + pointer-events: none; + z-index: 3; + overflow: hidden; +} +.csk-sheen::after { + content: ''; + position: absolute; + top: -60%; left: -60%; + width: 35%; height: 220%; + background: rgba(255,255,255,.15); + transform: rotate(22deg); + animation: csk-shimmer-sweep 2.8s ease-in-out infinite; +} +@keyframes csk-shimmer-sweep { + 0% { left: -60%; } + 40% { left: 50%; } + 60% { left: 50%; } + 100% { left: 130%; } } -/* SVG 内部动效:跳动气泡(3 个小圆点交错弹跳) */ -.csk-launcher .csk-ico-bubble { - animation: csk-bubble-jump 1.4s ease-in-out infinite; -} -.csk-launcher .csk-ico-bubble--1 { animation-delay: 0s; } -.csk-launcher .csk-ico-bubble--2 { animation-delay: 0.18s; } -.csk-launcher .csk-ico-bubble--3 { animation-delay: 0.36s; } -@keyframes csk-bubble-jump { - 0%, 100% { transform: translateY(0); } - 40% { transform: translateY(-3.5px); } - 60% { transform: translateY(-1px); } +/* ── 双层极光圈(反向旋转,增加层次)── */ +.csk-dual { + position: absolute; + inset: 0; + border-radius: 50%; + pointer-events: none; + z-index: 2; + background: conic-gradient(from 180deg, transparent 0%, rgba(255,255,255,.08) 35%, transparent 65%); + animation: csk-aurora-spin 2s linear infinite reverse; } /* ========== 聊天弹窗 ========== */ @@ -411,6 +405,43 @@ function getStyles(config: ResolvedConfig): string { .csk-header__btn:active, .csk-history-btn:active { transform: scale(0.92); } +/* ========== 角色选择器 ========== */ +.csk-role-select-wrap { + display: flex; + align-items: center; + flex-shrink: 0; + margin: 0 4px; +} +.csk-role-select { + appearance: none; + -webkit-appearance: none; + padding: 4px 24px 4px 10px; + border: 1px solid rgba(255, 255, 255, 0.35); + border-radius: 8px; + background: rgba(255, 255, 255, 0.15) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='white' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 6px center; + color: #fff; + font-size: 12px; + font-family: inherit; + cursor: pointer; + outline: none; + transition: background 0.15s, border-color 0.15s; + max-width: 120px; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-role-select:hover { + background-color: rgba(255, 255, 255, 0.25); + border-color: rgba(255, 255, 255, 0.55); +} +.csk-role-select:focus { + border-color: rgba(255, 255, 255, 0.7); + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2); +} +.csk-role-select option { + color: #1F2937; + background: #fff; +} + /* ========== 消息区 ========== */ .csk-messages { flex: 1; @@ -798,6 +829,7 @@ function getStyles(config: ResolvedConfig): string { .csk-msg--ai .csk-msg__bubble .csk-md-h4 { font-size: 14px; } .csk-md-code-block { + position: relative; background: #1E293B; color: #E2E8F0; padding: 12px 14px; @@ -984,19 +1016,6 @@ function getStyles(config: ResolvedConfig): string { 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; } /* ========== 快捷问题芯片 ========== */ .csk-quick-replies { @@ -1076,7 +1095,6 @@ function getStyles(config: ResolvedConfig): string { } /* ========== 代码块复制按钮 ========== */ -.csk-md-code-block { position: relative; } .csk-md-code-copy { position: absolute; top: 8px; @@ -1134,6 +1152,94 @@ function getStyles(config: ResolvedConfig): string { box-shadow: 0 5px 14px rgba(239, 68, 68, 0.45) !important; } +/* ========== 窗口缩放拖拽手柄 ========== */ +.csk-resize-handle { + position: absolute; + right: 4px; + bottom: 4px; + width: 20px; + height: 20px; + display: flex; + align-items: flex-end; + justify-content: flex-end; + cursor: nwse-resize; + z-index: 5; + user-select: none; + -webkit-user-select: none; + /* 圆形半透明背景,与整体圆润风格一致 */ + border-radius: 50%; + background: transparent; + transition: background 0.2s ease; +} +.csk-resize-handle:hover { + background: rgba(var(--csk-primary-rgb), 0.08); +} + +/* 三斜线抓手 — 纯 CSS 绘制,用两条间距微调的线,视觉上是三条 */ +.csk-resize-grip { + display: block; + width: 10px; + height: 10px; + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + #C8CCD2 38%, #C8CCD2 42%, + transparent 42%, transparent 54%, + #C8CCD2 54%, #C8CCD2 58%, + transparent 58%, transparent 70%, + #C8CCD2 70%, #C8CCD2 74%, + transparent 74% + ); + transition: background 0.2s ease; + border-radius: 2px; +} +/* hover 时线条变为主色 */ +.csk-resize-handle:hover .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + var(--csk-primary) 38%, var(--csk-primary) 42%, + transparent 42%, transparent 54%, + var(--csk-primary) 54%, var(--csk-primary) 58%, + transparent 58%, transparent 70%, + var(--csk-primary) 70%, var(--csk-primary) 74%, + transparent 74% + ); +} + +/* 暗色模式 */ +.csk-dark .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + #5B6070 38%, #5B6070 42%, + transparent 42%, transparent 54%, + #5B6070 54%, #5B6070 58%, + transparent 58%, transparent 70%, + #5B6070 70%, #5B6070 74%, + transparent 74% + ); +} +.csk-dark .csk-resize-handle:hover .csk-resize-grip { + background: + linear-gradient(135deg, + transparent 0%, transparent 38%, + var(--csk-primary-light) 38%, var(--csk-primary-light) 42%, + transparent 42%, transparent 54%, + var(--csk-primary-light) 54%, var(--csk-primary-light) 58%, + transparent 58%, transparent 70%, + var(--csk-primary-light) 70%, var(--csk-primary-light) 74%, + transparent 74% + ); +} + +/* 缩放拖拽中:禁用过渡动画 + 全局光标 */ +.csk-window--resizing { + transition: none !important; + user-select: none; +} +.csk-window--resizing * { cursor: nwse-resize !important; } + /* ========== 暗色模式 ========== */ .csk-root.csk-dark { --csk-bg-ai: #1E1E2E; @@ -1200,6 +1306,10 @@ function getStyles(config: ResolvedConfig): string { .csk-dark .csk-launcher__badge { box-shadow: 0 0 0 2px #1A1A2E; } .csk-dark .csk-welcome__avatar { box-shadow: 0 6px 18px rgba(var(--csk-primary-rgb), 0.25); } .csk-dark .csk-header__avatar { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.1); } +.csk-dark .csk-role-select option { + background: #1A1A2E; + color: #E2E8F0; +} /* Launcher 拖拽态:微放大 + 阴影加深 */ .csk-launcher--dragging { @@ -1208,11 +1318,9 @@ function getStyles(config: ResolvedConfig): string { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.14), 0 12px 32px rgba(0, 0, 0, 0.18), - 0 14px 40px rgba(var(--csk-primary-rgb), 0.36), - 0 0 56px rgba(var(--csk-primary-rgb), 0.18) !important; + 0 14px 40px rgba(236, 72, 153, 0.36), + 0 0 56px rgba(236, 72, 153, 0.18) !important; } -.csk-launcher--dragging::before, -.csk-launcher--dragging::after { animation-play-state: paused !important; } /* 拖拽中隐藏未读徽章 */ .csk-launcher--dragging .csk-launcher__badge { display: none !important; } /* 吸附过渡动画(释放时的缓动) */ @@ -1401,6 +1509,7 @@ function getStyles(config: ResolvedConfig): string { left: 0 !important; border-radius: 0; } + .csk-resize-handle { display: none !important; } .csk-window--hidden { transform: translateY(100%); } /* 移动端默认位置,仅在未被 JS 拖拽覆盖时生效 */ .csk-launcher:not([style*="bottom"]) { bottom: 20px; } @@ -1425,26 +1534,6 @@ export function injectStyles(config: ResolvedConfig): void { document.head.appendChild(styleElement); } -/** - * 动态更新 CSS 变量(主题色变更时使用) - */ -export function updateTheme(config: ResolvedConfig): void { - const root = document.querySelector('.csk-root') as HTMLElement; - if (!root) { - return; - } - const vars = cssVars(config); - vars.split(';').forEach((pair) => { - const idx = pair.indexOf(':'); - if (idx < 0) return; - const key = pair.slice(0, idx).trim(); - const value = pair.slice(idx + 1).trim(); - if (key && value) { - root.style.setProperty(key, value); - } - }); -} - /** * 移除注入的样式 */ diff --git a/client/src/types.ts b/client/src/types.ts index 1b603b0..7d87adf 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -19,6 +19,12 @@ export interface SDKConfig { /** 宿主用户标识 → 后端 accountId 参数(客户账号 ID),账号可绑定角色 */ userId?: string; + // === 鉴权配置 === + /** SDK JWT Token(从 /open-api/auth/token 换取),用于访问 /ai/** 接口 */ + token?: string; + /** 可用客服角色列表(与 token 配套使用,决定用户可选择哪些角色) */ + roles?: Array<{ id: string | number; key?: string; name?: string }>; + // === 知识库 === /** 默认知识库分类 ID */ categoryId?: number; @@ -36,9 +42,7 @@ export interface SDKConfig { position?: 'left-bottom' | 'right-bottom'; /** 主色调,默认 "#4F46E5" */ primaryColor?: string; - /** 悬浮按钮主题风格(马卡龙色系磨砂玻璃),不传则使用 primaryColor 渐变 */ - launcherTheme?: 'dream-purple' | 'mint-tech' | 'coral-peach' | 'sky-blue'; - /** 悬浮按钮图标(可传 URL 或 SVG 字符串) */ + /** 悬浮按钮图标(可传 URL 或 SVG 字符串),默认使用极光粒子动画图标 */ launcherIcon?: string; /** 是否显示清空对话按钮,默认 true */ showClear?: boolean; @@ -52,6 +56,8 @@ export interface SDKConfig { showTeaser?: boolean; /** 提示气泡文字,留空则使用 i18n 默认值 */ teaserText?: string; + /** 是否允许用户拖拽缩放窗口(右下角手柄),默认 true。移动端(≤480px)强制全屏时忽略 */ + resizable?: boolean; // === 行为配置 === /** 是否启用流式输出,默认 true */ @@ -92,6 +98,10 @@ export interface ResolvedConfig { requestDomain: string; /** 客户账号 ID → 后端 accountId */ userId?: string; + /** SDK JWT Token → 访问 /ai/** 接口的认证头 */ + token?: string; + /** 可用客服角色列表 */ + roles?: Array<{ id: string | number; key?: string; name?: string }>; /** 知识库分类 ID */ categoryId?: number; /** 是否显示知识库切换 */ @@ -106,8 +116,6 @@ export interface ResolvedConfig { position: 'left-bottom' | 'right-bottom'; /** 主色调 */ primaryColor: string; - /** 悬浮按钮主题风格 */ - launcherTheme?: 'dream-purple' | 'mint-tech' | 'coral-peach' | 'sky-blue'; /** 悬浮按钮图标 */ launcherIcon: string; /** 显示清空按钮 */ @@ -122,6 +130,8 @@ export interface ResolvedConfig { showTeaser: boolean; /** 提示气泡文字 */ teaserText: string; + /** 是否允许用户拖拽缩放窗口 */ + resizable: boolean; /** 流式输出 */ streaming: boolean; /** 是否启用 RAG 知识库检索 */ @@ -193,6 +203,7 @@ export interface ConversationSummary { chatId: string; accountId?: string; roleId?: number; + roleName?: string; messageCount?: number; lastMessageTime?: number; createdAt?: number; diff --git a/client/src/utils.ts b/client/src/utils.ts index 8f3b8fe..8e32067 100644 --- a/client/src/utils.ts +++ b/client/src/utils.ts @@ -2,15 +2,6 @@ * 工具函数模块 */ -/** 生成简短 UUID(取 crypto.randomUUID 前 8 位) */ -export function shortUuid(): string { - if (typeof crypto !== 'undefined' && crypto.randomUUID) { - return crypto.randomUUID().substring(0, 8); - } - // fallback - return Math.random().toString(36).substring(2, 10); -} - /** 生成完整 UUID */ export function uuid(): string { if (typeof crypto !== 'undefined' && crypto.randomUUID) { diff --git a/io/modelcontextprotocol/client/McpSyncClient.class b/io/modelcontextprotocol/client/McpSyncClient.class new file mode 100644 index 0000000..b42dca9 Binary files /dev/null and b/io/modelcontextprotocol/client/McpSyncClient.class differ diff --git a/pom.xml b/pom.xml index 97bfe89..3e6f72b 100644 --- a/pom.xml +++ b/pom.xml @@ -92,6 +92,12 @@ spring-ai-openai + + + org.springframework.ai + spring-ai-starter-mcp-client + + cn.hutool diff --git a/src/main/java/com/wok/supportbot/app/AssistantApp.java b/src/main/java/com/wok/supportbot/app/AssistantApp.java index 44ede25..19204fa 100644 --- a/src/main/java/com/wok/supportbot/app/AssistantApp.java +++ b/src/main/java/com/wok/supportbot/app/AssistantApp.java @@ -10,6 +10,8 @@ import com.wok.supportbot.rag.preretrieval.MultiQueryExpanderRewriter; import com.wok.supportbot.rag.preretrieval.RewriteQueryRewriter; import com.wok.supportbot.rag.preretrieval.TranslationQueryRewriter; import com.wok.supportbot.service.FaqMatchEngine; +import com.wok.supportbot.mcp.McpToolCallback; +import com.wok.supportbot.mcp.McpToolCallbackAdapter; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; @@ -23,10 +25,12 @@ import org.springframework.ai.document.Document; import org.springframework.ai.rag.advisor.RetrievalAugmentationAdvisor; import org.springframework.ai.rag.generation.augmentation.ContextualQueryAugmenter; import org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever; +import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import reactor.core.publisher.Flux; @@ -62,6 +66,13 @@ public class AssistantApp { @Resource private FaqMatchEngine faqMatchEngine; + @Resource + private McpToolCallbackAdapter mcpToolCallbackAdapter; + + /** MCP 工具开关,默认启用,可通过 application.yml 的 chat.mcp.enabled 关闭 */ + @Value("${chat.mcp.enabled:true}") + private boolean enableMcpTools; + private final ChatModelFactory chatModelFactory; private final DatabaseChatMemory chatMemory; @@ -81,13 +92,51 @@ public class AssistantApp { } private ChatClient getChatClient(String appType) { - return chatClientCache.computeIfAbsent(appType, type -> { - ChatModel chatModel = chatModelFactory.getChatModel(type); + return getChatClient(appType, enableMcpTools ? java.util.List.of("*") : null); + } + + /** + * 获取 ChatClient(支持按角色过滤 MCP 工具) + * 缓存 key 包含工具权限信息,不同角色权限缓存不同的 ChatClient 实例。 + * + * @param appType 应用类型(CHAT / RAG_REWRITE 等) + * @param allowedMcpTools 允许的 MCP 工具名列表;null 或空 = 允许所有(默认行为);["*"] = 全部 + */ + private ChatClient getChatClient(String appType, List allowedMcpTools) { + // 空列表降级为 ["*"](允许所有工具),与无参数版本行为一致 + final List effectiveTools; + if (enableMcpTools && (allowedMcpTools == null || allowedMcpTools.isEmpty())) { + effectiveTools = java.util.List.of("*"); + } else { + effectiveTools = allowedMcpTools; + } + String cacheKey = appType + ":" + (effectiveTools == null ? "none" : String.join(",", effectiveTools)); + return chatClientCache.computeIfAbsent(cacheKey, type -> { + ChatModel chatModel = chatModelFactory.getChatModel(appType); var builder = ChatClient.builder(chatModel); // 仅在系统提示词非空时设置,避免 Spring AI 的 Assert.hasText 校验抛异常 if (StringUtils.hasText(SYSTEM_PROMPT)) { builder.defaultSystem(SYSTEM_PROMPT); } + // 注册 MCP 工具(按角色权限过滤) + if (enableMcpTools && effectiveTools != null && !effectiveTools.isEmpty()) { + ToolCallback[] mcpTools = mcpToolCallbackAdapter.getFilteredToolCallbacks(effectiveTools); + if (mcpTools.length > 0) { + builder.defaultToolCallbacks(mcpTools); + log.info("✅ 已注册 {} 个 MCP 工具到 ChatClient [{}]", mcpTools.length, cacheKey); + for (ToolCallback tc : mcpTools) { + log.info(" 🔧 工具: {} — {}", tc.getToolDefinition().name(), tc.getToolDefinition().description()); + } + } else { + log.warn("⚠️ MCP 工具已启用但无可注册的工具 [{}],请检查:", cacheKey); + log.warn(" 1. 是否在「MCP 服务管理」页面添加了 MCP Server 配置?"); + log.warn(" 2. 配置是否已启用(is_active=true)?"); + log.warn(" 3. MCP Server 是否连接成功(点击「测试连接」验证)?"); + log.warn(" 4. MCP Server 是否暴露了工具(listTools 返回非空)?"); + } + } else { + log.info("ℹ️ MCP 工具未启用 [enableMcpTools={}, effectiveTools={}]", enableMcpTools, effectiveTools); + } return builder .defaultAdvisors( contentSafetyAdvisor, @@ -123,7 +172,20 @@ public class AssistantApp { * @return AI 回答 */ public String doChat(String message, String chatId, String systemPrompt) { - ChatClient.ChatClientRequestSpec spec = getChatClient("CHAT") + return doChat(message, chatId, systemPrompt, null); + } + + /** + * AI 基础对话(支持多轮对话记忆 + 角色系统提示词 + MCP 工具权限) + * + * @param message 用户消息 + * @param chatId 会话ID + * @param systemPrompt 角色人设/风格 + * @param allowedMcpTools 允许的 MCP 工具列表;null=不注册工具 + * @return AI 回答 + */ + public String doChat(String message, String chatId, String systemPrompt, List allowedMcpTools) { + ChatClient.ChatClientRequestSpec spec = getChatClient("CHAT", allowedMcpTools) .prompt() .user(message) .advisors(s -> s.param(CONVERSATION_ID, chatId)); @@ -175,6 +237,64 @@ public class AssistantApp { return spec.stream().content(); } + /** + * AI 基础对话(多轮记忆 + 角色系统提示词 + MCP 工具权限,SSE 流式传输) + * + * @param message 用户消息 + * @param chatId 会话ID + * @param systemPrompt 角色人设/风格 + * @param allowedMcpTools 允许的 MCP 工具列表;null=不注册工具 + * @return 流式回答 + */ + public Flux doChatByStream(String message, String chatId, String systemPrompt, List allowedMcpTools) { + // 重置 MCP 工具调用状态(事件收集器 + 轮次计数器) + McpToolCallback.resetEvents(); + McpToolCallback.resetCallRounds(); + + ChatClient.ChatClientRequestSpec spec = getChatClient("CHAT", allowedMcpTools) + .prompt() + .user(message) + .advisors(s -> s.param(CONVERSATION_ID, chatId)); + if (StringUtils.hasText(systemPrompt)) { + spec = spec.system(effectiveSystem(systemPrompt)); + } + return appendMcpToolEvents(spec.stream().content()); + } + + /** + * 在 SSE 文本流末尾追加 MCP 工具调用事件 + * 前端通过解析 "event: tool_call_start" / "event: tool_call_result" 行来展示工具调用过程。 + * 事件格式遵循 SSE 标准,与 readSSEStreamWithEvents 的解析逻辑匹配。 + */ + private Flux appendMcpToolEvents(Flux contentFlux) { + return contentFlux.concatMap(chunk -> Flux.just(chunk)) + .concatWith(Flux.defer(() -> { + java.util.List events = McpToolCallback.drainEvents(); + if (events.isEmpty()) { + return Flux.empty(); + } + log.info("本次对话触发了 {} 个 MCP 工具调用", events.size()); + List sseLines = new ArrayList<>(); + for (McpToolCallback.ToolCallEvent event : events) { + sseLines.add("event:tool_call_result"); + String json = String.format("{\"tool\":\"%s\",\"result\":\"%s\",\"latencyMs\":%d}", + escapeSse(event.tool()), + escapeSse(event.result()), + event.latencyMs()); + sseLines.add("data:" + json); + sseLines.add(""); // SSE 事件分隔空行 + } + return Flux.fromIterable(sseLines); + })); + } + + /** 转义 SSE 数据中的特殊字符 */ + private static String escapeSse(String s) { + if (s == null) return ""; + return s.replace("\\", "\\\\").replace("\"", "\\\"") + .replace("\n", "\\n").replace("\r", "\\r"); + } + // ==================== FAQ 优先匹配 ==================== /** @@ -278,6 +398,44 @@ public class AssistantApp { return chatResponse.getResult().getOutput().getText(); } + /** + * RAG 知识库对话(支持查询重写策略 + MCP 工具权限) + * + * @param message 用户消息 + * @param chatId 会话ID + * @param strategy 查询重写策略 + * @param categoryIds 知识库分类过滤 + * @param systemPrompt 角色人设/风格 + * @param allowedMcpTools 允许的 MCP 工具列表;null=不注册工具 + * @return AI 回答 + */ + public String doChatWithRagStrategy(String message, String chatId, String strategy, List categoryIds, + String systemPrompt, List allowedMcpTools) { + // FAQ 优先匹配 + Optional faqAnswer = tryFaqMatch(message); + if (faqAnswer.isPresent()) { + log.info("FAQ 命中,直接返回标准答案: chatId={}", chatId); + return faqAnswer.get(); + } + + if ("MULTI_QUERY".equalsIgnoreCase(strategy)) { + return doChatWithMultiQueryRag(message, chatId, categoryIds, systemPrompt, allowedMcpTools); + } + + String rewrittenMessage = rewriteQuery(message, chatId, strategy); + + ChatClient.ChatClientRequestSpec spec = getChatClient("CHAT", allowedMcpTools) + .prompt() + .user(rewrittenMessage) + .advisors(s -> s.param(CONVERSATION_ID, chatId)) + .advisors(buildRetrievalAdvisor(4, categoryIds)); + if (StringUtils.hasText(systemPrompt)) { + spec = spec.system(effectiveSystem(systemPrompt)); + } + ChatResponse chatResponse = spec.call().chatResponse(); + return chatResponse.getResult().getOutput().getText(); + } + /** * 根据策略对查询做预检索改写(MULTI_QUERY 不走此方法)。 */ @@ -344,6 +502,49 @@ public class AssistantApp { return spec.stream().content(); } + /** + * 和 RAG 知识库进行对话(支持查询重写策略 + MCP 工具权限,SSE 流式传输) + * + * @param message 用户消息 + * @param chatId 会话ID + * @param strategy 查询重写策略 + * @param categoryIds 知识库分类过滤 + * @param systemPrompt 角色人设/风格 + * @param allowedMcpTools 允许的 MCP 工具列表;null=不注册工具 + * @return 流式回答 + */ + public Flux doChatWithRagStrategyByStream(String message, String chatId, String strategy, + List categoryIds, String systemPrompt, + List allowedMcpTools) { + // 重置 MCP 工具调用状态 + McpToolCallback.resetEvents(); + McpToolCallback.resetCallRounds(); + + // FAQ 优先匹配:命中则直接以流式形式返回标准答案 + Optional faqAnswer = tryFaqMatch(message); + if (faqAnswer.isPresent()) { + log.info("FAQ 命中(流式),直接返回标准答案: chatId={}", chatId); + return Flux.just(faqAnswer.get()); + } + + // 对于 MULTI_QUERY 策略,需要先手动检索合并再流式生成 + if ("MULTI_QUERY".equalsIgnoreCase(strategy)) { + return doChatWithMultiQueryRagByStream(message, chatId, categoryIds, systemPrompt, allowedMcpTools); + } + + String rewrittenMessage = rewriteQuery(message, chatId, strategy); + + ChatClient.ChatClientRequestSpec spec = getChatClient("CHAT", allowedMcpTools) + .prompt() + .user(rewrittenMessage) + .advisors(s -> s.param(CONVERSATION_ID, chatId)) + .advisors(buildRetrievalAdvisor(4, categoryIds)); + if (StringUtils.hasText(systemPrompt)) { + spec = spec.system(effectiveSystem(systemPrompt)); + } + return appendMcpToolEvents(spec.stream().content()); + } + /** * 使用多路查询扩展的 RAG 对话 * 将原始查询扩展为多个语义不同的查询,分别检索后按文档ID去重合并, @@ -356,8 +557,13 @@ public class AssistantApp { * @return AI 回答 */ private String doChatWithMultiQueryRag(String message, String chatId, List categoryIds, String systemPrompt) { + return doChatWithMultiQueryRag(message, chatId, categoryIds, systemPrompt, null); + } + + private String doChatWithMultiQueryRag(String message, String chatId, List categoryIds, + String systemPrompt, List allowedMcpTools) { String ragSystem = buildMultiQueryRagSystem(message, categoryIds, systemPrompt); - ChatResponse chatResponse = getChatClient("CHAT") + ChatResponse chatResponse = getChatClient("CHAT", allowedMcpTools) .prompt() .system(ragSystem) .user(message) @@ -368,14 +574,19 @@ public class AssistantApp { } private Flux doChatWithMultiQueryRagByStream(String message, String chatId, List categoryIds, String systemPrompt) { + return doChatWithMultiQueryRagByStream(message, chatId, categoryIds, systemPrompt, null); + } + + private Flux doChatWithMultiQueryRagByStream(String message, String chatId, List categoryIds, + String systemPrompt, List allowedMcpTools) { String ragSystem = buildMultiQueryRagSystem(message, categoryIds, systemPrompt); - return getChatClient("CHAT") + return appendMcpToolEvents(getChatClient("CHAT", allowedMcpTools) .prompt() .system(ragSystem) .user(message) .advisors(s -> s.param(CONVERSATION_ID, chatId)) .stream() - .content(); + .content()); } /** diff --git a/src/main/java/com/wok/supportbot/config/ChatModelFactory.java b/src/main/java/com/wok/supportbot/config/ChatModelFactory.java index e6190ef..b67b06f 100644 --- a/src/main/java/com/wok/supportbot/config/ChatModelFactory.java +++ b/src/main/java/com/wok/supportbot/config/ChatModelFactory.java @@ -354,6 +354,22 @@ public class ChatModelFactory { // ==================== F6: Fallback 故障自动切换 ==================== + /** + * 判断指定提供商是否支持 Tool Calling + * DashScope: 支持(通义千问系列) + * DeepSeek: 支持 + * OpenAI: 支持 + * 其他: 默认支持(由 API 端点自行返回错误) + * + * @param provider 提供商标识(如 dashscope、deepseek、openai 等) + * @return 是否支持 Tool Calling + */ + public boolean supportsToolCalling(String provider) { + if (provider == null) return true; + // 当前所有已支持的提供商都支持 tool calling + return true; + } + /** 共享熔断器:连续 3 次失败触发,5 分钟自动恢复 */ private final SimpleCircuitBreaker circuitBreaker = new SimpleCircuitBreaker(3, 5 * 60 * 1000L, ""); diff --git a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java index 67e832e..9cb3bca 100644 --- a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java +++ b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java @@ -8,6 +8,8 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; +import java.util.List; + /** * 数据库初始化配置 * 应用启动时检查并创建必要的表、迁移列、同步种子数据。 @@ -58,6 +60,7 @@ public class DatabaseInitConfig { safeInit("迁移 knowledge_document.content_hash 列", this::addContentHashColumn); safeInit("迁移 knowledge_document.enabled 列", this::addDocumentEnabledColumn); safeInit("迁移 knowledge_document.extra_config 列", this::addDocumentExtraConfigColumn); + safeInit("迁移 knowledge_document.file_path 列", this::addDocumentFilePathColumn); safeInit("创建客服角色表 customer_service_role", () -> { if (!checkTableExists("customer_service_role")) { @@ -86,6 +89,8 @@ public class DatabaseInitConfig { }); safeInit("迁移 conversation_session.external_account_id 列", this::addConversationSessionExternalAccountIdColumn); + safeInit("迁移 customer_service_role.allowed_mcp_tools 列", this::addRoleAllowedMcpToolsColumn); + safeInit("同步默认客服角色", this::syncDefaultCustomerServiceRoles); safeInit("同步默认客服账号", this::syncDefaultCustomerAccounts); @@ -182,12 +187,26 @@ public class DatabaseInitConfig { } }); + // ==================== MCP Server 配置 ==================== + + safeInit("创建 MCP Server 配置表 mcp_server_config", () -> { + if (!checkTableExists("mcp_server_config")) { + createMcpServerConfigTable(); + } + }); + // P0-001: 混合检索 - 为 vector_store 添加全文检索列 safeInit("初始化 vector_store 全文检索", this::initVectorStoreFullTextSearch); // 迁移 vector_store.create_time 列(Spring AI 自动建表时不包含此列) safeInit("迁移 vector_store.create_time 列", this::addVectorStoreCreateTimeColumn); + // ==================== 清理租户相关数据 ==================== + safeInit("清理租户表和 tenant_id 列", this::cleanupTenantData); + + // ==================== API Key 角色绑定 ==================== + safeInit("api_key 新增 role_ids 列", this::addApiKeyRoleIdsColumn); + // 为所有表添加注释(幂等,可重复执行) safeInit("应用数据库表注释", this::applyTableComments); @@ -220,7 +239,8 @@ public class DatabaseInitConfig { "knowledge_faq", "faq_embedding", "sys_user", "sys_role", "sys_permission", "sys_user_role", "rag_hit_log", "dashboard_snapshot", - "api_key", "webhook_config" + "api_key", "webhook_config", + "mcp_server_config" }; java.util.List missingTables = new java.util.ArrayList<>(); @@ -296,6 +316,7 @@ public class DatabaseInitConfig { source_name VARCHAR(500), file_type VARCHAR(20) NOT NULL, file_size BIGINT DEFAULT 0 NOT NULL, + file_path VARCHAR(500), content TEXT, category_id BIGINT DEFAULT 0 NOT NULL, tags JSONB DEFAULT '{}' NOT NULL, @@ -328,7 +349,6 @@ public class DatabaseInitConfig { name VARCHAR(100) NOT NULL, description TEXT, prompt TEXT, - sort_order INTEGER DEFAULT 0 NOT NULL, enabled BOOLEAN DEFAULT TRUE NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, @@ -336,7 +356,7 @@ public class DatabaseInitConfig { ) """; jdbcTemplate.execute(sql); - jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled, sort_order)"); + jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled)"); } private void createCustomerServiceRoleCategoryTable() { @@ -430,22 +450,40 @@ public class DatabaseInitConfig { log.warn("add conversation_session.external_account_id failed: {}", e.getMessage()); } } + + /** + * 为 customer_service_role 表添加 allowed_mcp_tools 列(角色 MCP 工具权限控制) + * 幂等:已有列则跳过 + */ + private void addRoleAllowedMcpToolsColumn() { + try { + String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'customer_service_role' AND column_name = 'allowed_mcp_tools'"; + Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class); + if (count != null && count == 0) { + log.info("添加 customer_service_role.allowed_mcp_tools 列"); + jdbcTemplate.execute("ALTER TABLE customer_service_role ADD COLUMN allowed_mcp_tools JSONB DEFAULT '[]'"); + } + } catch (Exception e) { + log.error("添加 customer_service_role.allowed_mcp_tools 列失败", e); + } + } + private void syncDefaultCustomerServiceRoles() { upsertDefaultRole("general", "客服", "用户咨询、业务办理、常见问题、问题受理与进度说明", """ 职责:回答用户关于业务办理、服务流程、常见问题、问题受理和进度说明的问题。 要求:优先依据知识库回答;资料不足时说明无法确认,并引导用户补充必要信息;涉及财务、行政制度细节时不要猜测,应提示转对应角色处理。 - """, 10); + """); upsertDefaultRole("finance", "财务", "付款、退款、发票、对账、报销、结算与费用规则", """ 职责:回答付款、退款、发票、对账、报销、结算、费用规则相关问题。 要求:金额、账户、票据、时间节点必须严谨;知识库没有依据时不得编造政策;需要用户提供单号、金额、日期、发票抬头等关键信息。 - """, 20); + """); upsertDefaultRole("administration", "行政", "办公制度、行政流程、资产、会议、考勤、用章、采购与后勤", """ 职责:回答办公制度、行政流程、资产、会议、考勤、入职、用章、采购、后勤等问题。 要求:优先依据公司制度和流程文件回答;涉及审批权限、特殊例外或未覆盖场景时提示按制度提交申请或联系行政负责人。 - """, 30); + """); retireObsoleteDefaultRoles(); } @@ -456,19 +494,13 @@ public class DatabaseInitConfig { upsertDefaultAccount("administration", "行政账号", "默认行政账号", "administration"); } - private void upsertDefaultRole(String roleKey, String name, String description, String prompt, int sortOrder) { + private void upsertDefaultRole(String roleKey, String name, String description, String prompt) { jdbcTemplate.update(""" - INSERT INTO customer_service_role (role_key, name, description, prompt, sort_order) - VALUES (?, ?, ?, ?, ?) + INSERT INTO customer_service_role (role_key, name, description, prompt) + VALUES (?, ?, ?, ?) ON CONFLICT (role_key) - DO UPDATE SET name = EXCLUDED.name, - description = EXCLUDED.description, - prompt = EXCLUDED.prompt, - sort_order = EXCLUDED.sort_order, - enabled = true, - is_delete = false, - update_time = CURRENT_TIMESTAMP - """, roleKey, name, description, prompt, sortOrder); + DO NOTHING + """, roleKey, name, description, prompt); } private void upsertDefaultAccount(String accountKey, String name, String description, String roleKey) { @@ -586,6 +618,22 @@ public class DatabaseInitConfig { } } + /** + * 为 knowledge_document 表添加 file_path 列(存储原始文件路径) + */ + private void addDocumentFilePathColumn() { + try { + String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'knowledge_document' AND column_name = 'file_path'"; + Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class); + if (count != null && count == 0) { + log.info("添加 knowledge_document.file_path 列"); + jdbcTemplate.execute("ALTER TABLE knowledge_document ADD COLUMN file_path VARCHAR(500)"); + } + } catch (Exception e) { + log.error("添加 knowledge_document.file_path 列失败,请手动执行: ALTER TABLE knowledge_document ADD COLUMN file_path VARCHAR(500)", e); + } + } + // ==================== P0-004: 内容安全过滤 ==================== private void createSensitiveWordTable() { @@ -1017,6 +1065,27 @@ public class DatabaseInitConfig { jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_webhook_enabled ON webhook_config (enabled) WHERE is_delete = false"); } + private void createMcpServerConfigTable() { + String sql = """ + CREATE TABLE IF NOT EXISTS mcp_server_config ( + id BIGINT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + transport_type VARCHAR(20) NOT NULL DEFAULT 'sse', + server_url VARCHAR(500), + command VARCHAR(500), + args VARCHAR(1000), + env_vars JSONB DEFAULT '{}' NOT NULL, + description VARCHAR(500), + is_active BOOLEAN DEFAULT TRUE NOT NULL, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + is_delete BOOLEAN NOT NULL DEFAULT FALSE + ) + """; + jdbcTemplate.execute(sql); + jdbcTemplate.execute("CREATE INDEX IF NOT EXISTS idx_mcp_server_config_active ON mcp_server_config (is_active) WHERE is_delete = FALSE"); + } + /** * 为所有自动创建的表添加注释(COMMENT ON)。 * 所有语句均为幂等操作,可安全重复执行。 @@ -1027,7 +1096,7 @@ public class DatabaseInitConfig { executeComment("TABLE chat_message", "聊天消息表(存储用户与 AI 助手的对话历史)"); executeComment("COLUMN chat_message.id", "主键(雪花算法生成)"); executeComment("COLUMN chat_message.conversation_id", "会话 ID(标识同一次对话)"); - executeComment("COLUMN chat_message.message_type", "消息类型: USER(用户消息) / ASSISTANT(AI回复) / SYSTEM(系统消息)"); + executeComment("COLUMN chat_message.message_type", "消息类型: USER(用户消息) / ASSISTANT(AI回复,可能含toolCalls) / SYSTEM(系统消息) / TOOL(MCP工具调用响应)"); executeComment("COLUMN chat_message.content", "消息内容(实际对话文本)"); executeComment("COLUMN chat_message.metadata", "元数据(JSON 格式,存储额外信息)"); executeComment("COLUMN chat_message.create_time", "创建时间"); @@ -1061,6 +1130,7 @@ public class DatabaseInitConfig { executeComment("COLUMN knowledge_document.content_hash", "内容 SHA-256 哈希值(用于文档去重)"); executeComment("COLUMN knowledge_document.enabled", "是否启用: TRUE=参与RAG检索, FALSE=禁用(不参与检索但保留数据)"); executeComment("COLUMN knowledge_document.extra_config", "分块参数配置(JSONB),存储 per-doc 的 chunkSize/overlap 等"); + executeComment("COLUMN knowledge_document.file_path", "原始文件存储路径(相对于存储根目录的相对路径)"); executeComment("COLUMN knowledge_document.create_time", "创建时间"); executeComment("COLUMN knowledge_document.update_time", "更新时间"); executeComment("COLUMN knowledge_document.is_delete", "逻辑删除: FALSE=正常 TRUE=已删除"); @@ -1072,11 +1142,11 @@ public class DatabaseInitConfig { executeComment("COLUMN customer_service_role.name", "角色名称"); executeComment("COLUMN customer_service_role.description", "角色描述"); executeComment("COLUMN customer_service_role.prompt", "系统提示词(角色人设与行为规范)"); - executeComment("COLUMN customer_service_role.sort_order", "排序权重"); executeComment("COLUMN customer_service_role.enabled", "是否启用"); executeComment("COLUMN customer_service_role.create_time", "创建时间"); executeComment("COLUMN customer_service_role.update_time", "更新时间"); executeComment("COLUMN customer_service_role.is_delete", "逻辑删除: FALSE=正常 TRUE=已删除"); + executeComment("COLUMN customer_service_role.allowed_mcp_tools", "允许使用的 MCP 工具列表(JSONB 数组,空=不允许,[\"*\"]=全部允许)"); // ===== customer_service_role_category ===== executeComment("TABLE customer_service_role_category", "客服角色知识库关联表(角色与知识库分类的多对多关系)"); @@ -1208,6 +1278,21 @@ public class DatabaseInitConfig { // ===== webhook_config ===== executeComment("TABLE webhook_config", "Webhook 配置表(事件推送订阅)"); + // ===== mcp_server_config ===== + executeComment("TABLE mcp_server_config", "MCP Server 配置表(管理外部 MCP Server 连接配置)"); + executeComment("COLUMN mcp_server_config.id", "主键(雪花算法生成)"); + executeComment("COLUMN mcp_server_config.name", "配置名称"); + executeComment("COLUMN mcp_server_config.transport_type", "传输类型: stdio(标准输入输出) / sse(Server-Sent Events)"); + executeComment("COLUMN mcp_server_config.server_url", "SSE 模式的 MCP Server URL"); + executeComment("COLUMN mcp_server_config.command", "stdio 模式的启动命令"); + executeComment("COLUMN mcp_server_config.args", "stdio 模式的命令参数(多个用逗号分隔)"); + executeComment("COLUMN mcp_server_config.env_vars", "环境变量(JSONB 键值对)"); + executeComment("COLUMN mcp_server_config.description", "描述说明"); + executeComment("COLUMN mcp_server_config.is_active", "是否启用"); + executeComment("COLUMN mcp_server_config.create_time", "创建时间"); + executeComment("COLUMN mcp_server_config.update_time", "更新时间"); + executeComment("COLUMN mcp_server_config.is_delete", "逻辑删除: FALSE=正常 TRUE=已删除"); + // ===== ai_model_config ===== executeComment("TABLE ai_model_config", "AI 大模型配置表(管理多套模型配置,按应用类型绑定)"); executeComment("COLUMN ai_model_config.id", "主键(雪花算法生成)"); @@ -1230,6 +1315,9 @@ public class DatabaseInitConfig { // ===== chat_message.user_id ===== executeComment("COLUMN chat_message.user_id", "所属系统用户ID(数据隔离,SDK调用时为null)"); + // ===== api_key.role_ids ===== + executeComment("COLUMN api_key.role_ids", "绑定的客服角色 ID 列表(JSONB 数组,空数组=不限制,返回所有启用角色)"); + log.info("数据库表注释已应用"); } catch (Exception e) { log.warn("应用数据库表注释时出错", e); @@ -1243,4 +1331,81 @@ public class DatabaseInitConfig { jdbcTemplate.execute(String.format("COMMENT ON %s IS '%s'", target, comment.replace("'", "''"))); } + // ==================== 清理租户相关数据 ==================== + + /** + * 清理租户相关数据:删除 tenant 表、移除各表的 tenant_id 列和索引 + */ + private void cleanupTenantData() { + // 1. 删除 tenant 表 + if (checkTableExists("tenant")) { + jdbcTemplate.execute("DROP TABLE IF EXISTS tenant CASCADE"); + log.info("已删除 tenant 表"); + } + + // 2. 清理 api_key.tenant_id + if (checkTableExists("api_key")) { + try { + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_api_key_tenant_id"); + jdbcTemplate.execute("ALTER TABLE api_key DROP COLUMN IF EXISTS tenant_id"); + } catch (Exception e) { + log.debug("清理 api_key.tenant_id 跳过: {}", e.getMessage()); + } + } + + // 3. 清理 customer_service_role.tenant_id + if (checkTableExists("customer_service_role")) { + try { + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_csr_tenant_id"); + jdbcTemplate.execute("ALTER TABLE customer_service_role DROP COLUMN IF EXISTS tenant_id"); + } catch (Exception e) { + log.debug("清理 customer_service_role.tenant_id 跳过: {}", e.getMessage()); + } + } + + // 4. 清理 knowledge_category.tenant_id + if (checkTableExists("knowledge_category")) { + try { + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_kc_tenant_id"); + jdbcTemplate.execute("ALTER TABLE knowledge_category DROP COLUMN IF EXISTS tenant_id"); + } catch (Exception e) { + log.debug("清理 knowledge_category.tenant_id 跳过: {}", e.getMessage()); + } + } + + // 5. 清理 knowledge_faq.tenant_id + if (checkTableExists("knowledge_faq")) { + try { + jdbcTemplate.execute("DROP INDEX IF EXISTS idx_faq_tenant_id"); + jdbcTemplate.execute("ALTER TABLE knowledge_faq DROP COLUMN IF EXISTS tenant_id"); + } catch (Exception e) { + log.debug("清理 knowledge_faq.tenant_id 跳过: {}", e.getMessage()); + } + } + + log.info("租户相关数据清理完成"); + } + + // ==================== API Key 角色绑定 ==================== + + /** + * 为 api_key 表添加 role_ids 列(JSONB 数组,存储绑定的客服角色 ID) + */ + private void addApiKeyRoleIdsColumn() { + if (!checkTableExists("api_key")) { + log.debug("api_key 表尚未创建,跳过 role_ids 迁移"); + return; + } + try { + String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'api_key' AND column_name = 'role_ids'"; + Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class); + if (count != null && count == 0) { + log.info("添加 api_key.role_ids 列"); + jdbcTemplate.execute("ALTER TABLE api_key ADD COLUMN role_ids JSONB DEFAULT '[]' NOT NULL"); + } + } catch (Exception e) { + log.error("添加 api_key.role_ids 列失败", e); + } + } + } diff --git a/src/main/java/com/wok/supportbot/config/FileStorageConfig.java b/src/main/java/com/wok/supportbot/config/FileStorageConfig.java new file mode 100644 index 0000000..b83dac7 --- /dev/null +++ b/src/main/java/com/wok/supportbot/config/FileStorageConfig.java @@ -0,0 +1,80 @@ +package com.wok.supportbot.config; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * 文件存储配置 + * 管理上传文件的本地存储路径 + */ +@Component +@Slf4j +public class FileStorageConfig { + + @Value("${knowledge.storage.local-path:./uploads}") + private String localPath; + + private Path storageRootPath; + + @PostConstruct + public void init() { + storageRootPath = Paths.get(localPath).toAbsolutePath().normalize(); + File rootDir = storageRootPath.toFile(); + if (!rootDir.exists()) { + boolean created = rootDir.mkdirs(); + if (created) { + log.info("创建文件存储根目录: {}", storageRootPath); + } else { + log.warn("创建文件存储根目录失败: {}", storageRootPath); + } + } + log.info("文件存储路径: {}", storageRootPath); + } + + /** + * 获取存储根路径 + */ + public Path getStorageRootPath() { + return storageRootPath; + } + + /** + * 获取指定文件的完整路径 + * + * @param relativePath 相对路径(如 "2024/01/xxx.docx") + */ + public Path getFilePath(String relativePath) { + return storageRootPath.resolve(relativePath).normalize(); + } + + /** + * 生成按年月组织的相对路径 + * + * @param originalFilename 原始文件名 + * @return 相对路径,如 "2024/01/uuid.docx" + */ + public String generateRelativePath(String originalFilename) { + String extension = getExtension(originalFilename); + String uniqueName = java.util.UUID.randomUUID().toString() + extension; + + // 按年月分目录 + java.time.LocalDate now = java.time.LocalDate.now(); + return String.format("%d/%02d/%s", now.getYear(), now.getMonthValue(), uniqueName); + } + + /** + * 获取文件扩展名(含点号) + */ + private String getExtension(String filename) { + if (filename == null || !filename.contains(".")) { + return ""; + } + return filename.substring(filename.lastIndexOf(".")).toLowerCase(); + } +} diff --git a/src/main/java/com/wok/supportbot/config/McpClientManager.java b/src/main/java/com/wok/supportbot/config/McpClientManager.java new file mode 100644 index 0000000..7041d8a --- /dev/null +++ b/src/main/java/com/wok/supportbot/config/McpClientManager.java @@ -0,0 +1,660 @@ +package com.wok.supportbot.config; + +import com.wok.supportbot.entity.McpServerConfig; +import com.wok.supportbot.service.McpServerConfigService; +import io.modelcontextprotocol.client.McpSyncClient; +import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport; +import io.modelcontextprotocol.client.transport.ServerParameters; +import io.modelcontextprotocol.client.transport.StdioClientTransport; +import io.modelcontextprotocol.spec.McpSchema; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.model.ModelOptionsUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.Duration; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * MCP 客户端生命周期管理器 + * 负责 MCP Client 的创建、缓存、刷新和销毁。 + *

+ * 支持两种传输模式: + * - SSE(Server-Sent Events):通过 HttpClientSseClientTransport 连接远程 MCP Server + * - stdio(标准输入输出):通过 StdioClientTransport 启动本地 MCP Server 进程 + */ +@Component +@Slf4j +public class McpClientManager { + + @Autowired + private McpServerConfigService mcpServerConfigService; + + /** + * 客户端缓存:key = 配置ID 的字符串形式,value = MCP Client 实例 + * volatile 保证 refreshAll() 双缓冲切换时的可见性 + */ + private volatile ConcurrentHashMap clientCache = new ConcurrentHashMap<>(); + + /** + * 不可用配置集合:记录已知不存在或未启用的配置ID,避免重复查询 DB + * 配置被启用或新建时需同步移除此集合中的对应条目 + */ + private final Set unavailableConfigs = ConcurrentHashMap.newKeySet(); + + /** + * 健康状态缓存:key = 配置ID 的字符串形式,value = 健康检查结果 + */ + private final ConcurrentHashMap healthCache = new ConcurrentHashMap<>(); + + /** + * MCP Server 健康状态记录 + */ + public record HealthStatus( + /** 状态:ONLINE / OFFLINE / UNKNOWN */ + String status, + /** 响应延迟(毫秒) */ + long latencyMs, + /** 最后检查时间 */ + Instant lastCheckTime, + /** 错误信息(健康时为 null) */ + String errorMessage + ) { + public static HealthStatus online(long latencyMs) { + return new HealthStatus("ONLINE", latencyMs, Instant.now(), null); + } + + public static HealthStatus offline(long latencyMs, String errorMessage) { + return new HealthStatus("OFFLINE", latencyMs, Instant.now(), errorMessage); + } + + public static HealthStatus unknown(String errorMessage) { + return new HealthStatus("UNKNOWN", 0, Instant.now(), errorMessage); + } + } + + /** + * MCP 客户端请求超时时间,支持 Duration 格式(如 30s、PT30S、60s) + */ + @Value("${mcp.client.request-timeout:30s}") + private String requestTimeoutStr; + + /** + * MCP 客户端初始化超时时间,支持 Duration 格式(如 15s、PT15S、30s) + */ + @Value("${mcp.client.init-timeout:15s}") + private String initTimeoutStr; + + /** + * 应用启动时自动加载所有已启用的 MCP Server 配置并建立连接 + * 确保第一次对话请求时 clientCache 已就绪,MCP 工具可以被注册到 ChatClient + */ + @PostConstruct + public void init() { + log.info("McpClientManager 初始化,开始加载已启用的 MCP Server 配置..."); + refreshAll(); + } + + /** + * 刷新所有 MCP 客户端连接(双缓冲策略) + * 先在新 Map 中构建所有客户端,再原子切换引用,最后关闭旧客户端。 + * 避免清空与重建之间的请求全部失败。 + */ + public void refreshAll() { + log.info("开始刷新所有 MCP 客户端连接..."); + + // 获取所有启用的配置(一次查询代替两次按类型过滤) + List allActiveConfigs = mcpServerConfigService.listAllActiveConfigs(); + + // 第一步:在全新 Map 中构建所有客户端(不影响现有缓存) + ConcurrentHashMap newCache = new ConcurrentHashMap<>(); + for (McpServerConfig config : allActiveConfigs) { + try { + McpSyncClient client = createClientDirectly(config); + if (client != null) { + newCache.put(config.getId().toString(), client); + } + } catch (Exception e) { + log.error("创建客户端失败: id={}, name={}, transportType={}, error={}", + config.getId(), config.getName(), config.getTransportType(), e.getMessage()); + } + } + + // 第二步:原子切换引用(volatile 保证其他线程立即可见) + ConcurrentHashMap oldCache = clientCache; + clientCache = newCache; + unavailableConfigs.clear(); + + // 第三步:关闭旧缓存中的客户端(不影响新请求) + for (Map.Entry entry : oldCache.entrySet()) { + try { + McpSyncClient client = entry.getValue(); + if (client != null) { + client.close(); + log.debug("已关闭旧 MCP 客户端: configId={}", entry.getKey()); + } + } catch (Exception e) { + log.error("关闭旧 MCP 客户端失败: configId={}, error={}", entry.getKey(), e.getMessage()); + } + } + + log.info("MCP 客户端刷新完成,当前缓存数量: {}", clientCache.size()); + } + + /** + * 获取指定配置的客户端(懒加载) + * 使用 computeIfAbsent 保证同一配置只创建一次客户端,避免并发竞态。 + * 如果缓存中不存在且不在不可用集合中,从 DB 读取配置后原子创建并缓存。 + * + * @param configId 配置ID + * @return MCP Client 实例,不存在或未启用返回 null + */ + public McpSyncClient getClient(Long configId) { + String key = configId.toString(); + + // 快速路径:缓存命中 + McpSyncClient cached = clientCache.get(key); + if (cached != null) { + return cached; + } + + // 快速路径:已知不可用的配置,直接跳过 + if (unavailableConfigs.contains(key)) { + return null; + } + + // 缓存未命中,使用 computeIfAbsent 保证同一 key 只创建一次客户端 + // ConcurrentHashMap.computeIfAbsent 对同一 key 加锁,避免并发线程重复创建 + // 注意:mapping function 不能返回 null(会抛 NPE),因此不可用的情况记录到 unavailableConfigs + McpServerConfig config = mcpServerConfigService.getConfigById(configId); + if (config == null) { + log.warn("MCP 配置不存在: id={}", configId); + unavailableConfigs.add(key); + return null; + } + if (!Boolean.TRUE.equals(config.getIsActive())) { + log.warn("MCP 配置未启用,跳过创建客户端: id={}, name={}", configId, config.getName()); + unavailableConfigs.add(key); + return null; + } + + // 配置存在且启用,通过 computeIfAbsent 原子创建(防止并发重复创建) + return clientCache.computeIfAbsent(key, k -> createClientDirectly(config)); + } + + /** + * 获取所有已启用的 MCP 工具描述 + * 遍历所有已缓存的客户端,调用 listTools() 获取真实的工具列表 + * + * @return 工具描述列表,每个元素包含 config_id、name、transport_type、description、tools + */ + public List> listAvailableTools() { + List> tools = new ArrayList<>(); + + log.info("🔍 listAvailableTools: clientCache 大小 = {}", clientCache.size()); + + if (clientCache.isEmpty()) { + log.warn("⚠️ clientCache 为空!MCP Server 可能未配置或连接失败。"); + log.warn(" 请检查:1) 是否添加了 MCP Server 配置 2) 配置是否已启用 3) 启动日志是否有连接错误"); + return tools; + } + + for (Map.Entry entry : clientCache.entrySet()) { + Long configId; + try { + configId = Long.parseLong(entry.getKey()); + } catch (NumberFormatException e) { + log.warn("缓存 key 格式异常: {}", entry.getKey()); + continue; + } + + McpServerConfig config = mcpServerConfigService.getConfigById(configId); + if (config == null || !Boolean.TRUE.equals(config.getIsActive())) { + continue; + } + + Map toolInfo = new LinkedHashMap<>(); + toolInfo.put("config_id", config.getId().toString()); + toolInfo.put("name", config.getName()); + toolInfo.put("transport_type", config.getTransportType()); + toolInfo.put("description", config.getDescription()); + + // 从 MCP Client 获取真实的工具列表 + List> toolList = new ArrayList<>(); + try { + McpSyncClient client = entry.getValue(); + McpSchema.ListToolsResult listToolsResult = client.listTools(); + if (listToolsResult != null && listToolsResult.tools() != null) { + log.info(" 📦 MCP Server [{}] 暴露了 {} 个工具", config.getName(), listToolsResult.tools().size()); + for (McpSchema.Tool tool : listToolsResult.tools()) { + Map toolMeta = new LinkedHashMap<>(); + toolMeta.put("name", tool.name()); + toolMeta.put("description", tool.description()); + // JsonSchema 对象序列化为 JSON 字符串,供 McpToolCallback 构建 ToolDefinition 使用 + if (tool.inputSchema() != null) { + toolMeta.put("inputSchema", ModelOptionsUtils.toJsonString(tool.inputSchema())); + } else { + toolMeta.put("inputSchema", "{}"); + } + toolList.add(toolMeta); + } + } + log.info(" 📦 MCP Server [{}] 获取到 {} 个工具", config.getName(), toolList.size()); + if (toolList.isEmpty()) { + log.warn(" ⚠️ MCP Server [{}] 未暴露任何工具,AI 模型将无法调用", config.getName()); + } + } catch (Exception e) { + log.error("获取 MCP 工具列表失败: serverId={}, name={}, error={}", + configId, config.getName(), e.getMessage()); + } + + toolInfo.put("tools", toolList); + tools.add(toolInfo); + } + + return tools; + } + + /** + * 定时健康检查:每 5 分钟执行一次 + * 遍历所有缓存的客户端,尝试 listTools() 探测连通性,记录状态到 healthCache + */ + @Scheduled(fixedDelay = 300000) + public void healthCheck() { + log.info("开始 MCP Server 定时健康检查,当前缓存数量: {}", clientCache.size()); + for (Map.Entry entry : clientCache.entrySet()) { + String key = entry.getKey(); + checkSingleClient(key, entry.getValue()); + } + log.info("MCP Server 定时健康检查完成"); + } + + /** + * 手动触发单个配置的健康检查 + * + * @param configId 配置ID + * @return 该配置的最新健康状态 + */ + public HealthStatus checkHealthForConfig(Long configId) { + String key = configId.toString(); + McpSyncClient client = clientCache.get(key); + if (client == null) { + HealthStatus status = HealthStatus.unknown("客户端未缓存或配置不存在"); + healthCache.put(key, status); + return status; + } + return checkSingleClient(key, client); + } + + /** + * 对单个客户端执行健康探测 + * 通过调用 listTools() 判断服务端是否存活 + * + * @param key 缓存 key(配置ID 字符串) + * @param client MCP 客户端实例 + * @return 健康状态 + */ + private HealthStatus checkSingleClient(String key, McpSyncClient client) { + long startTime = System.currentTimeMillis(); + try { + McpSchema.ListToolsResult result = client.listTools(); + long latencyMs = System.currentTimeMillis() - startTime; + int toolsCount = (result != null && result.tools() != null) ? result.tools().size() : 0; + HealthStatus status = HealthStatus.online(latencyMs); + healthCache.put(key, status); + log.debug("MCP Server 健康检查通过: configId={}, latencyMs={}, toolsCount={}", key, latencyMs, toolsCount); + return status; + } catch (Exception e) { + long latencyMs = System.currentTimeMillis() - startTime; + HealthStatus status = HealthStatus.offline(latencyMs, e.getMessage()); + healthCache.put(key, status); + log.warn("MCP Server 健康检查失败: configId={}, latencyMs={}, error={}", key, latencyMs, e.getMessage()); + return status; + } + } + + /** + * 获取指定配置的健康状态 + * + * @param configId 配置ID + * @return 健康状态,未检查过返回 UNKNOWN + */ + public HealthStatus getHealthStatus(Long configId) { + HealthStatus status = healthCache.get(configId.toString()); + if (status == null) { + return HealthStatus.unknown("尚未执行健康检查"); + } + return status; + } + + /** + * 获取所有已缓存配置的健康状态 + * + * @return Map:key = 配置ID 字符串,value = 健康状态 + */ + public Map getAllHealthStatus() { + Map result = new LinkedHashMap<>(); + // 遍历所有缓存的客户端,未在 healthCache 中的标记为 UNKNOWN + for (String key : clientCache.keySet()) { + HealthStatus status = healthCache.get(key); + if (status == null) { + status = HealthStatus.unknown("尚未执行健康检查"); + } + result.put(key, status); + } + return result; + } + + /** + * 关闭所有 MCP 客户端连接 + * 在应用关闭或手动刷新时调用 + */ + @PreDestroy + public void shutdown() { + log.info("关闭所有 MCP 客户端连接,当前数量: {}", clientCache.size()); + for (Map.Entry entry : clientCache.entrySet()) { + try { + McpSyncClient client = entry.getValue(); + if (client != null) { + client.close(); + log.debug("已关闭 MCP 客户端: configId={}", entry.getKey()); + } + } catch (Exception e) { + log.error("关闭 MCP 客户端失败: configId={}, error={}", entry.getKey(), e.getMessage()); + } + } + clientCache.clear(); + unavailableConfigs.clear(); + healthCache.clear(); + log.info("所有 MCP 客户端连接已关闭"); + } + + /** + * 根据配置创建 MCP 客户端(不负责缓存,由调用方决定是否缓存) + *

+ * SSE 模式:使用 HttpClientSseClientTransport 连接远程 MCP Server + * stdio 模式:使用 StdioClientTransport 启动本地 MCP Server 进程 + * + * @param config MCP Server 配置 + * @return 创建并初始化后的客户端实例,失败返回 null + */ + private McpSyncClient createClientDirectly(McpServerConfig config) { + try { + McpSyncClient client; + + if ("sse".equals(config.getTransportType())) { + // 创建 SSE 传输层:连接远程 MCP Server + // HttpClientSseClientTransport 会自动将 /sse 作为 SSE 端点附加到 baseUri + String serverUrl = config.getServerUrl().trim(); + // 如果 URL 以 /sse 结尾,去掉后缀作为 baseUri(transport 层会自动附加) + String baseUri = serverUrl.replaceAll("/sse/?$", ""); + HttpClientSseClientTransport transport = HttpClientSseClientTransport.builder(baseUri).build(); + + client = buildSyncClient(transport); + log.info("正在初始化 SSE MCP 客户端: id={}, url={}", config.getId(), baseUri); + + } else if ("stdio".equals(config.getTransportType())) { + // 创建 stdio 传输层:启动本地 MCP Server 进程 + String command = config.getCommand().trim(); + + // 解析参数列表(逗号分隔) + List argsList = new ArrayList<>(); + if (config.getArgs() != null && !config.getArgs().trim().isEmpty()) { + argsList = Arrays.asList(config.getArgs().split("\\s*,\\s*")); + } + + // 构建 ServerParameters + ServerParameters.Builder paramsBuilder = ServerParameters.builder(command); + if (!argsList.isEmpty()) { + paramsBuilder.args(argsList); + } + + // 环境变量(Map -> Map) + if (config.getEnvVars() != null && !config.getEnvVars().isEmpty()) { + Map envStr = new HashMap<>(); + config.getEnvVars().forEach((k, v) -> envStr.put(k, v != null ? v.toString() : "")); + paramsBuilder.env(envStr); + } + + StdioClientTransport transport = new StdioClientTransport(paramsBuilder.build()); + client = buildSyncClient(transport); + log.info("正在初始化 stdio MCP 客户端: id={}, command={}", config.getId(), command); + + } else { + log.error("不支持的传输类型: {}", config.getTransportType()); + return null; + } + + // 初始化连接(握手协议) + client.initialize(); + log.info("MCP 客户端初始化成功: id={}, name={}, transportType={}", + config.getId(), config.getName(), config.getTransportType()); + + return client; + + } catch (Exception e) { + log.error("创建 MCP 客户端失败: id={}, name={}, transportType={}, error={}", + config.getId(), config.getName(), config.getTransportType(), e.getMessage(), e); + return null; + } + } + + /** + * 构建 McpSyncClient 实例 + * 统一设置客户端信息和超时参数,超时时间从配置文件读取 + * + * @param transport 传输层实例(SSE 或 stdio) + * @return 构建的 McpSyncClient + */ + private McpSyncClient buildSyncClient(io.modelcontextprotocol.spec.McpClientTransport transport) { + Duration requestTimeout = parseDuration(requestTimeoutStr, Duration.ofSeconds(30)); + Duration initTimeout = parseDuration(initTimeoutStr, Duration.ofSeconds(15)); + + return io.modelcontextprotocol.client.McpClient.sync(transport) + .clientInfo(new McpSchema.Implementation("supportbot-mcp-client", "1.0.0")) + .requestTimeout(requestTimeout) + .initializationTimeout(initTimeout) + .build(); + } + + /** + * 解析 Duration 字符串,兼容 ISO-8601 格式(PT30S)和简化格式(30s、60s) + * 解析失败时返回默认值 + * + * @param durationStr Duration 字符串 + * @param defaultValue 解析失败时的默认值 + * @return 解析后的 Duration + */ + private Duration parseDuration(String durationStr, Duration defaultValue) { + if (durationStr == null || durationStr.isBlank()) { + return defaultValue; + } + try { + // 先尝试 ISO-8601 格式(如 PT30S、PT1M30S) + return Duration.parse(durationStr.trim()); + } catch (Exception e) { + // 尝试简化格式:纯数字秒(如 "30")或带 "s" 后缀(如 "30s") + String trimmed = durationStr.trim().toLowerCase(); + String numStr = trimmed.replaceAll("[^0-9.]+$", ""); + if (!numStr.isEmpty()) { + try { + long seconds = Long.parseLong(numStr); + return Duration.ofSeconds(seconds); + } catch (NumberFormatException ignored) { + // 继续尝试小数 + } + } + log.warn("无法解析 Duration 配置 '{}',使用默认值: {}", durationStr, defaultValue); + return defaultValue; + } + } + + // ==================== 增量缓存管理(供 Controller 层 CRUD 操作使用) ==================== + + /** + * 新增配置时:创建客户端并加入缓存 + * 仅对新建的单个配置创建连接,不影响其他已有连接。 + * + * @param configId 新建配置的ID + */ + public void addClient(Long configId) { + String key = configId.toString(); + // 从不可用集合中移除(新建的配置可能之前被标记为不可用) + unavailableConfigs.remove(key); + + McpServerConfig config = mcpServerConfigService.getConfigById(configId); + if (config == null || !Boolean.TRUE.equals(config.getIsActive())) { + return; + } + McpSyncClient client = createClientDirectly(config); + if (client != null) { + clientCache.put(key, client); + log.info("增量添加 MCP 客户端: id={}, name={}", configId, config.getName()); + } + } + + /** + * 更新配置时:关闭旧客户端,重建新客户端 + * 仅对更新的单个配置重建连接,不影响其他已有连接。 + * + * @param configId 更新的配置ID + */ + public void rebuildClient(Long configId) { + String key = configId.toString(); + // 先移除旧客户端 + removeClient(configId); + + McpServerConfig config = mcpServerConfigService.getConfigById(configId); + if (config == null) { + unavailableConfigs.add(key); + return; + } + if (!Boolean.TRUE.equals(config.getIsActive())) { + unavailableConfigs.add(key); + return; + } + + unavailableConfigs.remove(key); + McpSyncClient client = createClientDirectly(config); + if (client != null) { + clientCache.put(key, client); + log.info("增量重建 MCP 客户端: id={}, name={}", configId, config.getName()); + } + } + + /** + * 禁用配置时:关闭并移除客户端,标记为不可用 + * + * @param configId 禁用的配置ID + */ + public void disableClient(Long configId) { + removeClient(configId); + unavailableConfigs.add(configId.toString()); + } + + /** + * 移除指定配置的客户端缓存 + * 配置删除或禁用时调用 + * + * @param configId 配置ID + */ + public void removeClient(Long configId) { + String key = configId.toString(); + McpSyncClient removed = clientCache.remove(key); + if (removed != null) { + try { + removed.close(); + } catch (Exception e) { + log.error("关闭被移除的 MCP 客户端失败: configId={}, error={}", configId, e.getMessage()); + } + log.info("已移除并关闭 MCP 客户端缓存: configId={}", configId); + } + } + + /** + * 测试指定配置的 MCP Server 连接 + * 创建临时客户端 -> initialize -> listTools -> close,不影响正常缓存 + * + * @param configId 配置ID + * @return 测试结果 Map:success / latencyMs / toolsCount / errorMessage + */ + public Map testConnection(Long configId) { + McpServerConfig config = mcpServerConfigService.getConfigById(configId); + if (config == null) { + Map result = new LinkedHashMap<>(); + result.put("success", false); + result.put("latencyMs", 0); + result.put("toolsCount", 0); + result.put("errorMessage", "配置不存在: id=" + configId); + return result; + } + + McpSyncClient tempClient = null; + long startTime = System.currentTimeMillis(); + try { + // 创建临时客户端(不加入缓存),复用 createClientDirectly 的传输层构建逻辑 + tempClient = createClientDirectly(config); + if (tempClient == null) { + Map result = new LinkedHashMap<>(); + result.put("success", false); + result.put("latencyMs", System.currentTimeMillis() - startTime); + result.put("toolsCount", 0); + result.put("errorMessage", "客户端创建失败,请检查配置"); + return result; + } + + // 获取工具列表 + McpSchema.ListToolsResult listToolsResult = tempClient.listTools(); + int toolsCount = (listToolsResult != null && listToolsResult.tools() != null) + ? listToolsResult.tools().size() : 0; + + long latencyMs = System.currentTimeMillis() - startTime; + log.info("MCP 连接测试成功: id={}, name={}, latencyMs={}, toolsCount={}", + configId, config.getName(), latencyMs, toolsCount); + + Map result = new LinkedHashMap<>(); + result.put("success", true); + result.put("latencyMs", latencyMs); + result.put("toolsCount", toolsCount); + result.put("errorMessage", null); + return result; + + } catch (Exception e) { + long latencyMs = System.currentTimeMillis() - startTime; + log.warn("MCP 连接测试失败: id={}, name={}, latencyMs={}, error={}", + configId, config.getName(), latencyMs, e.getMessage()); + + Map result = new LinkedHashMap<>(); + result.put("success", false); + result.put("latencyMs", latencyMs); + result.put("toolsCount", 0); + result.put("errorMessage", e.getMessage()); + return result; + + } finally { + // 确保关闭临时客户端 + if (tempClient != null) { + try { + tempClient.close(); + } catch (Exception e) { + log.debug("关闭临时测试客户端失败: configId={}, error={}", configId, e.getMessage()); + } + } + } + } + + /** + * 获取当前缓存的客户端数量 + * + * @return 缓存数量 + */ + public int getCacheSize() { + return clientCache.size(); + } +} diff --git a/src/main/java/com/wok/supportbot/config/McpRequestInterceptor.java b/src/main/java/com/wok/supportbot/config/McpRequestInterceptor.java new file mode 100644 index 0000000..c482c3c --- /dev/null +++ b/src/main/java/com/wok/supportbot/config/McpRequestInterceptor.java @@ -0,0 +1,24 @@ +package com.wok.supportbot.config; + +import com.wok.supportbot.mcp.McpToolCallback; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +/** + * MCP 请求拦截器 + * 在每个 HTTP 请求开始时重置 McpToolCallback 的 ThreadLocal 调用轮次计数器, + * 防止 Tomcat 线程池复用导致计数器累积,避免内存泄漏和限流失效。 + */ +@Component +@Slf4j +public class McpRequestInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + McpToolCallback.resetCallRounds(); + return true; + } +} diff --git a/src/main/java/com/wok/supportbot/config/McpWebMvcConfig.java b/src/main/java/com/wok/supportbot/config/McpWebMvcConfig.java new file mode 100644 index 0000000..95b7bfc --- /dev/null +++ b/src/main/java/com/wok/supportbot/config/McpWebMvcConfig.java @@ -0,0 +1,24 @@ +package com.wok.supportbot.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * MCP 拦截器注册配置 + * 将 McpRequestInterceptor 注册到所有请求路径, + * 确保每次请求开始时重置 MCP 工具调用轮次计数器。 + */ +@Configuration +public class McpWebMvcConfig implements WebMvcConfigurer { + + @Autowired + private McpRequestInterceptor mcpRequestInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(mcpRequestInterceptor) + .addPathPatterns("/**"); + } +} diff --git a/src/main/java/com/wok/supportbot/controller/AiController.java b/src/main/java/com/wok/supportbot/controller/AiController.java index f8cbf0b..e1aece0 100644 --- a/src/main/java/com/wok/supportbot/controller/AiController.java +++ b/src/main/java/com/wok/supportbot/controller/AiController.java @@ -61,7 +61,8 @@ public class AiController { AccountRoleContext context = resolveAccountRole(accountId, roleId); bindConversation(chatId, context); RoleScope scope = customerServiceRoleService.getRoleScope(context.roleId()); - return assistantApp.doChat(message, chatId, resolveSystemPrompt(scope, systemPrompt)); + String result = assistantApp.doChat(message, chatId, resolveSystemPrompt(scope, systemPrompt), scope.allowedMcpTools()); + return result; } /** @@ -77,7 +78,7 @@ public class AiController { AccountRoleContext context = resolveAccountRole(accountId, roleId); bindConversation(chatId, context); RoleScope scope = customerServiceRoleService.getRoleScope(context.roleId()); - return assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt)); + return assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt), scope.allowedMcpTools()); } /** @@ -93,7 +94,7 @@ public class AiController { AccountRoleContext context = resolveAccountRole(accountId, roleId); bindConversation(chatId, context); RoleScope scope = customerServiceRoleService.getRoleScope(context.roleId()); - return assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt)) + return assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt), scope.allowedMcpTools()) .map(chunk -> ServerSentEvent.builder() .data(chunk) .build()); @@ -115,7 +116,7 @@ public class AiController { // 创建一个超时时间较长的 SseEmitter SseEmitter sseEmitter = new SseEmitter(180000L); // 3 分钟超时 // 获取 Flux 响应式数据流并且直接通过订阅推送给 SseEmitter - assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt)) + assistantApp.doChatByStream(message, chatId, resolveSystemPrompt(scope, systemPrompt), scope.allowedMcpTools()) .subscribe(chunk -> { try { sseEmitter.send(chunk); @@ -147,12 +148,12 @@ public class AiController { String sys = resolveSystemPrompt(scope, systemPrompt); // 严格隔离:未授权任何知识库的角色退回普通对话,绝不检索 KB if (isKbDenied(scope) || shouldBypassKnowledgeRetrieval(message)) { - return assistantApp.doChat(message, chatId, sys); + return assistantApp.doChat(message, chatId, sys, scope.allowedMcpTools()); } try { return assistantApp.doChatWithRagStrategy( message, chatId, normalizeStrategy(rewriteStrategy), - resolveCategoryIds(scope, categoryId, categoryIds), sys); + resolveCategoryIds(scope, categoryId, categoryIds), sys, scope.allowedMcpTools()); } catch (Exception e) { log.error("RAG 对话失败 [strategy={}, chatId={}]: {}", rewriteStrategy, chatId, e.getMessage(), e); return "抱歉,知识库检索出现异常,请稍后重试。"; @@ -179,11 +180,11 @@ public class AiController { String sys = resolveSystemPrompt(scope, systemPrompt); // 严格隔离:未授权任何知识库的角色退回普通流式对话,绝不检索 KB if (isKbDenied(scope) || shouldBypassKnowledgeRetrieval(message)) { - return assistantApp.doChatByStream(message, chatId, sys); + return assistantApp.doChatByStream(message, chatId, sys, scope.allowedMcpTools()); } return assistantApp.doChatWithRagStrategyByStream( message, chatId, normalizeStrategy(rewriteStrategy), - resolveCategoryIds(scope, categoryId, categoryIds), sys); + resolveCategoryIds(scope, categoryId, categoryIds), sys, scope.allowedMcpTools()); } /** diff --git a/src/main/java/com/wok/supportbot/controller/ApiKeyController.java b/src/main/java/com/wok/supportbot/controller/ApiKeyController.java index 6fa8d73..1c8eee0 100644 --- a/src/main/java/com/wok/supportbot/controller/ApiKeyController.java +++ b/src/main/java/com/wok/supportbot/controller/ApiKeyController.java @@ -13,11 +13,13 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.Objects; /** * API Key 管理接口 - * 提供 API Key 的创建、吊销、启用、删除、分页查询等操作。 + * 提供 API Key 的创建、吊销、启用、删除、分页查询、角色绑定等操作。 */ @Slf4j @RestController @@ -61,7 +63,7 @@ public class ApiKeyController { /** * 创建 API Key * - * @param body 请求体,包含 name, description, rateLimit, maxCalls, expireTime + * @param body 请求体,包含 name, description, rateLimit, maxCalls, expireTime, roleIds(可选) */ @PostMapping @PreAuthorize("hasRole('admin')") @@ -102,6 +104,13 @@ public class ApiKeyController { Long userId = (currentUser != null) ? currentUser.getId() : null; ApiKey apiKey = apiKeyService.generateKey(userId, name, description, rateLimit, maxCalls, expireTime); + + // 绑定角色(可选) + if (body.containsKey("roleIds")) { + List roleIds = parseRoleIds(body.get("roleIds")); + apiKeyService.updateKeyRoles(apiKey.getId(), roleIds); + } + return ResponseEntity.ok(Map.of( "success", true, "message", "创建成功", @@ -198,4 +207,50 @@ public class ApiKeyController { )); } } + + /** + * 更新 API Key 绑定的客服角色 + * 空数组表示不限制(返回所有启用角色) + */ + @PutMapping("/{id}/roles") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> updateRoles( + @PathVariable Long id, + @RequestBody Map body) { + try { + List roleIds = parseRoleIds(body.get("roleIds")); + apiKeyService.updateKeyRoles(id, roleIds); + return ResponseEntity.ok(Map.of( + "success", true, + "message", "角色绑定更新成功" + )); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", e.getMessage() + )); + } catch (Exception e) { + log.error("更新 API Key 角色绑定失败", e); + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "更新失败:" + e.getMessage() + )); + } + } + + /** + * 解析请求体中的 roleIds 列表 + */ + @SuppressWarnings("unchecked") + private List parseRoleIds(Object raw) { + if (!(raw instanceof List list)) { + return List.of(); + } + return list.stream() + .filter(Objects::nonNull) + .map(item -> item instanceof Number n ? n.longValue() : Long.parseLong(item.toString())) + .filter(id -> id > 0) + .distinct() + .toList(); + } } diff --git a/src/main/java/com/wok/supportbot/controller/AuthController.java b/src/main/java/com/wok/supportbot/controller/AuthController.java new file mode 100644 index 0000000..e20f60e --- /dev/null +++ b/src/main/java/com/wok/supportbot/controller/AuthController.java @@ -0,0 +1,127 @@ +package com.wok.supportbot.controller; + +import com.wok.supportbot.entity.ApiKey; +import com.wok.supportbot.security.SdkJwtTokenProvider; +import com.wok.supportbot.service.ApiKeyService; +import com.wok.supportbot.service.CustomerServiceRoleService; +import com.wok.supportbot.service.CustomerServiceRoleService.RoleBrief; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * SDK 认证控制器 + * 提供 Token 换取接口,客户后端用 API Key 换取 SDK JWT Token + 角色列表。 + *

+ * 路径在 /open-api/ 下,请求首先由 ApiKeyAuthFilter 校验 X-API-Key, + * 校验通过后 ApiKey 信息存入 request.attribute("apiKey"),本控制器直接使用。 + *

+ * 角色来源: 优先使用 API Key 绑定的角色列表(role_ids), + * 未绑定时返回所有启用角色(向后兼容)。 + */ +@Slf4j +@RestController("sdkAuthController") +@RequestMapping("/open-api/auth") +public class AuthController { + + private final CustomerServiceRoleService roleService; + private final SdkJwtTokenProvider sdkJwtTokenProvider; + private final ApiKeyService apiKeyService; + + public AuthController(CustomerServiceRoleService roleService, + SdkJwtTokenProvider sdkJwtTokenProvider, + ApiKeyService apiKeyService) { + this.roleService = roleService; + this.sdkJwtTokenProvider = sdkJwtTokenProvider; + this.apiKeyService = apiKeyService; + } + + /** + * Token 换取接口 + *

+ * 前置条件: ApiKeyAuthFilter 已校验 X-API-Key,存入 request.attribute("apiKey") + *

+ * 返回: SDK JWT Token、过期时间(秒)、可用角色列表 + * + * @param request HTTP 请求(含已鉴权的 API Key 信息) + * @param body 请求体(可选,支持自定义 ttl 秒数) + * @return {token, expiresIn, roles[]} + */ + @PostMapping("/token") + public ResponseEntity getToken(HttpServletRequest request, + @RequestBody(required = false) TokenRequest body) { + // 1. 获取已鉴权的 API Key(由 ApiKeyAuthFilter 注入) + ApiKey apiKey = (ApiKey) request.getAttribute("apiKey"); + if (apiKey == null) { + return ResponseEntity.status(401).body(Map.of( + "success", false, + "message", "API Key 鉴权失败" + )); + } + + // 2. 读取 API Key 绑定的角色列表 + List boundRoleIds = apiKeyService.parseRoleIds(apiKey); + + // 3. 查询角色:有绑定则用绑定列表,否则返回所有启用角色(向后兼容) + List roles; + if (!boundRoleIds.isEmpty()) { + roles = roleService.listRolesByIds(boundRoleIds); + } else { + roles = roleService.listEnabledRolesBrief(); + } + if (roles.isEmpty()) { + return ResponseEntity.status(403).body(Map.of( + "success", false, + "message", "无可用客服角色" + )); + } + + List roleIds = roles.stream() + .map(RoleBrief::id) + .collect(Collectors.toList()); + + // 4. 计算过期时间(默认 2 小时,钳制到 [5min, 24h]) + long ttlMs = 7200000L; + if (body != null && body.ttl() != null) { + ttlMs = Math.max(body.ttl() * 1000L, 300000L); + ttlMs = Math.min(ttlMs, 86400000L); + } + + // 5. 签发 SDK JWT(subject = apiKeyId) + String token = sdkJwtTokenProvider.generateToken( + apiKey.getId().toString(), + SdkJwtTokenProvider.maskApiKey(apiKey.getKeyValue()), + roleIds, + ttlMs + ); + + // 6. 返回 Token + 角色列表 + log.info("SDK Token 签发成功: apiKeyId={}, roleCount={}", apiKey.getId(), roles.size()); + return ResponseEntity.ok(Map.of( + "success", true, + "token", token, + "expiresIn", ttlMs / 1000, + "roles", roles.stream().map(r -> Map.of( + "id", r.id().toString(), + "key", r.roleKey(), + "name", r.name() + )).collect(Collectors.toList()) + )); + } + + /** + * 请求体 DTO + * + * @param ttl 期望的 Token 有效期(秒),会被钳制到 [300, 86400] + */ + public record TokenRequest(Long ttl) { + } +} diff --git a/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java b/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java index abc8439..51bcf31 100644 --- a/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java +++ b/src/main/java/com/wok/supportbot/controller/CustomerServiceRoleController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -27,7 +28,7 @@ public class CustomerServiceRoleController { public ResponseEntity> listRoles() { return ResponseEntity.ok(Map.of( "success", true, - "data", customerServiceRoleService.listRoles() + "data", customerServiceRoleService.listRoles(false) )); } @@ -49,7 +50,7 @@ public class CustomerServiceRoleController { try { customerServiceRoleService.createRole( str(body.get("roleKey")), str(body.get("name")), str(body.get("description")), - str(body.get("prompt")), intOrNull(body.get("sortOrder")), boolOrNull(body.get("enabled"))); + str(body.get("prompt")), boolOrNull(body.get("enabled"))); return ResponseEntity.ok(Map.of("success", true, "message", "角色创建成功")); } catch (Exception e) { return ResponseEntity.status(500).body(Map.of("success", false, "message", "创建角色失败:" + e.getMessage())); @@ -62,7 +63,7 @@ public class CustomerServiceRoleController { try { customerServiceRoleService.updateRole(roleId, str(body.get("name")), str(body.get("description")), str(body.get("prompt")), - intOrNull(body.get("sortOrder")), boolOrNull(body.get("enabled"))); + boolOrNull(body.get("enabled"))); return ResponseEntity.ok(Map.of("success", true, "message", "角色更新成功")); } catch (Exception e) { return ResponseEntity.status(500).body(Map.of("success", false, "message", "更新角色失败:" + e.getMessage())); @@ -93,6 +94,35 @@ public class CustomerServiceRoleController { )); } + /** + * 更新角色的 MCP 工具权限。 + * body: { "allowedMcpTools": ["*"] } 或 { "allowedMcpTools": ["mcp_get_weather", "mcp_query_db"] } + */ + @SuppressWarnings("unchecked") + @PutMapping("/role/{id}/mcp-tools") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> updateRoleMcpTools( + @PathVariable("id") Long roleId, + @RequestBody Map body) { + try { + Object raw = body.get("allowedMcpTools"); + List allowedMcpTools; + if (raw instanceof List list) { + allowedMcpTools = list.stream() + .filter(Objects::nonNull) + .map(Objects::toString) + .distinct() + .toList(); + } else { + allowedMcpTools = List.of(); + } + customerServiceRoleService.updateRoleMcpTools(roleId, allowedMcpTools); + return ResponseEntity.ok(Map.of("success", true, "message", "MCP 工具权限更新成功")); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of("success", false, "message", "更新失败:" + e.getMessage())); + } + } + private List parseCategoryIds(Object rawCategoryIds) { if (!(rawCategoryIds instanceof List list)) { return List.of(); diff --git a/src/main/java/com/wok/supportbot/controller/DocumentController.java b/src/main/java/com/wok/supportbot/controller/DocumentController.java index f20c301..96bba92 100644 --- a/src/main/java/com/wok/supportbot/controller/DocumentController.java +++ b/src/main/java/com/wok/supportbot/controller/DocumentController.java @@ -250,6 +250,42 @@ public class DocumentController { // ==================== 文档管理 ==================== + /** + * 下载文档的原始文件 + * + * @param id 文档ID + */ + @GetMapping("/document/download/{id}") + @PreAuthorize("hasAnyRole('admin','kb_operator')") + public ResponseEntity downloadDocument(@PathVariable("id") Long id) { + try { + var entry = documentService.getDocumentFile(id); + java.io.File file = entry.getKey(); + String originalFilename = entry.getValue(); + + // 使用 RFC 5987 编码中文文件名,兼容所有浏览器 + String encodedFilename = java.net.URLEncoder.encode( + originalFilename, java.nio.charset.StandardCharsets.UTF_8) + .replace("+", "%20"); + + // 设置响应头 + org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders(); + headers.setContentType(org.springframework.http.MediaType.APPLICATION_OCTET_STREAM); + headers.set(org.springframework.http.HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + encodedFilename + "\"; filename*=UTF-8''" + encodedFilename); + headers.setContentLength(file.length()); + + return ResponseEntity.ok() + .headers(headers) + .body(new org.springframework.core.io.FileSystemResource(file)); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "下载失败:" + e.getMessage() + )); + } + } + /** * 查询文档列表(分页 + 过滤 + 关键词搜索 + 标签筛选) * diff --git a/src/main/java/com/wok/supportbot/controller/McpServerConfigController.java b/src/main/java/com/wok/supportbot/controller/McpServerConfigController.java new file mode 100644 index 0000000..cb717bd --- /dev/null +++ b/src/main/java/com/wok/supportbot/controller/McpServerConfigController.java @@ -0,0 +1,348 @@ +package com.wok.supportbot.controller; + +import com.wok.supportbot.config.McpClientManager; +import com.wok.supportbot.entity.McpServerConfig; +import com.wok.supportbot.service.McpServerConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * MCP Server 配置管理控制器 + * 提供 MCP Server 配置的增删改查、启用/禁用、连接测试、缓存刷新等 API + */ +@RestController +@Slf4j +public class McpServerConfigController { + + @Autowired + private McpServerConfigService mcpServerConfigService; + + @Autowired + private McpClientManager mcpClientManager; + + // ==================== 分页列表 ==================== + + /** + * 获取 MCP Server 配置列表(分页) + * + * @param page 页码(默认1) + * @param size 每页大小(默认10) + * @return 分页配置列表 + */ + @GetMapping("/mcp-server/list") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> listConfigs( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "10") int size) { + try { + Map result = mcpServerConfigService.listConfigs(page, size); + Map data = new LinkedHashMap<>(); + data.put("success", true); + data.put("data", result.get("records")); + data.put("total", result.get("total")); + data.put("page", result.get("page")); + data.put("size", result.get("size")); + data.put("pages", result.get("pages")); + return ResponseEntity.ok(data); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "查询失败:" + e.getMessage() + )); + } + } + + // ==================== 单条详情 ==================== + + /** + * 获取单条 MCP Server 配置详情 + * + * @param id 配置ID + * @return 配置详情 + */ + @GetMapping("/mcp-server/{id}") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> getConfigDetail(@PathVariable("id") Long id) { + try { + Map config = mcpServerConfigService.getConfigDetail(id); + if (config == null) { + return ResponseEntity.status(404).body(Map.of( + "success", false, + "message", "配置不存在" + )); + } + return ResponseEntity.ok(Map.of( + "success", true, + "data", config + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "查询失败:" + e.getMessage() + )); + } + } + + // ==================== 新建配置 ==================== + + /** + * 新建 MCP Server 配置 + * + * @param config 配置对象 + * @return 创建结果 + */ + @PostMapping("/mcp-server") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> createConfig(@RequestBody McpServerConfig config) { + try { + Map created = mcpServerConfigService.createConfig(config); + // 增量操作:仅为新建配置创建客户端,不影响其他已有连接 + Object idObj = created.get("id"); + if (idObj != null) { + try { + mcpClientManager.addClient(Long.parseLong(idObj.toString())); + } catch (Exception e) { + log.warn("新建配置后创建客户端失败(不影响配置保存): {}", e.getMessage()); + } + } + return ResponseEntity.ok(Map.of( + "success", true, + "data", created, + "message", "配置创建成功" + )); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", e.getMessage() + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "创建失败:" + e.getMessage() + )); + } + } + + // ==================== 更新配置 ==================== + + /** + * 更新 MCP Server 配置 + * + * @param id 配置ID + * @param config 更新内容 + * @return 更新结果 + */ + @PutMapping("/mcp-server/{id}") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> updateConfig( + @PathVariable("id") Long id, + @RequestBody McpServerConfig config) { + try { + Map updated = mcpServerConfigService.updateConfig(id, config); + // 增量操作:仅重建更新的配置客户端,不影响其他已有连接 + mcpClientManager.rebuildClient(id); + return ResponseEntity.ok(Map.of( + "success", true, + "data", updated, + "message", "配置更新成功" + )); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", e.getMessage() + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "更新失败:" + e.getMessage() + )); + } + } + + // ==================== 删除配置 ==================== + + /** + * 删除 MCP Server 配置(逻辑删除) + * + * @param id 配置ID + * @return 删除结果 + */ + @DeleteMapping("/mcp-server/{id}") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> deleteConfig(@PathVariable("id") Long id) { + try { + mcpServerConfigService.deleteConfig(id); + // 增量操作:仅移除被删除的配置客户端,不影响其他已有连接 + mcpClientManager.removeClient(id); + return ResponseEntity.ok(Map.of( + "success", true, + "message", "配置删除成功" + )); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", e.getMessage() + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "删除失败:" + e.getMessage() + )); + } + } + + // ==================== 启用/禁用 ==================== + + /** + * 切换配置启用/禁用状态 + * + * @param id 配置ID + * @param body 请求体:{active: true/false} + * @return 操作结果 + */ + @PutMapping("/mcp-server/{id}/toggle") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> toggleActive( + @PathVariable("id") Long id, + @RequestBody Map body) { + try { + Boolean active = body.get("active"); + if (active == null) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", "active 参数不能为空" + )); + } + mcpServerConfigService.toggleActive(id, active); + // 增量操作:启用时重建客户端,禁用时移除客户端 + if (active) { + mcpClientManager.rebuildClient(id); + } else { + mcpClientManager.disableClient(id); + } + return ResponseEntity.ok(Map.of( + "success", true, + "message", active ? "配置已启用" : "配置已禁用" + )); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().body(Map.of( + "success", false, + "message", e.getMessage() + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "操作失败:" + e.getMessage() + )); + } + } + + // ==================== 测试连接 ==================== + + /** + * 测试 MCP Server 连接 + * 创建临时客户端进行握手 + 工具列表查询,不影响正常缓存 + * + * @param id 配置ID + * @return 测试结果(success / latencyMs / toolsCount / errorMessage) + */ + @PostMapping("/mcp-server/{id}/test") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> testConnection(@PathVariable("id") Long id) { + try { + Map result = mcpClientManager.testConnection(id); + return ResponseEntity.ok(result); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "测试失败:" + e.getMessage() + )); + } + } + + // ==================== 刷新连接 ==================== + + /** + * 刷新所有 MCP 客户端连接 + * 清空现有缓存并重新建立所有已启用配置的客户端连接 + * + * @return 刷新结果 + */ + @PostMapping("/mcp-server/refresh") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> refreshAll() { + try { + mcpClientManager.refreshAll(); + return ResponseEntity.ok(Map.of( + "success", true, + "message", "MCP 客户端连接已刷新" + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "刷新失败:" + e.getMessage() + )); + } + } + + // ==================== 健康检查 ==================== + + /** + * 获取所有 MCP Server 的健康状态 + * 返回各配置的在线/离线状态、延迟、最后检查时间等信息 + * + * @return 所有 MCP Server 的健康状态 + */ + @GetMapping("/mcp-server/health") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> getAllHealthStatus() { + try { + Map healthMap = mcpClientManager.getAllHealthStatus(); + Map data = new LinkedHashMap<>(); + data.put("success", true); + data.put("data", healthMap); + return ResponseEntity.ok(data); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "获取健康状态失败:" + e.getMessage() + )); + } + } + + /** + * 手动触发单个 MCP Server 的健康检查 + * 对指定配置的客户端执行 listTools 探测,返回最新健康状态 + * + * @param id 配置ID + * @return 该配置的健康状态 + */ + @PostMapping("/mcp-server/{id}/health-check") + @PreAuthorize("hasRole('admin')") + public ResponseEntity> checkSingleHealth(@PathVariable("id") Long id) { + try { + McpClientManager.HealthStatus status = mcpClientManager.checkHealthForConfig(id); + return ResponseEntity.ok(Map.of( + "success", true, + "data", Map.of( + "configId", id.toString(), + "status", status.status(), + "latencyMs", status.latencyMs(), + "lastCheckTime", status.lastCheckTime().toString(), + "errorMessage", status.errorMessage() != null ? status.errorMessage() : "" + ) + )); + } catch (Exception e) { + return ResponseEntity.status(500).body(Map.of( + "success", false, + "message", "健康检查失败:" + e.getMessage() + )); + } + } +} diff --git a/src/main/java/com/wok/supportbot/converter/MessageConverter.java b/src/main/java/com/wok/supportbot/converter/MessageConverter.java index 84e3a22..d4b93b8 100644 --- a/src/main/java/com/wok/supportbot/converter/MessageConverter.java +++ b/src/main/java/com/wok/supportbot/converter/MessageConverter.java @@ -3,42 +3,136 @@ package com.wok.supportbot.converter; import com.wok.supportbot.entity.ChatMessage; import org.springframework.ai.chat.messages.*; -import java.util.List; -import java.util.Map; +import java.util.*; /** - * @Classname MessageConverter - * @Description - * @Version 1.0.0 - * @Date 2025/06/28 13:30 - * @Author lyx + * 消息转换器:Message <-> ChatMessage + * 支持 USER / ASSISTANT / SYSTEM / TOOL 四种消息类型 + * 其中 ASSISTANT 的 toolCalls 和 TOOL 的 responses 通过 metadata JSONB 字段持久化 */ public class MessageConverter { + /** metadata 中存储 toolCalls 的内部键名 */ + private static final String META_KEY_TOOL_CALLS = "_toolCalls"; + /** metadata 中存储 toolResponses 的内部键名 */ + private static final String META_KEY_TOOL_RESPONSES = "_toolResponses"; + /** - * 将 Message 转换为 ChatMessage + * 将 Spring AI Message 转换为数据库实体 ChatMessage + * 对于 ASSISTANT 消息,如果包含 toolCalls 则序列化到 metadata + * 对于 TOOL 消息,将 responses 序列化到 metadata */ public static ChatMessage toChatMessage(Message message, String conversationId) { + Map metadata = message.getMetadata() != null + ? new HashMap<>(message.getMetadata()) + : new HashMap<>(); + + // 处理 AssistantMessage 的 toolCalls + if (message instanceof AssistantMessage assistant && assistant.hasToolCalls()) { + List> toolCallsJson = new ArrayList<>(); + for (AssistantMessage.ToolCall tc : assistant.getToolCalls()) { + Map tcMap = new LinkedHashMap<>(); + tcMap.put("id", tc.id()); + tcMap.put("type", tc.type()); + tcMap.put("name", tc.name()); + tcMap.put("arguments", tc.arguments()); + toolCallsJson.add(tcMap); + } + metadata.put(META_KEY_TOOL_CALLS, toolCallsJson); + } + + // 处理 ToolResponseMessage 的 responses + if (message instanceof ToolResponseMessage trm) { + List> responsesJson = new ArrayList<>(); + for (ToolResponseMessage.ToolResponse tr : trm.getResponses()) { + Map trMap = new LinkedHashMap<>(); + trMap.put("id", tr.id()); + trMap.put("name", tr.name()); + trMap.put("responseData", tr.responseData()); + responsesJson.add(trMap); + } + metadata.put(META_KEY_TOOL_RESPONSES, responsesJson); + } + return ChatMessage.builder() .conversationId(conversationId) .messageType(message.getMessageType()) .content(message.getText()) - .metadata(message.getMetadata()) + .metadata(metadata) .build(); } /** - * 将 ChatMessage 转换为 Message + * 将数据库实体 ChatMessage 转换为 Spring AI Message + * 根据 messageType 分发到具体子类,反序列化 toolCalls / responses */ + @SuppressWarnings("unchecked") public static Message toMessage(ChatMessage chatMessage) { MessageType messageType = chatMessage.getMessageType(); String text = chatMessage.getContent(); Map metadata = chatMessage.getMetadata(); + + // 构建不含内部键的干净 metadata(供 Message 对象使用) + Map cleanMetadata = metadata != null + ? new HashMap<>(metadata) + : new HashMap<>(); + return switch (messageType) { case USER -> new UserMessage(text); - case ASSISTANT -> new AssistantMessage(text, metadata); + case ASSISTANT -> { + List toolCalls = extractToolCalls(cleanMetadata); + yield new AssistantMessage(text, cleanMetadata, toolCalls); + } case SYSTEM -> new SystemMessage(text); - case TOOL -> new ToolResponseMessage(List.of(), metadata); + case TOOL -> { + List responses = extractToolResponses(cleanMetadata); + yield new ToolResponseMessage(responses, cleanMetadata); + } }; } + + /** + * 从 metadata 中提取并移除 _toolCalls 键,反序列化为 ToolCall 列表 + */ + @SuppressWarnings("unchecked") + private static List extractToolCalls(Map metadata) { + Object raw = metadata.remove(META_KEY_TOOL_CALLS); + if (!(raw instanceof List list) || list.isEmpty()) { + return List.of(); + } + List result = new ArrayList<>(); + for (Object item : list) { + if (item instanceof Map) { + Map map = (Map) item; + String id = String.valueOf(map.getOrDefault("id", "")); + String type = String.valueOf(map.getOrDefault("type", "function")); + String name = String.valueOf(map.getOrDefault("name", "")); + String arguments = String.valueOf(map.getOrDefault("arguments", "{}")); + result.add(new AssistantMessage.ToolCall(id, type, name, arguments)); + } + } + return result; + } + + /** + * 从 metadata 中提取并移除 _toolResponses 键,反序列化为 ToolResponse 列表 + */ + @SuppressWarnings("unchecked") + private static List extractToolResponses(Map metadata) { + Object raw = metadata.remove(META_KEY_TOOL_RESPONSES); + if (!(raw instanceof List list) || list.isEmpty()) { + return List.of(); + } + List result = new ArrayList<>(); + for (Object item : list) { + if (item instanceof Map) { + Map map = (Map) item; + String id = String.valueOf(map.getOrDefault("id", "")); + String name = String.valueOf(map.getOrDefault("name", "")); + String responseData = String.valueOf(map.getOrDefault("responseData", "")); + result.add(new ToolResponseMessage.ToolResponse(id, name, responseData)); + } + } + return result; + } } diff --git a/src/main/java/com/wok/supportbot/dao/McpServerConfigMapper.java b/src/main/java/com/wok/supportbot/dao/McpServerConfigMapper.java new file mode 100644 index 0000000..da2c003 --- /dev/null +++ b/src/main/java/com/wok/supportbot/dao/McpServerConfigMapper.java @@ -0,0 +1,12 @@ +package com.wok.supportbot.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wok.supportbot.entity.McpServerConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * MCP Server 配置 Mapper - 继承 MyBatis Plus BaseMapper,自带 CRUD + */ +@Mapper +public interface McpServerConfigMapper extends BaseMapper { +} diff --git a/src/main/java/com/wok/supportbot/document/extract/JsonDocumentLoader.java b/src/main/java/com/wok/supportbot/document/extract/JsonDocumentLoader.java index 3fcdcd7..a9712aa 100644 --- a/src/main/java/com/wok/supportbot/document/extract/JsonDocumentLoader.java +++ b/src/main/java/com/wok/supportbot/document/extract/JsonDocumentLoader.java @@ -16,6 +16,37 @@ import java.util.List; @Slf4j public class JsonDocumentLoader { + // ==================== 从已保存的 File 加载 ==================== + + /** + * 基本读取方式(从文件) + */ + public List loadBasicJsonFromFile(File file) { + Resource resource = new FileSystemResource(file); + JsonReader reader = new JsonReader(resource); + return reader.get(); + } + + /** + * 指定字段读取方式(从文件) + */ + public List loadJsonByFieldsFromFile(File file, String... fields) { + Resource resource = new FileSystemResource(file); + JsonReader reader = new JsonReader(resource, fields); + return reader.get(); + } + + /** + * 使用 JSON Pointer 提取数组路径内容(从文件) + */ + public List loadJsonByPointerFromFile(File file, String pointer) { + Resource resource = new FileSystemResource(file); + JsonReader reader = new JsonReader(resource); + return reader.get(pointer); + } + + // ==================== 从 MultipartFile 加载(兼容旧接口) ==================== + /** * 基本读取方式 */ @@ -26,7 +57,7 @@ public class JsonDocumentLoader { } /** - * 指定字段读取方式(例如 description、features 字段) + * 指定字段读取方式 */ public List loadJsonByFields(MultipartFile file, String... fields) { Resource resource = toResource(file); @@ -35,7 +66,7 @@ public class JsonDocumentLoader { } /** - * 使用 JSON Pointer 提取数组路径内容(如 /items) + * 使用 JSON Pointer 提取数组路径内容 */ public List loadJsonByPointer(MultipartFile file, String pointer) { Resource resource = toResource(file); diff --git a/src/main/java/com/wok/supportbot/document/extract/MarkdownDocumentLoader.java b/src/main/java/com/wok/supportbot/document/extract/MarkdownDocumentLoader.java index e981088..707c6db 100644 --- a/src/main/java/com/wok/supportbot/document/extract/MarkdownDocumentLoader.java +++ b/src/main/java/com/wok/supportbot/document/extract/MarkdownDocumentLoader.java @@ -20,14 +20,38 @@ import java.util.List; @Slf4j public class MarkdownDocumentLoader { - public List loadMarkdownFromFile(MultipartFile file) { + /** + * 从已保存的文件加载 Markdown + */ + public List loadMarkdownFromFile(File file) { + try { + Resource resource = new FileSystemResource(file); + + MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder() + .withHorizontalRuleCreateDocument(true) + .withIncludeCodeBlock(false) + .withIncludeBlockquote(false) + .withAdditionalMetadata("filename", file.getName()) + .build(); + + MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config); + return reader.get(); + + } catch (Exception e) { + log.error("Markdown 文件解析失败", e); + throw new RuntimeException("Markdown 文件解析失败", e); + } + } + + /** + * 从 MultipartFile 加载 Markdown(兼容旧接口) + */ + public List loadMarkdownFromMultipartFile(MultipartFile file) { try { - // 将 MultipartFile 保存为临时文件 File temp = File.createTempFile("upload-", file.getOriginalFilename()); file.transferTo(temp); Resource resource = new FileSystemResource(temp); - // 配置文档解析 MarkdownDocumentReaderConfig config = MarkdownDocumentReaderConfig.builder() .withHorizontalRuleCreateDocument(true) .withIncludeCodeBlock(false) @@ -35,9 +59,12 @@ public class MarkdownDocumentLoader { .withAdditionalMetadata("filename", file.getOriginalFilename()) .build(); - // 读取文档内容 MarkdownDocumentReader reader = new MarkdownDocumentReader(resource, config); - return reader.get(); + List docs = reader.get(); + + // 清理临时文件 + temp.delete(); + return docs; } catch (IOException e) { log.error("Markdown 文件解析失败", e); diff --git a/src/main/java/com/wok/supportbot/document/extract/TikaDocumentReader.java b/src/main/java/com/wok/supportbot/document/extract/TikaDocumentReader.java index 7ee7d2c..d1ff34c 100644 --- a/src/main/java/com/wok/supportbot/document/extract/TikaDocumentReader.java +++ b/src/main/java/com/wok/supportbot/document/extract/TikaDocumentReader.java @@ -19,15 +19,34 @@ import java.util.UUID; @Slf4j public class TikaDocumentReader { - public List read(MultipartFile file) { + /** + * 从已保存的文件解析内容 + */ + public List readFromFile(File file) { try { - // MultipartFile 转 Resource - File tempFile = File.createTempFile("upload-", file.getOriginalFilename()); - file.transferTo(tempFile); - Resource resource = new FileSystemResource(tempFile); + Tika tika = new Tika(); + String text = tika.parseToString(new java.io.FileInputStream(file)); + + Document doc = Document.builder() + .id(UUID.randomUUID().toString()) + .text(text) + .build(); + + return Collections.singletonList(doc); + + } catch (IOException | TikaException e) { + log.error("Tika 文件解析失败", e); + throw new RuntimeException("Tika 文件解析失败", e); + } + } + /** + * 从 MultipartFile 解析内容(兼容旧接口) + */ + public List read(MultipartFile file) { + try { Tika tika = new Tika(); - String text = tika.parseToString(resource.getInputStream()); + String text = tika.parseToString(file.getInputStream()); Document doc = Document.builder() .id(UUID.randomUUID().toString()) @@ -41,4 +60,14 @@ public class TikaDocumentReader { throw new RuntimeException("Tika 文件解析失败", e); } } + + /** + * 获取文件扩展名(含点号),如 ".pptx"。无扩展名时返回 ".tmp" + */ + private String getExtension(String filename) { + if (filename == null || !filename.contains(".")) { + return ".tmp"; + } + return filename.substring(filename.lastIndexOf(".")); + } } diff --git a/src/main/java/com/wok/supportbot/entity/ApiKey.java b/src/main/java/com/wok/supportbot/entity/ApiKey.java index e97f9b4..9ea2c04 100644 --- a/src/main/java/com/wok/supportbot/entity/ApiKey.java +++ b/src/main/java/com/wok/supportbot/entity/ApiKey.java @@ -60,6 +60,10 @@ public class ApiKey implements Serializable { @TableField("current_calls") private Long currentCalls; + /** 绑定的客服角色 ID 列表(JSON 字符串,如 "[1,2,3]";空数组 "[]" 表示不限制) */ + @TableField("role_ids") + private String roleIds; + /** 过期时间(null 表示永不过期) */ @TableField("expire_time") private Date expireTime; diff --git a/src/main/java/com/wok/supportbot/entity/KnowledgeDocument.java b/src/main/java/com/wok/supportbot/entity/KnowledgeDocument.java index a889a93..e927c12 100644 --- a/src/main/java/com/wok/supportbot/entity/KnowledgeDocument.java +++ b/src/main/java/com/wok/supportbot/entity/KnowledgeDocument.java @@ -56,6 +56,12 @@ public class KnowledgeDocument implements Serializable { @TableField("file_size") private Long fileSize; + /** + * 原始文件存储路径(相对路径) + */ + @TableField("file_path") + private String filePath; + /** * 原文内容(截断预览) */ diff --git a/src/main/java/com/wok/supportbot/entity/McpServerConfig.java b/src/main/java/com/wok/supportbot/entity/McpServerConfig.java new file mode 100644 index 0000000..6abf8c9 --- /dev/null +++ b/src/main/java/com/wok/supportbot/entity/McpServerConfig.java @@ -0,0 +1,104 @@ +package com.wok.supportbot.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.wok.supportbot.handler.PostgresJsonTypeHandler; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +/** + * MCP Server 配置表 - 管理外部 MCP Server 连接,支持 stdio 和 sse 两种传输模式 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "mcp_server_config", autoResultMap = true) +public class McpServerConfig implements Serializable { + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + /** + * 主键ID(雪花算法) + */ + @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** + * 配置名称(如"天气查询服务") + */ + @TableField("name") + private String name; + + /** + * 传输类型: stdio(标准输入输出)/ sse(Server-Sent Events) + */ + @TableField("transport_type") + private String transportType; + + /** + * SSE 模式的 MCP Server URL + */ + @TableField("server_url") + private String serverUrl; + + /** + * stdio 模式的启动命令 + */ + @TableField("command") + private String command; + + /** + * stdio 模式的命令参数(多个用逗号分隔) + */ + @TableField("args") + private String args; + + /** + * 环境变量(JSONB,键值对形式) + */ + @TableField(value = "env_vars", typeHandler = PostgresJsonTypeHandler.class) + private Map envVars; + + /** + * 描述说明 + */ + @TableField("description") + private String description; + + /** + * 是否启用 + */ + @TableField("is_active") + private Boolean isActive; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 删除标志 - false:未删除, true:已删除(逻辑删除) + */ + @TableField("is_delete") + @TableLogic + private boolean isDelete; +} diff --git a/src/main/java/com/wok/supportbot/mcp/McpToolCallback.java b/src/main/java/com/wok/supportbot/mcp/McpToolCallback.java new file mode 100644 index 0000000..2351c40 --- /dev/null +++ b/src/main/java/com/wok/supportbot/mcp/McpToolCallback.java @@ -0,0 +1,265 @@ +package com.wok.supportbot.mcp; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.wok.supportbot.config.McpClientManager; +import io.modelcontextprotocol.client.McpSyncClient; +import io.modelcontextprotocol.spec.McpSchema; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.model.ModelOptionsUtils; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.ai.tool.definition.DefaultToolDefinition; +import org.springframework.ai.tool.definition.ToolDefinition; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * MCP Tool -> Spring AI ToolCallback 适配器 + * 将单个 MCP Server 暴露的工具适配为 Spring AI 可调用的 ToolCallback。 + *

+ * 工作流程: + * 1. ChatClient 在对话时通过 getToolDefinition() 获取工具元数据(名称、描述、参数 Schema) + * 2. 当 AI 模型决定调用该工具时,Spring AI 框架自动调用 call() 方法 + * 3. call() 内部通过 McpClientManager 获取对应的 MCP Client,转发调用到远程 MCP Server + * 4. 工具调用事件通过 ThreadLocal 收集器记录,供 SSE 流式输出使用 + */ +@Slf4j +public class McpToolCallback implements ToolCallback { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + // ==================== 工具调用事件收集 ==================== + + /** + * 工具调用事件记录 + */ + public record ToolCallEvent(String tool, String input, String result, long latencyMs, boolean error) {} + + /** + * 线程级事件收集器:在同一请求线程中收集所有工具调用事件 + * SSE 流式输出完成后,从这里取出事件发送给前端 + */ + private static final ThreadLocal> EVENTS = ThreadLocal.withInitial(ArrayList::new); + + /** + * 获取当前线程收集的所有工具调用事件,并清空收集器 + */ + public static List drainEvents() { + List events = EVENTS.get(); + List copy = new ArrayList<>(events); + events.clear(); + return copy; + } + + /** + * 重置事件收集器(每个新请求开始时调用) + */ + public static void resetEvents() { + EVENTS.remove(); + } + + /** + * MCP Server 配置 ID(用于路由调用到正确的 MCP Client) + */ + private final Long mcpServerConfigId; + + /** + * MCP Client Manager(用于获取实际的 MCP Client 实例) + */ + private final McpClientManager mcpClientManager; + + /** + * 工具名称(已加 mcp_ 前缀,避免与内置工具冲突) + */ + private final String toolName; + + /** + * MCP Server 上的原始工具名称(无前缀,用于发送给 MCP Server 调用) + */ + private final String originalToolName; + + /** + * 工具描述(供 AI 模型理解工具用途) + */ + private final String toolDescription; + + /** + * 工具输入参数的 JSON Schema(供 AI 模型生成合法的调用参数) + */ + private final String inputSchema; + + /** + * 单次对话请求中最大允许的调用轮次,防止无限循环调用 + */ + private final int maxCallRounds; + + /** + * 线程级调用轮次计数器,每个请求线程独立计数 + */ + private static final ThreadLocal CALL_ROUNDS = ThreadLocal.withInitial(() -> 0); + + /** + * 构造 MCP 工具适配器(含最大调用轮次限制) + * + * @param mcpServerConfigId MCP Server 配置 ID + * @param toolName 工具名称(含 mcp_ 前缀,用于 Spring AI 注册) + * @param originalToolName MCP Server 上的原始工具名称(无前缀,用于实际调用) + * @param toolDescription 工具描述 + * @param inputSchema 输入参数的 JSON Schema + * @param mcpClientManager MCP 客户端管理器 + * @param maxCallRounds 单次请求中最大允许的调用轮次 + */ + public McpToolCallback(Long mcpServerConfigId, String toolName, String originalToolName, + String toolDescription, String inputSchema, McpClientManager mcpClientManager, + int maxCallRounds) { + this.mcpServerConfigId = mcpServerConfigId; + this.toolName = toolName; + this.originalToolName = originalToolName; + this.toolDescription = toolDescription; + this.inputSchema = inputSchema; + this.mcpClientManager = mcpClientManager; + this.maxCallRounds = maxCallRounds; + } + + /** + * 构造 MCP 工具适配器(使用默认最大调用轮次 5) + */ + public McpToolCallback(Long mcpServerConfigId, String toolName, String originalToolName, + String toolDescription, String inputSchema, McpClientManager mcpClientManager) { + this(mcpServerConfigId, toolName, originalToolName, toolDescription, inputSchema, mcpClientManager, 5); + } + + /** + * 兼容旧构造方式(toolName 直接用于调用,不加前缀区分) + */ + public McpToolCallback(Long mcpServerConfigId, String toolName, String toolDescription, + String inputSchema, McpClientManager mcpClientManager) { + this(mcpServerConfigId, toolName, toolName, toolDescription, inputSchema, mcpClientManager, 5); + } + + /** + * 返回工具定义,供 Spring AI 框架注册到 ChatClient + * AI 模型通过此定义了解工具的名称、用途和参数格式 + */ + @Override + public ToolDefinition getToolDefinition() { + return DefaultToolDefinition.builder() + .name(toolName) + .description(toolDescription) + .inputSchema(inputSchema) + .build(); + } + + /** + * 执行工具调用 + * 当 AI 模型决定调用此工具时,Spring AI 框架自动调用此方法。 + * 内部通过 McpClientManager 获取对应的 MCP Client 实例, + * 将调用转发到远程 MCP Server 并返回结果。 + *

+ * 包含调用轮次限制:同一请求线程中,所有 MCP 工具的累计调用次数 + * 超过 maxCallRounds 时,返回错误 JSON 防止无限循环。 + * + * @param toolInput JSON 格式的工具输入参数 + * @return 工具执行结果(JSON 字符串形式) + */ + @Override + public String call(String toolInput) { + // 检查调用轮次是否超限 + int currentRound = CALL_ROUNDS.get(); + if (currentRound >= maxCallRounds) { + log.warn("MCP 工具调用轮次超限: tool={}, currentRound={}, maxRounds={}", + originalToolName, currentRound, maxCallRounds); + return "{\"error\": \"工具调用轮次已达上限 (" + maxCallRounds + " 次),已终止调用以防止无限循环。请优化提示词减少工具调用次数。\"}"; + } + CALL_ROUNDS.set(currentRound + 1); + + log.info("MCP 工具调用: serverId={}, tool={}, input={}, round={}/{}", + mcpServerConfigId, originalToolName, toolInput, currentRound + 1, maxCallRounds); + long startTime = System.currentTimeMillis(); + + try { + // 获取 MCP Client 实例 + McpSyncClient client = mcpClientManager.getClient(mcpServerConfigId); + if (client == null) { + log.error("MCP 客户端不可用: serverId={}, tool={}", mcpServerConfigId, originalToolName); + return "{\"error\": \"MCP Server (id=" + mcpServerConfigId + ") 客户端未就绪,请检查配置\"}"; + } + + // 解析工具输入参数:JSON 字符串 -> Map + Map arguments = OBJECT_MAPPER.readValue(toolInput, new TypeReference<>() {}); + + // 构建 MCP 调用请求并执行 + McpSchema.CallToolRequest request = new McpSchema.CallToolRequest(originalToolName, arguments); + McpSchema.CallToolResult result = client.callTool(request); + + long latency = System.currentTimeMillis() - startTime; + log.info("MCP 工具调用完成: tool={}, latency={}ms, isError={}", + originalToolName, latency, result.isError()); + + // 收集工具调用事件(供 SSE 流式输出使用) + String resultStr = result.content() != null ? String.valueOf(result.content()) : ""; + boolean isError = result.isError() != null && result.isError(); + EVENTS.get().add(new ToolCallEvent(originalToolName, toolInput, resultStr, latency, isError)); + + // 检查是否为错误结果 + if (result.isError() != null && result.isError()) { + log.error("MCP 工具返回错误: tool={}, content={}", originalToolName, result.content()); + return "{\"error\": \"工具执行返回错误: " + + escapeJson(String.valueOf(result.content())) + "\"}"; + } + + // 将 MCP Content 列表序列化为 JSON 字符串返回给 AI 模型 + // 与官方 SyncMcpToolCallback 保持一致,使用 ModelOptionsUtils 序列化 + String resultJson = ModelOptionsUtils.toJsonString(result.content()); + log.debug("MCP 工具调用结果: tool={}, result={}", originalToolName, resultJson); + return resultJson; + + } catch (Exception e) { + long latency = System.currentTimeMillis() - startTime; + log.error("MCP 工具调用失败: tool={}, latency={}ms, error={}", originalToolName, latency, e.getMessage()); + // 记录失败事件 + EVENTS.get().add(new ToolCallEvent(originalToolName, toolInput, e.getMessage(), latency, true)); + return "{\"error\": \"" + escapeJson(e.getMessage()) + "\"}"; + } + } + + /** + * 转义字符串中的特殊字符,避免破坏 JSON 格式 + */ + private String escapeJson(String text) { + if (text == null) return "未知错误"; + return text.replace("\\", "\\\\").replace("\"", "'").replace("\n", "\\n").replace("\r", "\\r"); + } + + // ==================== Getter 方法 ==================== + + public Long getMcpServerConfigId() { + return mcpServerConfigId; + } + + public String getToolName() { + return toolName; + } + + public String getOriginalToolName() { + return originalToolName; + } + + public String getToolDescription() { + return toolDescription; + } + + public String getInputSchema() { + return inputSchema; + } + + /** + * 重置当前线程的调用轮次计数器 + * 应在每次新的对话请求开始时调用,确保轮次计数从零开始 + */ + public static void resetCallRounds() { + CALL_ROUNDS.remove(); + } +} diff --git a/src/main/java/com/wok/supportbot/mcp/McpToolCallbackAdapter.java b/src/main/java/com/wok/supportbot/mcp/McpToolCallbackAdapter.java new file mode 100644 index 0000000..510ebfa --- /dev/null +++ b/src/main/java/com/wok/supportbot/mcp/McpToolCallbackAdapter.java @@ -0,0 +1,111 @@ +package com.wok.supportbot.mcp; + +import com.wok.supportbot.config.McpClientManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * MCP 工具批量适配器 + * 从 McpClientManager 获取所有已启用的 MCP 工具描述, + * 批量转换为 Spring AI ToolCallback 列表,供 ChatClient 注册。 + *

+ * 使用方式: + *

+ *   // 注入后在 ChatClient 构建时注册所有 MCP 工具
+ *   ChatClient.builder(chatModel)
+ *       .defaultTools(mcpToolCallbackAdapter.getAllToolCallbacksAsArray())
+ *       .defaultAdvisors(...)
+ *       .build();
+ * 
+ */ +@Component +@Slf4j +public class McpToolCallbackAdapter { + + private final McpClientManager mcpClientManager; + + /** + * 单次对话请求中最大允许的 MCP 工具调用轮次,防止无限循环调用 + */ + @Value("${mcp.tools.max-call-rounds:5}") + private int maxCallRounds; + + public McpToolCallbackAdapter(McpClientManager mcpClientManager) { + this.mcpClientManager = mcpClientManager; + } + + /** + * 获取所有 MCP 工具的 ToolCallback 列表 + * 遍历所有已启用的 MCP Server,将其暴露的工具转换为 ToolCallback + * + * @return ToolCallback 列表(可能为空,但不会为 null) + */ + public List getAllToolCallbacks() { + List callbacks = new ArrayList<>(); + List> tools = mcpClientManager.listAvailableTools(); + + for (Map toolInfo : tools) { + String configId = (String) toolInfo.get("config_id"); + String serverName = (String) toolInfo.get("name"); + + @SuppressWarnings("unchecked") + List> toolList = (List>) toolInfo.get("tools"); + if (toolList == null || toolList.isEmpty()) { + log.debug("MCP Server [{}] 暂无可用工具", serverName); + continue; + } + + for (Map tool : toolList) { + String toolName = (String) tool.get("name"); + String description = (String) tool.get("description"); + String inputSchema = (String) tool.get("inputSchema"); + + // 工具名加 mcp_ 前缀,避免与内置工具冲突 + String prefixedName = "mcp_" + toolName; + McpToolCallback callback = new McpToolCallback( + Long.parseLong(configId), prefixedName, toolName, description, inputSchema, + mcpClientManager, maxCallRounds); + callbacks.add(callback); + log.debug("注册 MCP 工具: server={}, tool={}", serverName, prefixedName); + } + } + + log.info("MCP 工具适配完成,共注册 {} 个工具", callbacks.size()); + return callbacks; + } + + /** + * 获取 MCP 工具的 ToolCallback 数组(供 ChatClient.defaultTools() 使用) + * ChatClient.defaultTools() 接受 ToolCallback[] 参数,此方法提供便捷转换 + * + * @return ToolCallback 数组 + */ + public ToolCallback[] getAllToolCallbacksAsArray() { + return getAllToolCallbacks().toArray(new ToolCallback[0]); + } + + /** + * 获取指定工具名列表的 ToolCallback 数组(按角色权限过滤 MCP 工具) + * + * @param allowedTools 允许的工具名列表;["*"] 表示全部允许,其他为具体工具名列表 + * @return 过滤后的 ToolCallback 数组(可能为空数组) + */ + public ToolCallback[] getFilteredToolCallbacks(List allowedTools) { + if (allowedTools == null || allowedTools.isEmpty()) { + return new ToolCallback[0]; + } + List all = getAllToolCallbacks(); + if (allowedTools.contains("*")) { + return all.toArray(new ToolCallback[0]); + } + return all.stream() + .filter(cb -> allowedTools.contains(cb.getToolDefinition().name())) + .toArray(ToolCallback[]::new); + } +} diff --git a/src/main/java/com/wok/supportbot/mcp/SseEventBuilder.java b/src/main/java/com/wok/supportbot/mcp/SseEventBuilder.java new file mode 100644 index 0000000..814c4f9 --- /dev/null +++ b/src/main/java/com/wok/supportbot/mcp/SseEventBuilder.java @@ -0,0 +1,73 @@ +package com.wok.supportbot.mcp; + +import org.springframework.http.codec.ServerSentEvent; + +/** + * SSE 事件构建器 + * 用于在 MCP 工具调用流程中构建标准 SSE 事件, + * 让前端能区分文本内容与工具调用状态。 + * + * 事件类型: + * - message: 普通文本内容 + * - tool_call_start: 工具调用开始 + * - tool_call_result: 工具调用结果返回 + * - error: 错误信息 + */ +public class SseEventBuilder { + + /** + * 构建普通文本消息事件 + */ + public static ServerSentEvent messageEvent(String data) { + return ServerSentEvent.builder() + .event("message") + .data(data) + .build(); + } + + /** + * 构建工具调用开始事件 + */ + public static ServerSentEvent toolCallStartEvent(String toolName, String input) { + String json = String.format("{\"tool\":\"%s\",\"input\":\"%s\"}", + escapeJson(toolName), escapeJson(input)); + return ServerSentEvent.builder() + .event("tool_call_start") + .data(json) + .build(); + } + + /** + * 构建工具调用结果事件 + */ + public static ServerSentEvent toolCallResultEvent(String toolName, String result, long latencyMs) { + String json = String.format("{\"tool\":\"%s\",\"result\":\"%s\",\"latencyMs\":%d}", + escapeJson(toolName), escapeJson(result), latencyMs); + return ServerSentEvent.builder() + .event("tool_call_result") + .data(json) + .build(); + } + + /** + * 构建错误事件 + */ + public static ServerSentEvent errorEvent(String message) { + return ServerSentEvent.builder() + .event("error") + .data("{\"message\":\"" + escapeJson(message) + "\"}") + .build(); + } + + /** + * JSON 字符串转义 + */ + private static String escapeJson(String s) { + if (s == null) return ""; + return s.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} diff --git a/src/main/java/com/wok/supportbot/openapi/ApiKeyAuthFilter.java b/src/main/java/com/wok/supportbot/openapi/ApiKeyAuthFilter.java index def2000..640d816 100644 --- a/src/main/java/com/wok/supportbot/openapi/ApiKeyAuthFilter.java +++ b/src/main/java/com/wok/supportbot/openapi/ApiKeyAuthFilter.java @@ -25,7 +25,7 @@ import java.util.Map; */ @Slf4j @Component -@Order(Ordered.HIGHEST_PRECEDENCE + 1) +@Order(Ordered.HIGHEST_PRECEDENCE + 2) public class ApiKeyAuthFilter extends OncePerRequestFilter { @Autowired diff --git a/src/main/java/com/wok/supportbot/security/JwtAuthFilter.java b/src/main/java/com/wok/supportbot/security/JwtAuthFilter.java index cde4582..dc3b84b 100644 --- a/src/main/java/com/wok/supportbot/security/JwtAuthFilter.java +++ b/src/main/java/com/wok/supportbot/security/JwtAuthFilter.java @@ -33,20 +33,30 @@ public class JwtAuthFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String path = request.getRequestURI(); String token = extractToken(request); - if (StringUtils.hasText(token) && jwtTokenProvider.validateToken(token)) { - String username = jwtTokenProvider.getUsernameFromToken(token); - List roles = jwtTokenProvider.getRolesFromToken(token); + if (StringUtils.hasText(token)) { + boolean valid = jwtTokenProvider.validateToken(token); + if (valid) { + String username = jwtTokenProvider.getUsernameFromToken(token); + List roles = jwtTokenProvider.getRolesFromToken(token); - // 构建 Spring Security 权限列表(ROLE_ 前缀) - List authorities = roles.stream() - .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) - .toList(); + // 构建 Spring Security 权限列表(ROLE_ 前缀) + List authorities = roles.stream() + .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) + .toList(); - UsernamePasswordAuthenticationToken authentication = - new UsernamePasswordAuthenticationToken(username, null, authorities); - SecurityContextHolder.getContext().setAuthentication(authentication); + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken(username, null, authorities); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.debug("JWT 认证成功: path={}, user={}, roles={}", path, username, roles); + } else { + log.warn("JWT Token 验证失败: path={}, tokenPrefix={}", + path, token.length() > 10 ? token.substring(0, 10) + "..." : token); + } + } else { + log.debug("JWT 未找到 Token: path={}", path); } filterChain.doFilter(request, response); diff --git a/src/main/java/com/wok/supportbot/security/JwtTokenProvider.java b/src/main/java/com/wok/supportbot/security/JwtTokenProvider.java index dc972d4..d1330d4 100644 --- a/src/main/java/com/wok/supportbot/security/JwtTokenProvider.java +++ b/src/main/java/com/wok/supportbot/security/JwtTokenProvider.java @@ -1,6 +1,7 @@ package com.wok.supportbot.security; import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; @@ -70,6 +71,9 @@ public class JwtTokenProvider { try { parseClaims(token); return true; + } catch (ExpiredJwtException e) { + // Token 已过期,不打印堆栈 + return false; } catch (Exception e) { return false; } diff --git a/src/main/java/com/wok/supportbot/security/SdkAuthFilter.java b/src/main/java/com/wok/supportbot/security/SdkAuthFilter.java new file mode 100644 index 0000000..0f7141d --- /dev/null +++ b/src/main/java/com/wok/supportbot/security/SdkAuthFilter.java @@ -0,0 +1,124 @@ +package com.wok.supportbot.security; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.JwtException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Map; +import java.util.Set; + +/** + * SDK 鉴权过滤器 + * 拦截 /ai/** 请求,校验 SDK JWT Token。 + *

+ * 优先级高于 ApiKeyAuthFilter,在 SecurityFilterChain 之前执行。 + * 校验通过后提取 allowedRoleIds 用于角色鉴权。 + * 校验失败直接返回 401/403,请求不会到达 AiController。 + */ +@Slf4j +@Component +@Order(Ordered.HIGHEST_PRECEDENCE + 1) +public class SdkAuthFilter extends OncePerRequestFilter { + + @Autowired + private SdkJwtTokenProvider sdkJwtTokenProvider; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String path = request.getServletPath(); + // 放行 CORS 预检请求(OPTIONS 请求不需要 Token 鉴权) + if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { + return true; + } + // 仅拦截 /ai/ 路径,排除静态资源和 swagger + return !path.startsWith("/ai/"); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain chain) throws ServletException, IOException { + try { + // ① 提取 Authorization: Bearer {token} + String authHeader = request.getHeader("Authorization"); + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + writeError(response, 401, "缺少认证令牌"); + return; + } + String token = authHeader.substring(7).trim(); + if (token.isEmpty()) { + writeError(response, 401, "认证令牌为空"); + return; + } + + // ② JWT 签名验证 + ③ 过期检查 + Claims claims; + try { + claims = sdkJwtTokenProvider.parseToken(token); + } catch (ExpiredJwtException e) { + writeError(response, 401, "令牌已过期"); + return; + } catch (JwtException e) { + log.warn("SDK Token 验证失败: {}", e.getMessage()); + writeError(response, 401, "无效的认证令牌"); + return; + } + + // ④ 提取 allowedRoleIds + Set allowedRoleIds = sdkJwtTokenProvider.getAllowedRoleIds(claims); + + // ⑤ roleId ∈ allowedRoleIds 校验(仅当请求携带 roleId 参数时) + String roleIdParam = request.getParameter("roleId"); + if (roleIdParam != null && !roleIdParam.isEmpty()) { + try { + Long roleId = Long.parseLong(roleIdParam); + if (!allowedRoleIds.isEmpty() && !allowedRoleIds.contains(roleId)) { + writeError(response, 403, "无权使用该客服角色"); + return; + } + } catch (NumberFormatException e) { + writeError(response, 400, "无效的角色ID"); + return; + } + } + + chain.doFilter(request, response); + } finally { + // 预留清理点 + } + } + + /** + * 输出 JSON 格式的错误响应(与 ApiKeyAuthFilter 保持一致的格式) + * 同时添加 CORS 头,避免浏览器将鉴权失败误报为跨域错误 + */ + private void writeError(HttpServletResponse response, int status, String message) throws IOException { + response.setStatus(status); + response.setContentType("application/json;charset=UTF-8"); + // 添加 CORS 头,使浏览器能正确读取错误响应 + response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", "*"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + Map body = Map.of( + "success", false, + "message", message, + "code", status + ); + response.getWriter().write(objectMapper.writeValueAsString(body)); + } +} diff --git a/src/main/java/com/wok/supportbot/security/SdkJwtTokenProvider.java b/src/main/java/com/wok/supportbot/security/SdkJwtTokenProvider.java new file mode 100644 index 0000000..88829cb --- /dev/null +++ b/src/main/java/com/wok/supportbot/security/SdkJwtTokenProvider.java @@ -0,0 +1,149 @@ +package com.wok.supportbot.security; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.JwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.security.Keys; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * SDK 专用 JWT 令牌提供者 + * 独立于管理后台 JwtTokenProvider,使用独立密钥签发和验证 SDK Token。 + *

+ * Token 中包含: + * - sub: apiKeyId(API Key 标识) + * - ak: 脱敏后的 API Key + * - rids: 允许使用的客服角色 ID 列表 + */ +@Slf4j +@Component +public class SdkJwtTokenProvider { + + private final SecretKey key; + private final long defaultExpiration; + + /** 24 小时上限 */ + private static final long MAX_EXPIRATION = 86400000L; + /** 5 分钟下限 */ + private static final long MIN_EXPIRATION = 300000L; + + /** 默认密钥标识(禁止使用) */ + private static final String DEFAULT_SECRET = "support-bot-sdk-jwt-secret-2026-please-change"; + + public SdkJwtTokenProvider( + @Value("${jwt.sdk-secret:support-bot-sdk-jwt-secret-2026-please-change}") String sdkSecret, + @Value("${jwt.sdk-expiration:7200000}") long defaultExpiration) { + if (DEFAULT_SECRET.equals(sdkSecret)) { + log.warn("⚠️ SDK JWT 使用了默认密钥,存在安全风险!请在 application.yml 中配置 jwt.sdk-secret 为强随机字符串"); + } + this.key = Keys.hmacShaKeyFor(sdkSecret.getBytes(StandardCharsets.UTF_8)); + this.defaultExpiration = defaultExpiration; + } + + /** + * 签发 SDK JWT Token + * + * @param apiKeyId API Key 标识 + * @param maskedApiKey 脱敏后的 API Key + * @param roleIds 允许使用的客服角色 ID 列表 + * @param expirationMs 过期时间(毫秒),会被钳制到 [5min, 24h] + * @return JWT Token 字符串 + */ + public String generateToken(String apiKeyId, String maskedApiKey, List roleIds, long expirationMs) { + long clampedExpiration = clampExpiration(expirationMs); + Date now = new Date(); + return Jwts.builder() + .subject(apiKeyId) + .claim("ak", maskedApiKey) + .claim("rids", roleIds) + .issuedAt(now) + .expiration(new Date(now.getTime() + clampedExpiration)) + .signWith(key) + .compact(); + } + + /** + * 使用默认过期时间签发 SDK JWT Token + */ + public String generateToken(String apiKeyId, String maskedApiKey, List roleIds) { + return generateToken(apiKeyId, maskedApiKey, roleIds, defaultExpiration); + } + + /** + * 验证并解析 Token,返回 Claims + * + * @param token JWT Token 字符串 + * @return Claims 对象 + * @throws ExpiredJwtException Token 已过期 + * @throws JwtException Token 签名无效或格式错误 + */ + public Claims parseToken(String token) { + return Jwts.parser() + .verifyWith(key) + .build() + .parseSignedClaims(token) + .getPayload(); + } + + /** + * 验证 Token 是否有效(签名正确且未过期) + */ + public boolean validateToken(String token) { + try { + parseToken(token); + return true; + } catch (Exception e) { + return false; + } + } + + /** + * 从 Claims 中提取 apiKeyId(subject) + */ + public String getApiKeyId(Claims claims) { + return claims.getSubject(); + } + + /** + * 从 Claims 中提取允许的角色 ID 集合 + * JWT 中 rids 为 List<Integer>,需转换为 Set<Long> + */ + @SuppressWarnings("unchecked") + public Set getAllowedRoleIds(Claims claims) { + List rids = claims.get("rids", List.class); + if (rids == null) { + return Set.of(); + } + return rids.stream() + .map(r -> ((Number) r).longValue()) + .collect(Collectors.toSet()); + } + + /** + * 脱敏 API Key: sk_ab****xyz0 + * 保留前 4 位和后 4 位,中间用 **** 替代 + */ + public static String maskApiKey(String keyValue) { + if (keyValue == null || keyValue.length() < 12) { + return "****"; + } + return keyValue.substring(0, 4) + "****" + keyValue.substring(keyValue.length() - 4); + } + + /** + * 将过期时间钳制到 [5min, 24h] 范围内 + */ + private long clampExpiration(long expirationMs) { + return Math.max(MIN_EXPIRATION, Math.min(expirationMs, MAX_EXPIRATION)); + } +} diff --git a/src/main/java/com/wok/supportbot/security/SecurityConfig.java b/src/main/java/com/wok/supportbot/security/SecurityConfig.java index 264283b..3bf4b10 100644 --- a/src/main/java/com/wok/supportbot/security/SecurityConfig.java +++ b/src/main/java/com/wok/supportbot/security/SecurityConfig.java @@ -43,7 +43,10 @@ public class SecurityConfig { .sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth // ========== 公开接口(无需认证) ========== - // SDK 对话接口(方案A:不认证,SDK 直接调用) + // SDK 对话接口 + // SdkAuthFilter 作为 Servlet Filter 已在 SecurityFilterChain 之前执行, + // 校验通过时已放行,校验失败时已返回 401,不会到达此处。 + // 因此 /ai/** 保持 permitAll(),实际安全性由 SdkAuthFilter 保证。 .requestMatchers("/ai/**").permitAll() // 开放 API(由 ApiKeyAuthFilter 独立鉴权) .requestMatchers("/open-api/**").permitAll() diff --git a/src/main/java/com/wok/supportbot/service/ApiKeyService.java b/src/main/java/com/wok/supportbot/service/ApiKeyService.java index 854cb72..409fe27 100644 --- a/src/main/java/com/wok/supportbot/service/ApiKeyService.java +++ b/src/main/java/com/wok/supportbot/service/ApiKeyService.java @@ -1,6 +1,8 @@ package com.wok.supportbot.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.wok.supportbot.dao.ApiKeyMapper; import com.wok.supportbot.entity.ApiKey; import lombok.extern.slf4j.Slf4j; @@ -8,10 +10,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; +import java.util.stream.Collectors; /** * API Key 管理服务 - * 提供 API Key 的生成、查询、吊销、启用、删除、验证等功能。 + * 提供 API Key 的生成、查询、吊销、启用、删除、验证、角色绑定等功能。 */ @Slf4j @Service @@ -20,6 +23,11 @@ public class ApiKeyService { @Autowired private ApiKeyMapper apiKeyMapper; + @Autowired + private org.springframework.jdbc.core.JdbcTemplate jdbcTemplate; + + private final ObjectMapper objectMapper = new ObjectMapper(); + /** * 生成新的 API Key * @@ -54,6 +62,7 @@ public class ApiKeyService { /** * 分页查询 API Key 列表 + * 分两步查询:MyBatis Plus 读基础字段 + JdbcTemplate 读 JSONB role_ids * * @param page 页码(从1开始) * @param size 每页条数 @@ -68,6 +77,19 @@ public class ApiKeyService { listWrapper.last("LIMIT " + size + " OFFSET " + (long) (page - 1) * size); List records = apiKeyMapper.selectList(listWrapper); + // 补充读取 JSONB role_ids 字段(MyBatis Plus 无法正确读取 JSONB) + if (!records.isEmpty()) { + Map roleIdsMap = new HashMap<>(); + String ids = records.stream().map(k -> k.getId().toString()).collect(Collectors.joining(",")); + String sql = "SELECT id, COALESCE(role_ids::text, '[]') AS role_ids FROM api_key WHERE id IN (" + ids + ")"; + jdbcTemplate.query(sql, (rs) -> { + roleIdsMap.put(rs.getLong("id"), rs.getString("role_ids")); + }); + for (ApiKey key : records) { + key.setRoleIds(roleIdsMap.getOrDefault(key.getId(), "[]")); + } + } + Map result = new HashMap<>(); result.put("records", records); result.put("total", total); @@ -147,24 +169,60 @@ public class ApiKeyService { } /** - * 自增调用次数 + * 自增调用次数(SQL 原子操作,避免并发竞态) * * @param id Key ID */ public void incrementCallCount(Long id) { - // 使用 SQL 原子操作自增,避免并发问题 try { - String sql = "UPDATE api_key SET current_calls = current_calls + 1 WHERE id = ?"; - // 通过 MyBatis Plus 无法直接做原子自增,使用 updateById 兜底 - ApiKey existing = apiKeyMapper.selectById(id); - if (existing != null) { - existing.setCurrentCalls( - (existing.getCurrentCalls() != null ? existing.getCurrentCalls() : 0L) + 1 - ); - apiKeyMapper.updateById(existing); - } + jdbcTemplate.update( + "UPDATE api_key SET current_calls = current_calls + 1 WHERE id = ? AND is_delete = false", + id); } catch (Exception e) { log.warn("自增 API Key 调用次数失败: id={}", id, e); } } + + /** + * 更新 API Key 绑定的客服角色列表 + * 使用 JdbcTemplate 显式 ::jsonb 转换,避免 MyBatis-Plus 类型不匹配 + * + * @param id API Key ID + * @param roleIds 角色 ID 列表(空/null 表示不限制) + */ + public void updateKeyRoles(Long id, List roleIds) { + ApiKey existing = apiKeyMapper.selectById(id); + if (existing == null) { + throw new IllegalArgumentException("API Key 不存在,ID:" + id); + } + String json; + try { + json = objectMapper.writeValueAsString(roleIds != null ? roleIds : List.of()); + } catch (Exception e) { + json = "[]"; + } + int rows = jdbcTemplate.update( + "UPDATE api_key SET role_ids = ?::jsonb, update_time = CURRENT_TIMESTAMP WHERE id = ? AND is_delete = false", + json, id); + log.info("API Key 角色绑定已更新: id={}, roleIds={}", id, json); + } + + /** + * 解析 API Key 绑定的角色 ID 列表 + * + * @param apiKey API Key 实体 + * @return 角色 ID 列表;空数组表示不限制 + */ + public List parseRoleIds(ApiKey apiKey) { + if (apiKey == null || apiKey.getRoleIds() == null + || apiKey.getRoleIds().isBlank() || "[]".equals(apiKey.getRoleIds().trim())) { + return List.of(); + } + try { + return objectMapper.readValue(apiKey.getRoleIds(), new TypeReference>() {}); + } catch (Exception e) { + log.warn("解析 role_ids 失败: {}", apiKey.getRoleIds(), e); + return List.of(); + } + } } diff --git a/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java b/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java index 9888e52..34ce612 100644 --- a/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java +++ b/src/main/java/com/wok/supportbot/service/CustomerServiceRoleService.java @@ -1,5 +1,8 @@ package com.wok.supportbot.service; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @@ -10,13 +13,18 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; @Service +@Slf4j public class CustomerServiceRoleService { @Autowired private JdbcTemplate jdbcTemplate; + @Autowired + private ObjectMapper objectMapper; + public List> listRoles() { return listRoles(false); } @@ -25,12 +33,16 @@ public class CustomerServiceRoleService { * @param includeDisabled true=包含已停用角色(管理页用);false=仅启用角色(对话页用) */ public List> listRoles(boolean includeDisabled) { - String roleSql = "SELECT id::text AS id, role_key, name, description, prompt, sort_order, enabled " - + "FROM customer_service_role WHERE is_delete = false " - + (includeDisabled ? "" : "AND enabled = true ") - + "ORDER BY sort_order ASC, id ASC"; - List> roles = jdbcTemplate.queryForList(roleSql); + StringBuilder roleSql = new StringBuilder( + "SELECT id::text AS id, role_key, name, description, prompt, enabled, allowed_mcp_tools " + + "FROM customer_service_role WHERE is_delete = false "); + if (!includeDisabled) { + roleSql.append("AND enabled = true "); + } + roleSql.append("ORDER BY id ASC"); + List> roles = jdbcTemplate.queryForList(roleSql.toString()); + // 查询角色-分类关联 String categorySql = """ SELECT rc.role_id::text AS role_id, rc.category_id::text AS category_id, c.name AS category_name FROM customer_service_role_category rc @@ -87,7 +99,7 @@ public class CustomerServiceRoleService { * 新增角色。role_key 缺省时自动生成。 */ @Transactional(rollbackFor = Exception.class) - public void createRole(String roleKey, String name, String description, String prompt, Integer sortOrder, Boolean enabled) { + public void createRole(String roleKey, String name, String description, String prompt, Boolean enabled) { if (name == null || name.trim().isEmpty()) { throw new IllegalArgumentException("角色名称不能为空"); } @@ -95,11 +107,10 @@ public class CustomerServiceRoleService { ? "role_" + System.currentTimeMillis() : roleKey.trim(); jdbcTemplate.update(""" - INSERT INTO customer_service_role (role_key, name, description, prompt, sort_order, enabled) - VALUES (?, ?, ?, ?, ?, ?) - """, + INSERT INTO customer_service_role (role_key, name, description, prompt, enabled) + VALUES (?, ?, ?, ?, ?) + """, key, name.trim(), description, prompt, - sortOrder != null ? sortOrder : 0, enabled != null ? enabled : true); } @@ -107,7 +118,7 @@ public class CustomerServiceRoleService { * 编辑角色基本信息(不含知识库分类,分类走 {@link #updateRoleCategories})。 */ @Transactional(rollbackFor = Exception.class) - public void updateRole(Long roleId, String name, String description, String prompt, Integer sortOrder, Boolean enabled) { + public void updateRole(Long roleId, String name, String description, String prompt, Boolean enabled) { if (roleId == null || roleId <= 0) { throw new IllegalArgumentException("角色ID无效"); } @@ -116,11 +127,10 @@ public class CustomerServiceRoleService { } jdbcTemplate.update(""" UPDATE customer_service_role - SET name = ?, description = ?, prompt = ?, sort_order = ?, enabled = ?, update_time = CURRENT_TIMESTAMP + SET name = ?, description = ?, prompt = ?, enabled = ?, update_time = CURRENT_TIMESTAMP WHERE id = ? AND is_delete = false """, name.trim(), description, prompt, - sortOrder != null ? sortOrder : 0, enabled != null ? enabled : true, roleId); } @@ -137,6 +147,28 @@ public class CustomerServiceRoleService { jdbcTemplate.update("UPDATE customer_service_role_category SET is_delete = true WHERE role_id = ?", roleId); } + /** + * 更新角色的 MCP 工具权限。 + * + * @param roleId 角色ID + * @param allowedMcpTools 允许的 MCP 工具名列表;["*"]=全部允许,空/null=不允许任何工具 + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleMcpTools(Long roleId, List allowedMcpTools) { + if (roleId == null || roleId <= 0) { + throw new IllegalArgumentException("角色ID无效"); + } + String json; + try { + json = objectMapper.writeValueAsString(allowedMcpTools != null ? allowedMcpTools : List.of()); + } catch (Exception e) { + json = "[]"; + } + jdbcTemplate.update( + "UPDATE customer_service_role SET allowed_mcp_tools = ?::jsonb, update_time = CURRENT_TIMESTAMP WHERE id = ? AND is_delete = false", + json, roleId); + } + /** * 服务端解析角色的知识库范围与人设。 * 用于对话时强制约束:角色只能检索其绑定分类下的内容,由后端决定,客户端无法越权跨域。 @@ -149,7 +181,7 @@ public class CustomerServiceRoleService { return RoleScope.empty(); } List> rows = jdbcTemplate.queryForList( - "SELECT name, prompt FROM customer_service_role WHERE id = ? AND is_delete = false AND enabled = true", + "SELECT name, prompt, allowed_mcp_tools FROM customer_service_role WHERE id = ? AND is_delete = false AND enabled = true", roleId); if (rows.isEmpty()) { return RoleScope.empty(); @@ -159,22 +191,97 @@ public class CustomerServiceRoleService { List categoryIds = jdbcTemplate.queryForList( "SELECT category_id FROM customer_service_role_category WHERE role_id = ? AND is_delete = false", Long.class, roleId); - return new RoleScope(true, name, prompt, categoryIds); + // 解析 allowed_mcp_tools JSONB 字段 + List allowedMcpTools = parseAllowedMcpTools(rows.get(0).get("allowed_mcp_tools")); + return new RoleScope(true, name, prompt, categoryIds, allowedMcpTools); + } + + /** + * 解析 allowed_mcp_tools JSONB 字段为 List + * 兼容 PostgreSQL JSONB、Java List、String 等多种输入类型 + */ + private List parseAllowedMcpTools(Object raw) { + if (raw == null) { + return List.of(); + } + try { + if (raw instanceof List list) { + return list.stream().map(Objects::toString).toList(); + } + String json = raw.toString().trim(); + if (json.isEmpty() || "[]".equals(json) || "null".equals(json)) { + return List.of(); + } + return objectMapper.readValue(json, new TypeReference<>() {}); + } catch (Exception e) { + log.warn("解析 allowed_mcp_tools 失败: {}", raw, e); + return List.of(); + } + } + + /** + * 精简角色信息(Token 换取接口用) + */ + public record RoleBrief(Long id, String roleKey, String name) {} + + /** + * 查询所有启用的客服角色(精简字段) + * + * @return 精简角色信息列表 + */ + public List listEnabledRolesBrief() { + String sql = "SELECT id, role_key, name FROM customer_service_role " + + "WHERE enabled = true AND is_delete = false ORDER BY id"; + return jdbcTemplate.query(sql, (rs, i) -> new RoleBrief( + rs.getLong("id"), + rs.getString("role_key"), + rs.getString("name") + )); } /** - * 角色范围:是否命中角色、角色人设、可检索的知识库分类。 + * 根据 ID 列表查询启用的客服角色(精简字段,用于 API Key 角色绑定的 Token 换取) + * + * @param roleIds 角色 ID 列表 + * @return 精简角色信息列表 + */ + public List listRolesByIds(List roleIds) { + if (roleIds == null || roleIds.isEmpty()) { + return List.of(); + } + String placeholders = roleIds.stream().map(id -> "?").collect(Collectors.joining(",")); + String sql = "SELECT id, role_key, name FROM customer_service_role " + + "WHERE enabled = true AND is_delete = false AND id IN (" + placeholders + ") ORDER BY id"; + return jdbcTemplate.query(sql, (rs, i) -> new RoleBrief( + rs.getLong("id"), + rs.getString("role_key"), + rs.getString("name") + ), roleIds.toArray()); + } + + /** + * 角色范围:是否命中角色、角色人设、可检索的知识库分类、MCP 工具权限。 */ - public record RoleScope(boolean present, String name, String prompt, List categoryIds) { + public record RoleScope(boolean present, String name, String prompt, List categoryIds, List allowedMcpTools) { public static RoleScope empty() { - return new RoleScope(false, "", "", List.of()); + return new RoleScope(false, "", "", List.of(), List.of()); } public boolean hasRole() { return present; } + /** 是否允许使用 MCP 工具(非空即允许) */ + public boolean isMcpToolsAllowed() { + return allowedMcpTools != null && !allowedMcpTools.isEmpty(); + } + + /** 是否允许使用所有 MCP 工具(["*"] 表示全部允许) */ + public boolean isAllMcpToolsAllowed() { + return allowedMcpTools != null && allowedMcpTools.contains("*"); + } + /** * 组合角色系统提示词:当前客服角色 + 人设;都为空时返回 null(退回基础提示词)。 */ diff --git a/src/main/java/com/wok/supportbot/service/DocumentService.java b/src/main/java/com/wok/supportbot/service/DocumentService.java index aa0eb1b..b3ec335 100644 --- a/src/main/java/com/wok/supportbot/service/DocumentService.java +++ b/src/main/java/com/wok/supportbot/service/DocumentService.java @@ -73,6 +73,9 @@ public class DocumentService { @Autowired private DocumentProcessingService documentProcessingService; + @Autowired + private com.wok.supportbot.config.FileStorageConfig fileStorageConfig; + // ==================== 文档上传 ==================== /** @@ -90,13 +93,15 @@ public class DocumentService { * @param tags 标签列表 * @param chunkSize 分块大小(可选,覆盖全局配置) * @param overlap 重叠大小(可选,覆盖全局配置) + * @param filePath 原始文件存储路径(可选,null表示无原始文件) * @return 创建完成的文档记录(status=PROCESSING) */ @Transactional(rollbackFor = Exception.class) public KnowledgeDocument uploadDocument(List documents, String title, String sourceName, String fileType, Long fileSize, String content, Long categoryId, List tags, - Integer chunkSize, Integer overlap) { + Integer chunkSize, Integer overlap, + String filePath) { // 0. 内容去重检查 String contentHash = computeContentHash(content); if (contentHash != null) { @@ -117,6 +122,7 @@ public class DocumentService { .sourceName(sourceName) .fileType(fileType) .fileSize(fileSize != null ? fileSize : 0L) + .filePath(filePath) .content(content != null && content.length() > 2000 ? content.substring(0, 2000) : content) .categoryId(categoryId != null ? categoryId : 0L) .tags(tags != null ? Map.of("tags", tags) : null) @@ -138,12 +144,19 @@ public class DocumentService { } /** - * 解析文件并上传 + * 解析文件并上传(同时保存原始文件到本地) */ public KnowledgeDocument uploadFile(MultipartFile file, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { - List documents = tikaDocumentReader.read(file); + // 1. 先保存原始文件到本地磁盘(必须在解析之前,因为 transferTo 只能调用一次) + String relativePath = saveFileToLocal(file); + java.io.File savedFile = fileStorageConfig.getFilePath(relativePath).toFile(); + + // 2. 使用保存的文件进行解析(避免 MultipartFile 的临时文件问题) + List documents = tikaDocumentReader.readFromFile(savedFile); String fileType = getFileExtension(file.getOriginalFilename()); + + // 3. 创建文档记录并保存文件路径 return uploadDocument(documents, title != null ? title : file.getOriginalFilename(), file.getOriginalFilename(), @@ -151,17 +164,45 @@ public class DocumentService { file.getSize(), documents.get(0).getText(), categoryId, - tags, chunkSize, overlap); + tags, chunkSize, overlap, + relativePath); + } + + /** + * 保存上传的文件到本地磁盘 + * + * @param file 上传的文件 + * @return 相对路径 + */ + private String saveFileToLocal(MultipartFile file) { + try { + String relativePath = fileStorageConfig.generateRelativePath(file.getOriginalFilename()); + java.nio.file.Path targetPath = fileStorageConfig.getFilePath(relativePath); + + // 确保父目录存在 + java.io.File parentDir = targetPath.getParent().toFile(); + if (!parentDir.exists()) { + parentDir.mkdirs(); + } + + // 使用 transferTo 保存文件(这是唯一一次调用) + file.transferTo(targetPath.toFile()); + log.info("文件已保存到本地: {}", targetPath); + return relativePath; + } catch (java.io.IOException e) { + log.error("保存文件到本地失败", e); + throw new RuntimeException("保存文件失败: " + e.getMessage(), e); + } } /** - * 解析字符串并上传 + * 解析字符串并上传(无原始文件) */ public KnowledgeDocument uploadString(String content, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { List documents = simpleStringDocumentReader.read(content); return uploadDocument(documents, title, title, "txt", - (long) content.length(), content, categoryId, tags, chunkSize, overlap); + (long) content.length(), content, categoryId, tags, chunkSize, overlap, null); } /** @@ -169,8 +210,14 @@ public class DocumentService { */ public KnowledgeDocument uploadMarkdown(MultipartFile file, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { - List documents = markdownDocumentLoader.loadMarkdownFromFile(file); + // 1. 先保存原始文件 + String relativePath = saveFileToLocal(file); + java.io.File savedFile = fileStorageConfig.getFilePath(relativePath).toFile(); + + // 2. 使用保存的文件进行解析 + List documents = markdownDocumentLoader.loadMarkdownFromFile(savedFile); String content = documents.stream().map(Document::getText).collect(Collectors.joining("\n")); + return uploadDocument(documents, title != null ? title : file.getOriginalFilename(), file.getOriginalFilename(), @@ -178,7 +225,8 @@ public class DocumentService { file.getSize(), content, categoryId, - tags, chunkSize, overlap); + tags, chunkSize, overlap, + relativePath); } /** @@ -186,8 +234,14 @@ public class DocumentService { */ public KnowledgeDocument uploadJsonBasic(MultipartFile file, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { - List documents = jsonDocumentLoader.loadBasicJson(file); + // 1. 先保存原始文件 + String relativePath = saveFileToLocal(file); + java.io.File savedFile = fileStorageConfig.getFilePath(relativePath).toFile(); + + // 2. 使用保存的文件进行解析 + List documents = jsonDocumentLoader.loadBasicJsonFromFile(savedFile); String content = documents.stream().map(Document::getText).collect(Collectors.joining("\n")); + return uploadDocument(documents, title != null ? title : file.getOriginalFilename(), file.getOriginalFilename(), @@ -195,7 +249,8 @@ public class DocumentService { file.getSize(), content, categoryId, - tags, chunkSize, overlap); + tags, chunkSize, overlap, + relativePath); } /** @@ -204,8 +259,14 @@ public class DocumentService { public KnowledgeDocument uploadJsonFields(MultipartFile file, List fields, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { - List documents = jsonDocumentLoader.loadJsonByFields(file, fields.toArray(new String[0])); + // 1. 先保存原始文件 + String relativePath = saveFileToLocal(file); + java.io.File savedFile = fileStorageConfig.getFilePath(relativePath).toFile(); + + // 2. 使用保存的文件进行解析 + List documents = jsonDocumentLoader.loadJsonByFieldsFromFile(savedFile, fields.toArray(new String[0])); String content = documents.stream().map(Document::getText).collect(Collectors.joining("\n")); + return uploadDocument(documents, title != null ? title : file.getOriginalFilename(), file.getOriginalFilename(), @@ -213,7 +274,8 @@ public class DocumentService { file.getSize(), content, categoryId, - tags, chunkSize, overlap); + tags, chunkSize, overlap, + relativePath); } /** @@ -222,8 +284,14 @@ public class DocumentService { public KnowledgeDocument uploadJsonPointer(MultipartFile file, String pointer, String title, Long categoryId, List tags, Integer chunkSize, Integer overlap) { - List documents = jsonDocumentLoader.loadJsonByPointer(file, pointer); + // 1. 先保存原始文件 + String relativePath = saveFileToLocal(file); + java.io.File savedFile = fileStorageConfig.getFilePath(relativePath).toFile(); + + // 2. 使用保存的文件进行解析 + List documents = jsonDocumentLoader.loadJsonByPointerFromFile(savedFile, pointer); String content = documents.stream().map(Document::getText).collect(Collectors.joining("\n")); + return uploadDocument(documents, title != null ? title : file.getOriginalFilename(), file.getOriginalFilename(), @@ -231,7 +299,33 @@ public class DocumentService { file.getSize(), content, categoryId, - tags, chunkSize, overlap); + tags, chunkSize, overlap, + relativePath); + } + + // ==================== 文件下载 ==================== + + /** + * 获取文档的原始文件(用于下载) + * + * @param documentId 文档ID + * @return 文件对象和原始文件名 + */ + public java.util.Map.Entry getDocumentFile(Long documentId) { + KnowledgeDocument doc = documentMapper.selectById(documentId); + if (doc == null || doc.isDelete()) { + throw new RuntimeException("文档不存在"); + } + if (doc.getFilePath() == null || doc.getFilePath().isEmpty()) { + throw new RuntimeException("该文档无原始文件(纯文本上传)"); + } + + java.io.File file = fileStorageConfig.getFilePath(doc.getFilePath()).toFile(); + if (!file.exists()) { + throw new RuntimeException("文件不存在或已被删除"); + } + + return java.util.Map.entry(file, doc.getSourceName()); } // ==================== 文档管理 ==================== @@ -907,7 +1001,7 @@ public class DocumentService { } /** - * 创建分类 + * 创建知识库分类 */ public KnowledgeCategory createCategory(String name, String description, Long parentId, Integer sortOrder) { KnowledgeCategory category = KnowledgeCategory.builder() diff --git a/src/main/java/com/wok/supportbot/service/FaqService.java b/src/main/java/com/wok/supportbot/service/FaqService.java index 070f774..dbf5d22 100644 --- a/src/main/java/com/wok/supportbot/service/FaqService.java +++ b/src/main/java/com/wok/supportbot/service/FaqService.java @@ -259,7 +259,8 @@ public class FaqService { Map stats = new HashMap<>(); // 总 FAQ 数 - Long totalCount = faqMapper.selectCount(new QueryWrapper<>()); + QueryWrapper totalWrapper = new QueryWrapper<>(); + Long totalCount = faqMapper.selectCount(totalWrapper); stats.put("totalCount", totalCount); // 启用数 diff --git a/src/main/java/com/wok/supportbot/service/McpServerConfigService.java b/src/main/java/com/wok/supportbot/service/McpServerConfigService.java new file mode 100644 index 0000000..cb1dd4f --- /dev/null +++ b/src/main/java/com/wok/supportbot/service/McpServerConfigService.java @@ -0,0 +1,320 @@ +package com.wok.supportbot.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.wok.supportbot.dao.McpServerConfigMapper; +import com.wok.supportbot.entity.McpServerConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * MCP Server 配置管理服务 + * 提供 CRUD、启用/禁用、JSONB 字段显式持久化等功能 + */ +@Service +@Slf4j +public class McpServerConfigService { + + @Autowired + private McpServerConfigMapper mcpServerConfigMapper; + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** 复用的 JSON 序列化器,避免每次持久化都新建实例 */ + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + // ==================== 分页列表 ==================== + + /** + * 分页查询 MCP Server 配置列表 + * + * @param page 页码(从1开始) + * @param size 每页大小 + * @return 分页结果(records/total/page/size/pages) + */ + public Map listConfigs(int page, int size) { + // 查询总数 + LambdaQueryWrapper countWrapper = new LambdaQueryWrapper<>(); + Long total = mcpServerConfigMapper.selectCount(countWrapper); + if (total == null) total = 0L; + + // 查询列表(带排序和分页) + LambdaQueryWrapper listWrapper = new LambdaQueryWrapper<>(); + listWrapper.orderByDesc(McpServerConfig::getCreateTime); + listWrapper.last("LIMIT " + size + " OFFSET " + ((page - 1) * size)); + List records = mcpServerConfigMapper.selectList(listWrapper); + + // 格式化返回结果 + List> formattedRecords = new ArrayList<>(); + for (McpServerConfig record : records) { + formattedRecords.add(formatConfig(record)); + } + + Map result = new LinkedHashMap<>(); + result.put("records", formattedRecords); + result.put("total", total); + result.put("page", page); + result.put("size", size); + result.put("pages", (total + size - 1) / size); + return result; + } + + // ==================== 详情 ==================== + + /** + * 获取单条配置详情 + * + * @param id 配置ID + * @return 格式化的配置详情,不存在返回 null + */ + public Map getConfigDetail(Long id) { + McpServerConfig config = mcpServerConfigMapper.selectById(id); + if (config == null) { + return null; + } + return formatConfig(config); + } + + // ==================== 新建配置 ==================== + + /** + * 新建 MCP Server 配置 + * + * @param config 配置对象 + * @return 保存后的配置(格式化) + */ + @Transactional(rollbackFor = Exception.class) + public Map createConfig(McpServerConfig config) { + // 校验必填字段 + validateRequired(config); + + mcpServerConfigMapper.insert(config); + // JSONB 字段显式持久化,避免 MyBatis Plus typeHandler 不触发的问题 + persistEnvVars(config.getId(), config.getEnvVars()); + + log.info("新建 MCP Server 配置: name={}, transportType={}", config.getName(), config.getTransportType()); + return formatConfig(mcpServerConfigMapper.selectById(config.getId())); + } + + // ==================== 更新配置 ==================== + + /** + * 更新 MCP Server 配置 + * 使用 LambdaUpdateWrapper 显式设置所有字段(含 null), + * 避免 updateById 默认跳过 null 字段导致无法清空可选字段。 + * + * @param id 配置ID + * @param config 更新内容 + * @return 更新后的配置(格式化) + */ + @Transactional(rollbackFor = Exception.class) + public Map updateConfig(Long id, McpServerConfig config) { + McpServerConfig existing = mcpServerConfigMapper.selectById(id); + if (existing == null) { + throw new RuntimeException("配置不存在: id=" + id); + } + + // 使用 LambdaUpdateWrapper 显式设置所有字段,null 也会被写入(清空语义) + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(McpServerConfig::getId, id) + .set(McpServerConfig::getName, config.getName()) + .set(McpServerConfig::getTransportType, config.getTransportType()) + .set(McpServerConfig::getServerUrl, config.getServerUrl()) + .set(McpServerConfig::getCommand, config.getCommand()) + .set(McpServerConfig::getArgs, config.getArgs()) + .set(McpServerConfig::getDescription, config.getDescription()); + // isActive 仅在前端显式传入时更新,null 表示不修改 + if (config.getIsActive() != null) { + updateWrapper.set(McpServerConfig::getIsActive, config.getIsActive()); + } + mcpServerConfigMapper.update(null, updateWrapper); + + // JSONB 字段显式持久化(LambdaUpdateWrapper 不支持 JSONB 类型) + // null 或空 Map 均执行持久化(清空语义),与 LambdaUpdateWrapper 行为一致 + persistEnvVars(id, config.getEnvVars()); + + log.info("更新 MCP Server 配置: id={}", id); + return formatConfig(mcpServerConfigMapper.selectById(id)); + } + + // ==================== 删除配置 ==================== + + /** + * 逻辑删除 MCP Server 配置 + * + * @param id 配置ID + */ + @Transactional(rollbackFor = Exception.class) + public void deleteConfig(Long id) { + McpServerConfig config = mcpServerConfigMapper.selectById(id); + if (config == null) { + throw new RuntimeException("配置不存在: id=" + id); + } + mcpServerConfigMapper.deleteById(id); + log.info("逻辑删除 MCP Server 配置: id={}, name={}", id, config.getName()); + } + + // ==================== 启用/禁用 ==================== + + /** + * 切换配置启用状态 + * + * @param id 配置ID + * @param active 是否启用 + */ + @Transactional(rollbackFor = Exception.class) + public void toggleActive(Long id, boolean active) { + McpServerConfig config = mcpServerConfigMapper.selectById(id); + if (config == null) { + throw new RuntimeException("配置不存在: id=" + id); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(McpServerConfig::getId, id) + .set(McpServerConfig::getIsActive, active); + mcpServerConfigMapper.update(null, updateWrapper); + + log.info("切换 MCP Server 配置状态: id={}, name={}, active={}", id, config.getName(), active); + } + + // ==================== 活跃配置查询 ==================== + + /** + * 获取所有启用的 SSE 类型配置 + * 供 McpClientManager 建立 SSE 连接使用 + * + * @return SSE 类型的活跃配置列表 + */ + public List listActiveSseConfigs() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(McpServerConfig::getIsActive, true) + .eq(McpServerConfig::getTransportType, "sse"); + return mcpServerConfigMapper.selectList(wrapper); + } + + /** + * 获取所有启用的 stdio 类型配置 + * 供 McpClientManager 启动 stdio 进程使用 + * + * @return stdio 类型的活跃配置列表 + */ + public List listActiveStdioConfigs() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(McpServerConfig::getIsActive, true) + .eq(McpServerConfig::getTransportType, "stdio"); + return mcpServerConfigMapper.selectList(wrapper); + } + + /** + * 根据 ID 获取配置(含完整字段,仅供内部使用) + * + * @param id 配置ID + * @return 原始配置对象,不存在返回 null + */ + public McpServerConfig getConfigById(Long id) { + return mcpServerConfigMapper.selectById(id); + } + + /** + * 获取所有启用的配置(不区分传输类型) + * 供 McpClientManager.refreshAll() 一次查询获取所有活跃配置 + * + * @return 所有启用的配置列表 + */ + public List listAllActiveConfigs() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(McpServerConfig::getIsActive, true); + return mcpServerConfigMapper.selectList(wrapper); + } + + // ==================== 工具方法 ==================== + + /** + * 校验必填字段 + * + * @param config 配置对象 + */ + private void validateRequired(McpServerConfig config) { + if (config.getName() == null || config.getName().trim().isEmpty()) { + throw new IllegalArgumentException("配置名称不能为空"); + } + if (config.getTransportType() == null || config.getTransportType().trim().isEmpty()) { + throw new IllegalArgumentException("传输类型不能为空"); + } + // 根据传输类型校验对应必填字段 + switch (config.getTransportType()) { + case "sse": + if (config.getServerUrl() == null || config.getServerUrl().trim().isEmpty()) { + throw new IllegalArgumentException("SSE 模式下服务地址不能为空"); + } + break; + case "stdio": + if (config.getCommand() == null || config.getCommand().trim().isEmpty()) { + throw new IllegalArgumentException("stdio 模式下启动命令不能为空"); + } + break; + default: + throw new IllegalArgumentException("不支持的传输类型: " + config.getTransportType()); + } + } + + /** + * 格式化配置为前端返回格式 + * 雪花 ID 转字符串、时间格式化 + * + * @param config 原始配置 + * @return 格式化后的 Map + */ + private Map formatConfig(McpServerConfig config) { + Map formatted = new LinkedHashMap<>(); + // 雪花 ID 必须转为字符串,避免 JS 精度丢失 + formatted.put("id", config.getId().toString()); + formatted.put("name", config.getName()); + formatted.put("transport_type", config.getTransportType()); + formatted.put("server_url", config.getServerUrl()); + formatted.put("command", config.getCommand()); + formatted.put("args", config.getArgs()); + formatted.put("env_vars", config.getEnvVars()); + formatted.put("description", config.getDescription()); + formatted.put("is_active", config.getIsActive()); + formatted.put("create_time", config.getCreateTime()); + formatted.put("update_time", config.getUpdateTime()); + return formatted; + } + + /** + * 显式持久化 envVars JSONB 字段 + * MyBatis Plus 的 insert/updateById 对带 typeHandler 的 JSONB 字段可能不触发写入, + * 使用 JdbcTemplate 显式更新保证数据可靠落库。 + * + * @param id 配置ID + * @param envVars 环境变量 Map + */ + private void persistEnvVars(Long id, Map envVars) { + if (id == null) { + return; + } + try { + String json; + if (envVars == null || envVars.isEmpty()) { + json = "{}"; + } else { + json = OBJECT_MAPPER.writeValueAsString(envVars); + } + jdbcTemplate.update( + "UPDATE mcp_server_config SET env_vars = ?::jsonb WHERE id = ?", + json, id); + log.debug("持久化 envVars: id={}, envVars={}", id, json); + } catch (Exception e) { + log.error("持久化 envVars 失败: id={}, error={}", id, e.getMessage()); + throw new RuntimeException("持久化环境变量失败: " + e.getMessage(), e); + } + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index e5f0aaf..472c471 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -23,6 +23,11 @@ spring: knife4j: enable: true +# ==================== 文件存储路径 ==================== +knowledge: + storage: + local-path: D:/uploads + # ==================== 日志级别 ==================== logging: level: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index e4787ac..e0dbdaa 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -32,10 +32,15 @@ spring: knife4j: enable: false +# ==================== 文件存储路径 ==================== +knowledge: + storage: + local-path: /www/uploads + # ==================== 日志级别 ==================== # 生产环境收敛日志,仅保留 WARN 及以上,业务代码保留 INFO logging: level: - root: WARN + root: INFO com.wok.supportbot: INFO - org.springframework.ai: WARN + org.springframework.ai: INFO diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ec43dba..fd9e56d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -64,6 +64,10 @@ knowledge: faq: # FAQ 语义匹配阈值(0-1),低于此值自动降级到 RAG 检索 semantic-threshold: 0.85 + storage: + # 上传文件本地存储根路径(Windows: D:/uploads, Linux: /data/uploads) + # 各环境可在 application-{env}.yml 中覆盖 + local-path: ./uploads # ==================== Knife4j API 文档通用配置 ==================== # knife4j.enable 开关在各环境 yml 中配置(生产环境建议关闭) @@ -102,3 +106,8 @@ jwt: expiration: 86400000 # 刷新令牌有效期:7天(毫秒) refresh-expiration: 604800000 + # ==================== SDK 专用 JWT 配置 ==================== + # SDK Token 签名密钥(独立于管理后台 JWT 密钥,生产环境务必覆盖) + sdk-secret: support-bot-sdk-jwt-secret-2026-please-change + # SDK Token 默认有效期:2小时(毫秒) + sdk-expiration: 7200000 diff --git a/src/main/resources/init-database.sql b/src/main/resources/init-database.sql index af1d7cb..8549303 100644 --- a/src/main/resources/init-database.sql +++ b/src/main/resources/init-database.sql @@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS chat_message ( create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_delete BOOLEAN NOT NULL DEFAULT FALSE, - CONSTRAINT chk_message_type CHECK (message_type IN ('USER', 'ASSISTANT', 'SYSTEM')) + CONSTRAINT chk_message_type CHECK (message_type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')) ); CREATE INDEX IF NOT EXISTS idx_chat_message_conversation_id ON chat_message (conversation_id); @@ -94,6 +94,7 @@ CREATE TABLE IF NOT EXISTS knowledge_document ( source_name VARCHAR(500), file_type VARCHAR(20) NOT NULL, file_size BIGINT NOT NULL DEFAULT 0, + file_path VARCHAR(500), content TEXT, category_id BIGINT NOT NULL DEFAULT 0, tags JSONB NOT NULL DEFAULT '{}', @@ -101,6 +102,8 @@ CREATE TABLE IF NOT EXISTS knowledge_document ( status VARCHAR(20) NOT NULL DEFAULT 'PROCESSING', error_message TEXT, content_hash VARCHAR(64), + enabled BOOLEAN NOT NULL DEFAULT TRUE, + extra_config JSONB NOT NULL DEFAULT '{}', create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, is_delete BOOLEAN NOT NULL DEFAULT FALSE @@ -110,6 +113,7 @@ CREATE INDEX IF NOT EXISTS idx_knowledge_document_category ON knowledge_docu CREATE INDEX IF NOT EXISTS idx_knowledge_document_status ON knowledge_document (status); CREATE INDEX IF NOT EXISTS idx_knowledge_document_create_time ON knowledge_document (create_time DESC); CREATE INDEX IF NOT EXISTS idx_knowledge_document_content_hash ON knowledge_document (content_hash); +CREATE INDEX IF NOT EXISTS idx_knowledge_document_enabled ON knowledge_document (enabled); COMMENT ON TABLE knowledge_document IS '知识文档表'; COMMENT ON COLUMN knowledge_document.id IS '主键'; @@ -117,6 +121,7 @@ COMMENT ON COLUMN knowledge_document.title IS '文档标题'; COMMENT ON COLUMN knowledge_document.source_name IS '原始文件名'; COMMENT ON COLUMN knowledge_document.file_type IS '文件类型'; COMMENT ON COLUMN knowledge_document.file_size IS '文件大小(字节)'; +COMMENT ON COLUMN knowledge_document.file_path IS '原始文件存储路径(相对路径)'; COMMENT ON COLUMN knowledge_document.content IS '原文内容(截断预览)'; COMMENT ON COLUMN knowledge_document.category_id IS '所属分类ID'; COMMENT ON COLUMN knowledge_document.tags IS '标签(JSON)'; @@ -124,6 +129,8 @@ COMMENT ON COLUMN knowledge_document.chunk_count IS '分块数量'; COMMENT ON COLUMN knowledge_document.status IS '状态: PROCESSING / READY / FAILED'; COMMENT ON COLUMN knowledge_document.error_message IS '处理失败时的错误信息'; COMMENT ON COLUMN knowledge_document.content_hash IS '内容SHA-256哈希(用于去重)'; +COMMENT ON COLUMN knowledge_document.enabled IS '是否启用'; +COMMENT ON COLUMN knowledge_document.extra_config IS '扩展配置(JSON)'; COMMENT ON COLUMN knowledge_document.create_time IS '创建时间'; COMMENT ON COLUMN knowledge_document.update_time IS '更新时间'; COMMENT ON COLUMN knowledge_document.is_delete IS '逻辑删除'; @@ -137,14 +144,14 @@ CREATE TABLE IF NOT EXISTS customer_service_role ( name VARCHAR(100) NOT NULL, description TEXT, prompt TEXT, - sort_order INTEGER NOT NULL DEFAULT 0, enabled BOOLEAN NOT NULL DEFAULT TRUE, create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - is_delete BOOLEAN NOT NULL DEFAULT FALSE + is_delete BOOLEAN NOT NULL DEFAULT FALSE, + allowed_mcp_tools JSONB NOT NULL DEFAULT '[]' ); -CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled, sort_order); +CREATE INDEX IF NOT EXISTS idx_customer_service_role_enabled ON customer_service_role (enabled); COMMENT ON TABLE customer_service_role IS '客服角色表'; COMMENT ON COLUMN customer_service_role.id IS '主键'; @@ -152,23 +159,23 @@ COMMENT ON COLUMN customer_service_role.role_key IS '角色标识符(唯一 COMMENT ON COLUMN customer_service_role.name IS '角色名称'; COMMENT ON COLUMN customer_service_role.description IS '角色描述'; COMMENT ON COLUMN customer_service_role.prompt IS '系统提示词'; -COMMENT ON COLUMN customer_service_role.sort_order IS '排序权重'; COMMENT ON COLUMN customer_service_role.enabled IS '是否启用'; COMMENT ON COLUMN customer_service_role.create_time IS '创建时间'; COMMENT ON COLUMN customer_service_role.update_time IS '更新时间'; COMMENT ON COLUMN customer_service_role.is_delete IS '逻辑删除'; +COMMENT ON COLUMN customer_service_role.allowed_mcp_tools IS '允许使用的 MCP 工具列表(JSONB 数组,空=不允许,["*"]=全部允许)'; -- 默认角色种子数据 -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('general', '客服', '通用客服角色', 0, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('general', '客服', '通用客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('finance', '财务', '财务相关客服角色', 1, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('finance', '财务', '财务相关客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -INSERT INTO customer_service_role (role_key, name, description, sort_order, enabled) -VALUES ('administration', '行政', '行政相关客服角色', 2, TRUE) +INSERT INTO customer_service_role (role_key, name, description, enabled) +VALUES ('administration', '行政', '行政相关客服角色', TRUE) ON CONFLICT (role_key) DO NOTHING; -- ============================================================ @@ -261,6 +268,40 @@ COMMENT ON COLUMN conversation_session.role_id IS '归属角色ID'; COMMENT ON COLUMN conversation_session.create_time IS '创建时间'; COMMENT ON COLUMN conversation_session.update_time IS '更新时间'; +-- ============================================================ +-- 表 7.5: mcp_server_config — MCP Server 配置表 +-- ============================================================ +CREATE TABLE IF NOT EXISTS mcp_server_config ( + id BIGINT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + transport_type VARCHAR(20) NOT NULL DEFAULT 'sse', + server_url VARCHAR(500), + command VARCHAR(500), + args VARCHAR(1000), + env_vars JSONB DEFAULT '{}' NOT NULL, + description VARCHAR(500), + is_active BOOLEAN DEFAULT TRUE NOT NULL, + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + is_delete BOOLEAN NOT NULL DEFAULT FALSE +); + +CREATE INDEX IF NOT EXISTS idx_mcp_server_config_active ON mcp_server_config (is_active) WHERE is_delete = FALSE; + +COMMENT ON TABLE mcp_server_config IS 'MCP Server 配置表(管理外部 MCP Server 连接配置)'; +COMMENT ON COLUMN mcp_server_config.id IS '主键(雪花算法生成)'; +COMMENT ON COLUMN mcp_server_config.name IS '配置名称'; +COMMENT ON COLUMN mcp_server_config.transport_type IS '传输类型: stdio(标准输入输出) / sse(Server-Sent Events)'; +COMMENT ON COLUMN mcp_server_config.server_url IS 'SSE 模式的 MCP Server URL'; +COMMENT ON COLUMN mcp_server_config.command IS 'stdio 模式的启动命令'; +COMMENT ON COLUMN mcp_server_config.args IS 'stdio 模式的命令参数(多个用逗号分隔)'; +COMMENT ON COLUMN mcp_server_config.env_vars IS '环境变量(JSONB 键值对)'; +COMMENT ON COLUMN mcp_server_config.description IS '描述说明'; +COMMENT ON COLUMN mcp_server_config.is_active IS '是否启用'; +COMMENT ON COLUMN mcp_server_config.create_time IS '创建时间'; +COMMENT ON COLUMN mcp_server_config.update_time IS '更新时间'; +COMMENT ON COLUMN mcp_server_config.is_delete IS '逻辑删除: FALSE=正常 TRUE=已删除'; + -- ============================================================ -- 表 8: vector_store — 向量存储表 -- 注意: Spring AI PgVectorStore 配置了 initializeSchema(true), @@ -452,6 +493,7 @@ CREATE TABLE IF NOT EXISTS knowledge_faq ( answer TEXT NOT NULL, similar_questions TEXT NOT NULL DEFAULT '[]', category VARCHAR(128), + category_id BIGINT, status VARCHAR(20) NOT NULL DEFAULT 'ENABLED', priority INTEGER NOT NULL DEFAULT 0, hit_count BIGINT NOT NULL DEFAULT 0, @@ -461,9 +503,10 @@ CREATE TABLE IF NOT EXISTS knowledge_faq ( is_delete BOOLEAN NOT NULL DEFAULT FALSE ); -CREATE INDEX IF NOT EXISTS idx_faq_status ON knowledge_faq (status) WHERE is_delete = FALSE; -CREATE INDEX IF NOT EXISTS idx_faq_category ON knowledge_faq (category); -CREATE INDEX IF NOT EXISTS idx_faq_priority ON knowledge_faq (priority DESC); +CREATE INDEX IF NOT EXISTS idx_faq_status ON knowledge_faq (status) WHERE is_delete = FALSE; +CREATE INDEX IF NOT EXISTS idx_faq_category ON knowledge_faq (category); +CREATE INDEX IF NOT EXISTS idx_faq_category_id ON knowledge_faq (category_id); +CREATE INDEX IF NOT EXISTS idx_faq_priority ON knowledge_faq (priority DESC); COMMENT ON TABLE knowledge_faq IS 'FAQ 知识库表(用于意图路由后的精准问答匹配)'; COMMENT ON COLUMN knowledge_faq.id IS '主键(雪花算法生成)'; @@ -499,6 +542,29 @@ COMMENT ON COLUMN faq_embedding.embedding IS '向量嵌入(维度由 knowled COMMENT ON COLUMN faq_embedding.model_name IS '使用的 Embedding 模型名称(用于检测模型变更后重新计算)'; COMMENT ON COLUMN faq_embedding.create_time IS '创建时间'; +-- ============================================================ +-- 清理租户相关数据(移除多租户架构) +-- ============================================================ +DROP TABLE IF EXISTS tenant CASCADE; + +ALTER TABLE api_key DROP COLUMN IF EXISTS tenant_id; +DROP INDEX IF EXISTS idx_api_key_tenant_id; + +ALTER TABLE customer_service_role DROP COLUMN IF EXISTS tenant_id; +DROP INDEX IF EXISTS idx_csr_tenant_id; + +ALTER TABLE knowledge_category DROP COLUMN IF EXISTS tenant_id; +DROP INDEX IF EXISTS idx_kc_tenant_id; + +ALTER TABLE knowledge_faq DROP COLUMN IF EXISTS tenant_id; +DROP INDEX IF EXISTS idx_faq_tenant_id; + +-- ============================================================ +-- API Key 角色绑定:新增 role_ids 列 +-- ============================================================ +ALTER TABLE api_key ADD COLUMN IF NOT EXISTS role_ids JSONB DEFAULT '[]' NOT NULL; +COMMENT ON COLUMN api_key.role_ids IS '绑定的客服角色 ID 列表(JSONB 数组,空数组=不限制,返回所有启用角色)'; + -- ============================================================ -- 完成! -- 共创建 14 张表及对应索引。 diff --git a/src/main/resources/static/components/ApiKeyManager.js b/src/main/resources/static/components/ApiKeyManager.js index 2bd9842..274d9ab 100644 --- a/src/main/resources/static/components/ApiKeyManager.js +++ b/src/main/resources/static/components/ApiKeyManager.js @@ -1,9 +1,9 @@ /** * API Key 管理组件 - * 支持 API Key 的生成、吊销、启用、删除、复制、分页查询 + * 支持 API Key 的生成、吊销、启用、删除、复制、分页查询、角色绑定 */ import { ref, onMounted, computed } from 'vue' -import { listApiKeys, createApiKey, revokeApiKey, enableApiKey, deleteApiKey } from '../js/api.js' +import { listApiKeys, createApiKey, revokeApiKey, enableApiKey, deleteApiKey, getAllRoles, updateApiKeyRoles } from '../js/api.js' import { toast } from '../js/utils.js' export default { @@ -25,14 +25,15 @@ export default { Key 频率限制 调用次数 + 绑定角色 过期时间 状态 操作 - 加载中... - 暂无 API Key + 加载中... + 暂无 API Key

{{ k.name || '未命名' }}
@@ -50,6 +51,10 @@ export default { / {{ k.maxCalls }} (不限) + + {{ getBoundRoleCount(k.roleIds) }} 个角色 + 不限(全部) + {{ k.expireTime ? formatDate(k.expireTime) : '永不过期' }} @@ -59,6 +64,7 @@ export default { + @@ -100,6 +106,16 @@ export default { +
+ +
暂无可用角色
+
+ +
+
@@ -121,6 +137,37 @@ export default {
+ + +
+
+

绑定客服角色 — {{ editingKeyName }}

+

勾选允许此 API Key 使用的客服角色,不勾选任何角色则不限制(可使用所有角色)

+ +
加载角色列表...
+
暂无可用角色,请先创建客服角色
+
+
+ +
+
+ +
+ 已选 {{ selectedRoleIds.length }} 个角色{{ selectedRoleIds.length === 0 ? '(不限制)' : '' }} +
+ + +
+
+
+
`, @@ -133,7 +180,15 @@ export default { const showCreateDialog = ref(false) const showKeyReveal = ref(false) const revealedKey = ref('') - const form = ref({ name: '', description: '', rateLimit: null, maxCalls: null, expireTime: '' }) + const form = ref({ name: '', description: '', rateLimit: null, maxCalls: null, expireTime: '', roleIds: [] }) + + // 角色绑定相关状态 + const allRoles = ref([]) + const roleLoading = ref(false) + const showRoleDialog = ref(false) + const editingKeyId = ref(null) + const editingKeyName = ref('') + const selectedRoleIds = ref([]) async function loadList() { loading.value = true @@ -149,8 +204,20 @@ export default { loading.value = false } + async function loadRoles() { + roleLoading.value = true + try { + const res = await getAllRoles() + allRoles.value = res.data || [] + } catch (e) { + console.warn('加载角色列表失败', e) + } + roleLoading.value = false + } + function openCreateDialog() { - form.value = { name: '', description: '', rateLimit: null, maxCalls: null, expireTime: '' } + form.value = { name: '', description: '', rateLimit: null, maxCalls: null, expireTime: '', roleIds: [] } + loadRoles() showCreateDialog.value = true } @@ -159,6 +226,7 @@ export default { if (form.value.rateLimit) data.rateLimit = form.value.rateLimit if (form.value.maxCalls) data.maxCalls = form.value.maxCalls if (form.value.expireTime) data.expireTime = form.value.expireTime + if (form.value.roleIds && form.value.roleIds.length > 0) data.roleIds = form.value.roleIds try { const res = await createApiKey(data) @@ -205,6 +273,51 @@ export default { } catch (e) { toast('删除失败: ' + e.message, 'error') } } + function openRoleDialog(key) { + editingKeyId.value = key.id + editingKeyName.value = key.name || '未命名' + try { + selectedRoleIds.value = key.roleIds ? JSON.parse(key.roleIds).map(Number) : [] + } catch { selectedRoleIds.value = [] } + loadRoles() + showRoleDialog.value = true + } + + function toggleRole(roleId) { + const idx = selectedRoleIds.value.indexOf(roleId) + if (idx >= 0) selectedRoleIds.value.splice(idx, 1) + else selectedRoleIds.value.push(roleId) + } + + function toggleRole(roleId) { + const idx = selectedRoleIds.value.indexOf(roleId) + if (idx >= 0) selectedRoleIds.value.splice(idx, 1) + else selectedRoleIds.value.push(roleId) + } + + async function doSaveRoles() { + try { + const res = await updateApiKeyRoles(editingKeyId.value, selectedRoleIds.value) + if (res.success) { + toast('角色绑定更新成功', 'success') + showRoleDialog.value = false + loadList() + } else { + toast(res.message || '更新失败', 'error') + } + } catch (e) { + toast('更新失败: ' + e.message, 'error') + } + } + + function getBoundRoleCount(roleIdsStr) { + if (!roleIdsStr) return 0 + try { + const arr = JSON.parse(roleIdsStr) + return Array.isArray(arr) ? arr.length : 0 + } catch { return 0 } + } + function maskKey(key) { if (!key || key.length < 12) return key || '***' return key.substring(0, 6) + '****' + key.substring(key.length - 4) @@ -242,9 +355,11 @@ export default { return { keys, loading, page, pageSize, total, showCreateDialog, showKeyReveal, revealedKey, form, + allRoles, roleLoading, showRoleDialog, editingKeyId, editingKeyName, selectedRoleIds, loadList, openCreateDialog, doCreate, doRevoke, doEnable, doDelete, - maskKey, copyKey, formatDate + openRoleDialog, doSaveRoles, + getBoundRoleCount, maskKey, copyKey, formatDate } } } diff --git a/src/main/resources/static/components/ChatPanel.js b/src/main/resources/static/components/ChatPanel.js index 0f40be7..bf9d315 100644 --- a/src/main/resources/static/components/ChatPanel.js +++ b/src/main/resources/static/components/ChatPanel.js @@ -3,7 +3,7 @@ */ import { ref, computed, nextTick, onMounted } from 'vue' import { chatSync, chatRagSync, chatSSEUrl, chatRagSSEUrl, getRoleList, getActiveModelConfig, truncateConversation, ragSources, submitFeedback as submitFeedbackApi } from '../js/api.js' -import { toast, readSSEStream, renderMarkdown } from '../js/utils.js' +import { toast, readSSEStream, readSSEStreamWithEvents, renderMarkdown } from '../js/utils.js' import { store } from '../js/store.js' import MessageSources from './MessageSources.js' @@ -108,6 +108,16 @@ export default {