zj-plugin-intelligent 1.2.8-beta.21 → 1.2.8-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -872,7 +872,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
872
872
  /***/ (function(module, exports, __webpack_require__) {
873
873
 
874
874
  "use strict";
875
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n\n this.loadAgents();\n this.loadSessions();\n this.getCurrentUserInfo();\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
875
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n this.getCurrentUserInfo();\n\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n\n _this.loadAgents();\n\n _this.loadSessions();\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
876
876
 
877
877
  /***/ }),
878
878
 
@@ -11066,7 +11066,7 @@ eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\
11066
11066
  /*! exports provided: name, version, main, private, scripts, dependencies, devDependencies, browserslist, directories, keywords, license, files, default */
11067
11067
  /***/ (function(module) {
11068
11068
 
11069
- eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.21\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11069
+ eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.22\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11070
11070
 
11071
11071
  /***/ }),
11072
11072
 
@@ -12102,7 +12102,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
12102
12102
  /***/ (function(module, exports, __webpack_require__) {
12103
12103
 
12104
12104
  "use strict";
12105
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 09:24:39\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12105
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 16:20:29\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12106
12106
 
12107
12107
  /***/ }),
12108
12108
 
@@ -881,7 +881,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
881
881
  /***/ (function(module, exports, __webpack_require__) {
882
882
 
883
883
  "use strict";
884
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n\n this.loadAgents();\n this.loadSessions();\n this.getCurrentUserInfo();\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
884
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n this.getCurrentUserInfo();\n\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n\n _this.loadAgents();\n\n _this.loadSessions();\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
885
885
 
886
886
  /***/ }),
887
887
 
@@ -11075,7 +11075,7 @@ eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\
11075
11075
  /*! exports provided: name, version, main, private, scripts, dependencies, devDependencies, browserslist, directories, keywords, license, files, default */
11076
11076
  /***/ (function(module) {
11077
11077
 
11078
- eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.21\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11078
+ eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.22\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11079
11079
 
11080
11080
  /***/ }),
11081
11081
 
@@ -12111,7 +12111,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
12111
12111
  /***/ (function(module, exports, __webpack_require__) {
12112
12112
 
12113
12113
  "use strict";
12114
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 09:24:39\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12114
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 16:20:29\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12115
12115
 
12116
12116
  /***/ }),
12117
12117
 
@@ -881,7 +881,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
881
881
  /***/ (function(module, exports, __webpack_require__) {
882
882
 
883
883
  "use strict";
884
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n\n this.loadAgents();\n this.loadSessions();\n this.getCurrentUserInfo();\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
884
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/asyncToGenerator.js\"));\n\nvar _apichat = __webpack_require__(/*! @lib/api/apichat */ \"./src/lib/api/apichat.js\");\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\nvar _guideHelper = __webpack_require__(/*! @lib/utils/guideHelper.js */ \"./src/lib/utils/guideHelper.js\");\n\nvar _guideConfig = __webpack_require__(/*! @lib/components/guide/guideConfig.js */ \"./src/lib/components/guide/guideConfig.js\");\n\nvar _guideMobileConfig = __webpack_require__(/*! @lib/components/guide/guideMobileConfig.js */ \"./src/lib/components/guide/guideMobileConfig.js\");\n\nvar _NewFeatureGuide = _interopRequireDefault(__webpack_require__(/*! @lib/components/guide/NewFeatureGuide.vue */ \"./src/lib/components/guide/NewFeatureGuide.vue\"));\n\nvar _ChatSidebar = _interopRequireDefault(__webpack_require__(/*! ./ChatSidebar.vue */ \"./src/lib/components/chatMain/ChatSidebar.vue\"));\n\nvar _AgentSelector = _interopRequireDefault(__webpack_require__(/*! ./AgentSelector.vue */ \"./src/lib/components/chatMain/AgentSelector.vue\"));\n\nvar _ChatDetail = _interopRequireDefault(__webpack_require__(/*! ./ChatDetail.vue */ \"./src/lib/components/chatMain/ChatDetail.vue\"));\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: 'ChatMain',\n components: {\n ChatSidebar: _ChatSidebar.default,\n AgentSelector: _AgentSelector.default,\n ChatDetail: _ChatDetail.default,\n NewFeatureGuide: _NewFeatureGuide.default\n },\n props: {\n Ak: {\n type: String,\n default: ''\n },\n Sk: {\n type: String,\n default: ''\n },\n imAccount: {\n type: String,\n default: ''\n },\n companyNo: {\n type: String,\n default: ''\n },\n isIntelShow: {\n default: false,\n type: Boolean\n },\n chatImToken: {\n default: '',\n type: String\n },\n userno: {\n default: '',\n type: String\n },\n isPlugin: {\n default: false,\n type: Boolean\n }\n },\n data: function data() {\n // 首次渲染前检测窗口宽度,避免 H5 端先显示 PC 布局再切换导致闪烁\n var _isMobile = typeof window !== 'undefined' && window.innerWidth <= 768;\n\n return {\n agentList: [],\n currentAgent: '',\n currentAgentDesc: '',\n sessionsLoaded: false,\n sessionList: [],\n activeSessionId: '',\n loadingMore: false,\n showAgentSelect: !_isMobile,\n isMobile: _isMobile,\n showSidebar: false,\n showH5List: _isMobile,\n agentInfo: {},\n nickName: '',\n sessionsLoading: true,\n // 引导动画状态(PC & 移动端共用)\n showGuide: false,\n guideSteps: [],\n isGuideFirstStep: true,\n isGuideLastStep: false,\n // 移动端跨页面引导专用状态\n isMobileGuide: false,\n guidePageTransitioning: false,\n _swipeStartX: 0,\n _swipeStartY: 0,\n _swipeHandled: false\n };\n },\n created: function created() {\n this.getCurrentUserInfo();\n\n if (this.Ak || this.Sk) {\n (0, _apichat.setApiAuth)(this.Ak, this.Sk, this.imAccount, this.companyNo, this.chatImToken, this.userno);\n }\n },\n mounted: function mounted() {\n this.updateViewportState();\n window.addEventListener('resize', this.updateViewportState, {\n passive: true\n }); // Android WebView 兼容:在 document 级别监听 touchmove/touchend\n // 避免可滚动子元素消费事件后不冒泡到父级\n\n document.addEventListener('touchmove', this._onSwipeMove, {\n passive: true\n });\n document.addEventListener('touchend', this._onSwipeEnd, {\n passive: true\n }); // 拦截 Android 系统返回手势:通过 history.pushState + popstate\n\n window.addEventListener('popstate', this._onPopState); // 引导动画在 loadSessions 完成后初始化(见 loadSessions),\n // 以便依据会话数据判定新老用户,从正确的页面开始引导\n },\n watch: {},\n methods: {\n getCurrentUserInfo: function getCurrentUserInfo() {\n var _this = this;\n\n (0, _apichat.getCurrentUserInfo)().then(function (data) {\n _this.nickName = data && data.nickName || ''; // 单独用 getCurrentUserInfo 返回的 no 注入 userno,不重复调用 setApiAuth\n\n var no = data && (data.no !== undefined && data.no !== null ? data.no : data.userNo);\n\n if (no !== undefined && no !== null && no !== '') {\n (0, _apichat.setApiUserNo)(String(no));\n }\n\n _this.loadAgents();\n\n _this.loadSessions();\n }).catch(function () {});\n },\n handleFormSubmit: function handleFormSubmit(payload) {\n if (!payload || !payload.sessionId || !payload.msgKey) return;\n (0, _apichat.markFormSubmitted)(payload.sessionId, payload.msgKey, payload.formData).catch(function () {});\n },\n // ── H5 侧滑手势 ──\n onSwipeTouchStart: function onSwipeTouchStart(e) {\n if (!this.isMobile) return;\n this._swipeStartX = e.touches[0].clientX;\n this._swipeStartY = e.touches[0].clientY;\n this._swipeHandled = false;\n },\n // 在 touchmove 中实时检测\n // 注意:不限制触摸起点位置(移除边缘限制),以兼容 Android 系统手势导航在左边缘的拦截\n _onSwipeMove: function _onSwipeMove(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var moveX = e.touches[0].clientX;\n var moveY = e.touches[0].clientY;\n var diffX = moveX - this._swipeStartX;\n var diffY = moveY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离(排除上下滚动干扰)\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n // touchend 检测(兜底,兼容不支持 touchmove 的场景)\n _onSwipeEnd: function _onSwipeEnd(e) {\n if (!this.isMobile || this._swipeHandled) return;\n var endX = e.changedTouches[0].clientX;\n var endY = e.changedTouches[0].clientY;\n var diffX = endX - this._swipeStartX;\n var diffY = endY - this._swipeStartY; // 向右滑动超过 60px,且水平距离明显大于垂直距离\n\n if (diffX < 60) return;\n if (Math.abs(diffX) < Math.abs(diffY) * 2) return;\n this._swipeHandled = true;\n\n this._triggerSwipeAction();\n },\n _triggerSwipeAction: function _triggerSwipeAction() {\n if (this.showH5List) {\n // 列表页 → 原生返回\n this.handleNativeBack();\n } else if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n } else if (!this.showAgentSelect) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n }\n },\n // 拦截 Android 系统返回手势(通过 history.pushState + popstate)\n // 当用户在详情页触发系统返回时,WebView 先回退历史栈触发 popstate,\n // 我们在这里拦截并导航到列表页,避免 Activity 被直接关闭\n _onPopState: function _onPopState() {\n if (!this.isMobile) return;\n\n if (this.showAgentSelect) {\n // 智能体选择页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else if (!this.showH5List) {\n // 详情页/欢迎页 → 返回列表\n this.goBackToList();\n history.pushState({\n page: 'chatList'\n }, '');\n } else {\n // 列表页 → 直接关闭 WebView\n this.handleNativeBack();\n }\n },\n handleNewSessionInternal: function handleNewSessionInternal() {\n var _this2 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this2.activeSessionId = res.sessionId || '';\n\n _this2.loadSessions();\n\n var agent = _this2.agentList.find(function (a) {\n return a.agentCode === _this2.currentAgent;\n });\n\n if (agent) _this2.addWelcomeMessage(agent);\n }).catch(function () {\n _this2.sessionsLoading = false;\n });\n },\n updateViewportState: function updateViewportState() {\n if (typeof window === 'undefined') return;\n var nextIsMobile = window.innerWidth <= 768;\n var wasMobile = this.isMobile;\n this.isMobile = nextIsMobile;\n\n if (!nextIsMobile) {\n this.showSidebar = false;\n this.showH5List = false;\n } else if (!wasMobile && nextIsMobile) {\n if (this.sessionList.length > 0 && !this.activeSessionId) {\n this.showH5List = true;\n this.showAgentSelect = false;\n }\n }\n },\n toggleSidebar: function toggleSidebar() {\n if (!this.isMobile) return;\n this.showSidebar = !this.showSidebar;\n },\n closeSidebar: function closeSidebar() {\n this.showSidebar = false;\n },\n handleNativeBack: function handleNativeBack() {\n if (this.$hybrid && typeof this.$hybrid.closePage === 'function') {\n this.$hybrid.closePage();\n } else if (window.history.length > 1) {\n window.history.back();\n }\n },\n handleSidebarBack: function handleSidebarBack() {\n this.handleNativeBack();\n },\n agentjumpclick: function agentjumpclick() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.activeSessionId = '';\n this.showAgentSelect = true;\n this.showH5List = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n history.pushState({\n page: 'agentSelect'\n }, '');\n }\n },\n goBackToList: function goBackToList() {\n var cd = this.$refs.chatDetail;\n\n if (cd && cd.sending) {\n this.$message.warning('AI正在生成内容,暂时请不要切换对话');\n return;\n }\n\n if (cd) {\n if (cd.eventSource) {\n cd.eventSource.close();\n cd.eventSource = null;\n }\n\n cd.sending = false;\n cd.clearWaitTimer();\n cd.messages = [];\n cd.contentCache = {};\n }\n\n this.activeSessionId = '';\n this.currentAgent = '';\n this.currentAgentDesc = '';\n this.agentInfo = {};\n this.showH5List = true;\n this.showAgentSelect = false;\n this.closeSidebar();\n },\n loadAgents: function loadAgents() {\n var _this3 = this;\n\n (0, _apichat.getChatAgents)().then(function (list) {\n _this3.agentList = list || [];\n }).catch(function () {\n _this3.sessionsLoading = false;\n });\n },\n loadSessions: function loadSessions() {\n var _this4 = this;\n\n this.sessionsLoading = true;\n (0, _apichat.getSessionList)().then(function (list) {\n _this4.sessionsLoading = false;\n\n if (!_this4.activeSessionId) {\n _this4.sessionList = list || [];\n\n if (_this4.sessionList.length > 0) {\n if (_this4.isMobile) {\n _this4.showAgentSelect = false;\n _this4.showH5List = true;\n _this4.showSidebar = false;\n } else {\n _this4.switchSession(_this4.sessionList[0]);\n }\n }\n\n if (_this4.sessionList.length === 0) {\n _this4.showAgentSelect = true;\n _this4.showH5List = false;\n }\n } else {\n _this4.sessionList = list || [];\n\n var _item = list.find(function (res) {\n return res.sessionId == _this4.activeSessionId;\n });\n\n try {\n if (_item && _item.suggestedQuestions) {\n _item.suggestedQuestions = JSON.parse(_item.suggestedQuestions);\n }\n\n _item && (_this4.agentInfo = _item);\n } catch (err) {\n _this4.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n } // 会话数据就绪后再初始化引导,保证新老用户判定准确\n\n\n _this4.initGuide();\n }).catch(function () {\n _this4.sessionsLoading = false; // 会话加载失败兜底:按新用户流程引导\n\n _this4.initGuide();\n });\n },\n startChatWithAgent: function startChatWithAgent(agent) {\n console.log('选择了助手', agent.agentCode, this.currentAgent);\n\n if (agent.agentCode == this.currentAgent) {\n return;\n }\n\n this.currentAgent = agent.agentCode;\n this.currentAgentDesc = agent.description || '';\n this.agentInfo = {};\n this.showAgentSelect = false;\n this.closeSidebar();\n\n if (this.isMobile) {\n this.showH5List = false;\n }\n\n var existing = this.sessionList.find(function (s) {\n return s.agentCode === agent.agentCode;\n });\n\n if (existing) {\n this.switchSession(existing);\n } else {\n if (this.isMobile) {\n history.pushState({\n page: 'chatWelcome'\n }, '');\n }\n\n this.handleNewSession();\n }\n },\n handleNewSession: function handleNewSession() {\n var _this5 = this;\n\n if (!this.currentAgent) return;\n if (this.activeSessionId) this.closeOldSession();\n (0, _apichat.startSession)(this.currentAgent).then(function (res) {\n _this5.activeSessionId = res.sessionId || '';\n\n if (_this5.isMobile) {\n history.replaceState({\n page: 'chatDetail'\n }, '');\n }\n\n _this5.loadSessions();\n\n var agent = _this5.agentList.find(function (a) {\n return a.agentCode === _this5.currentAgent;\n });\n\n if (agent) _this5.addWelcomeMessage(agent);\n }).catch(function () {});\n },\n addWelcomeMessage: function addWelcomeMessage(agent) {\n var _this6 = this;\n\n var cd = this.$refs.chatDetail;\n\n if (cd) {\n var _agent = this.agentList.find(function (x) {\n return x.agentCode === _this6.currentAgent;\n });\n\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n },\n switchSession: function switchSession(s) {\n var _this7 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var cd, agent, res, list, asAsc, _agent;\n\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n cd = _this7.$refs.chatDetail;\n\n if (!(cd && cd.sending)) {\n _context.next = 4;\n break;\n }\n\n _this7.$message.warning('AI正在生成内容,暂时请不要切换对话');\n\n return _context.abrupt(\"return\");\n\n case 4:\n _this7.showAgentSelect = false;\n\n _this7.closeSidebar();\n\n if (_this7.isMobile) {\n _this7.showH5List = false; // 推入历史状态,拦截 Android 系统返回手势\n // 系统返回会触发 WebView 历史回退 → popstate → 我们拦截后 goBackToList\n\n history.pushState({\n page: 'chatDetail'\n }, '');\n }\n\n if (!(_this7.activeSessionId === s.sessionId)) {\n _context.next = 9;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 9:\n if (cd) {\n _context.next = 13;\n break;\n }\n\n _context.next = 12;\n return _this7.$nextTick();\n\n case 12:\n cd = _this7.$refs.chatDetail;\n\n case 13:\n if (cd) {\n cd.contentCache = {};\n cd.messages = [];\n cd.msgPage = 1;\n cd.msgTotal = 0;\n cd.loadingSessionMsg = true;\n }\n\n _this7.activeSessionId = s.sessionId;\n _this7.currentAgent = s.agentCode;\n _this7.agentInfo = s;\n\n try {\n if (s.suggestedQuestions) {\n _this7.agentInfo.suggestedQuestions = JSON.parse(s.suggestedQuestions);\n } else {\n _this7.agentInfo.suggestedQuestions = [];\n }\n } catch (err) {\n _this7.agentInfo.questionArr = [];\n console.warn('快捷提问解析失败', err);\n }\n\n agent = _this7.agentList.find(function (a) {\n return a.agentCode === s.agentCode;\n });\n _this7.currentAgentDesc = agent ? agent.description || '' : '';\n (0, _apichat.syncToken)((0, _cookie.getToken)(), s.sessionId);\n _context.prev = 21;\n _context.next = 24;\n return (0, _apichat.getSessionMessages)(s.sessionId, 1, 10);\n\n case 24:\n res = _context.sent;\n list = Array.isArray(res) ? res : res.list || [];\n\n if (!cd) {\n _context.next = 36;\n break;\n }\n\n cd.msgTotal = res.total || list.length;\n cd.msgPage = 1;\n asAsc = (list || []).slice().reverse();\n cd.messages = asAsc.map(function (m) {\n return {\n role: m.role,\n content: m.content || '',\n thinking: m.thinking || '',\n toolCalls: [],\n agentName: m.role === 'assistant' ? s.agentName || '' : '',\n createTime: m.createTime || null,\n _key: m.createTime ? 'msg_' + m.createTime : 'msg_' + Date.now() + '_' + Math.random(),\n msgKey: m.msgKey,\n formSubmitted: m.formSubmitted || 0,\n formData: m.formData || null,\n // 历史消息中如果包含 ```tokui 标记或以 TokUI 标签开头,自动启用 TokUI 渲染\n _hasTokui: m.role === 'assistant' && m.content && (/```tokui/.test(m.content) || /^\\s*\\[(card|row|list|table|callout|desc|dv|ft)\\b/.test(m.content.trim()))\n };\n });\n\n if (cd.messages.length === 0 && agent) {\n _agent = _this7.agentList.find(function (x) {\n return x.agentCode === _this7.currentAgent;\n });\n cd.greeting = _agent ? _agent.greeting || '很高兴为您服务,请问有什么可以帮到您?' : '';\n }\n\n cd.loadingSessionMsg = false;\n _context.next = 35;\n return _this7.$nextTick();\n\n case 35:\n _this7.$nextTick(function () {\n cd.scrollToBottomOnce();\n cd.checkScrollBottom();\n });\n\n case 36:\n _context.next = 41;\n break;\n\n case 38:\n _context.prev = 38;\n _context.t0 = _context[\"catch\"](21);\n\n if (cd) {\n cd.messages = [];\n cd.loadingSessionMsg = false;\n }\n\n case 41:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[21, 38]]);\n }))();\n },\n handleDeleteSession: function handleDeleteSession(s) {\n var _this8 = this;\n\n var confirmFn = this.$confirm || _message.showConfirm;\n confirmFn(\"\\u786E\\u8BA4\\u5220\\u9664\\u300C\".concat(s.agentName || s.agentCode, \"\\u300D\\u7684\\u4F1A\\u8BDD\\uFF1F\"), '提示', {\n type: 'warning'\n }).then(function () {\n (0, _apichat.deleteSession)(s.sessionId).then(function () {\n if (_this8.activeSessionId === s.sessionId) {\n _this8.activeSessionId = '';\n _this8.currentAgent = '';\n _this8.currentAgentDesc = '';\n var cd = _this8.$refs.chatDetail;\n\n if (cd) {\n cd.messages = [];\n cd.contentCache = {};\n }\n\n if (_this8.isMobile) {\n _this8.showH5List = false;\n _this8.showAgentSelect = true;\n } else {\n _this8.showAgentSelect = true;\n }\n }\n\n _this8.loadSessions();\n });\n }).catch(function () {});\n },\n closeOldSession: function closeOldSession() {},\n // ── 重新播放引导(欢迎页用户点击 ? 按钮触发) ──\n replayGuide: function replayGuide() {\n var _this9 = this;\n\n if (this.showGuide) return;\n\n if (this.isMobile) {\n // 与 initGuide 相同的判定逻辑(见 initGuide 注释)\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this9.showGuide = true;\n }, 400);\n });\n } else {\n var _isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser\n });\n this.isMobileGuide = false;\n this.showGuide = true;\n }\n },\n // ── 引导动画初始化(需会话数据就绪后调用,以判定新老用户) ──\n initGuide: function initGuide() {\n var _this10 = this;\n\n if (this._guideInited) return;\n this._guideInited = true;\n\n if (this.isMobile) {\n // 以会话中是否已有聊天记录(lastContent)区分新老用户,\n // 不能用 sessionList.length:后端可能为新用户预建空会话。\n // 新用户(无记录)落在智能体选择页(欢迎页),引导猜你想问/停止按钮;\n // 老用户(有记录)落在列表页,仅引导进入会话与输入框\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n this.guideSteps = (0, _guideMobileConfig.generateMobileGuideSteps)({\n isNewUser: isNewUser\n });\n\n if ((0, _guideHelper.shouldShowMobileGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = true;\n this.showAgentSelect = isNewUser;\n this.showH5List = !isNewUser;\n this.$nextTick(function () {\n setTimeout(function () {\n _this10.showGuide = true;\n }, 800);\n });\n }\n } else {\n // PC 端:同样以有无聊天记录区分新老用户。\n // 会话由引导中\"选择 Agent\"步骤点击穿透创建,此处不提前创建\n var _isNewUser2 = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n this.guideSteps = (0, _guideConfig.generateGuideSteps)({\n isMobile: false,\n isNewUser: _isNewUser2\n });\n\n if ((0, _guideHelper.shouldShowGuide)() && this.guideSteps.length > 0) {\n this.isMobileGuide = false;\n setTimeout(function () {\n _this10.showGuide = true;\n }, 600);\n }\n }\n },\n // ── 移动端跨页面导航 ──\n navigateToGuidePage: function navigateToGuidePage(page) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n switch (page) {\n case 'list':\n // 跳转到列表页\n _this11.showAgentSelect = false;\n _this11.showH5List = true;\n _this11.activeSessionId = '';\n break;\n\n case 'agentSelect':\n // 跳转到智能体选择页\n _this11.showAgentSelect = true;\n _this11.showH5List = false;\n break;\n\n case 'detail':\n // 跳转到详情页:老用户选中第一个会话;\n // 新用户选中第一个 Agent 发起真实会话,\n // 详情页才能加载出欢迎语与\"猜你想问\"等数据供后续步骤高亮\n _this11.showH5List = false;\n _this11.showAgentSelect = false;\n\n if (!_this11.activeSessionId) {\n if (_this11.sessionList.length > 0) {\n _this11.switchSession(_this11.sessionList[0]);\n } else if (_this11.agentList.length > 0) {\n _this11.startChatWithAgent(_this11.agentList[0]);\n }\n }\n\n break;\n\n default:\n break;\n } // 等待 DOM 更新\n\n\n _this11.$nextTick(function () {\n // 额外等待渲染完成\n setTimeout(resolve, 400);\n });\n });\n },\n // ── 引导步骤变化(包含跨页面切换) ──\n onGuideStepChange: function onGuideStepChange(index) {\n var _this12 = this;\n\n return (0, _asyncToGenerator2.default)( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var step, currentPage, isNewUser;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n step = _this12.guideSteps[index];\n\n if (step) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 3:\n if (!(_this12.isMobileGuide && step.page)) {\n _context2.next = 10;\n break;\n }\n\n currentPage = _this12.getCurrentPage();\n\n if (!(currentPage !== step.page)) {\n _context2.next = 10;\n break;\n }\n\n _this12.guidePageTransitioning = true;\n _context2.next = 9;\n return _this12.navigateToGuidePage(step.page);\n\n case 9:\n _this12.guidePageTransitioning = false;\n\n case 10:\n // PC 端:新用户引导时,欢迎步骤 → 选 Agent 步骤需要显示 AgentSelector\n if (!_this12.isMobileGuide && !_this12.isMobile) {\n isNewUser = !_this12.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser) {\n if (step.targetSelector && step.targetSelector.includes('agent-item')) {\n // 进入\"选择 Agent\"步骤,确保 AgentSelector 显示\n if (!_this12.showAgentSelect) {\n _this12.showAgentSelect = true;\n _this12.showH5List = false;\n }\n } else if (step.targetSelector && step.targetSelector.includes('guess-box')) {\n // 进入\"猜你想问\"步骤,隐藏 AgentSelector,显示 ChatDetail\n if (_this12.showAgentSelect) {\n _this12.showAgentSelect = false;\n }\n }\n }\n }\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n getCurrentPage: function getCurrentPage() {\n if (this.showH5List) return 'list';\n if (this.showAgentSelect) return 'agentSelect';\n return 'detail';\n },\n // ── 引导跳过 ──\n onGuideSkip: function onGuideSkip() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.landAfterMobileGuide();\n },\n // ── 引导完成 ──\n onGuideComplete: function onGuideComplete() {\n if (this.isMobileGuide) {\n (0, _guideHelper.markMobileGuideCompleted)();\n } else {\n (0, _guideHelper.markGuideCompleted)();\n }\n\n this.showGuide = false;\n this.landAfterMobileGuide();\n },\n // ── 引导结束后的落地页:新用户(无聊天记录)停留在无会话的聊天页时\n // 没有可聊对象,带回智能体选择页,让其可以直接挑选 Agent 发起会话 ──\n landAfterMobileGuide: function landAfterMobileGuide() {\n if (!this.isMobileGuide) return;\n var isNewUser = !this.sessionList.some(function (s) {\n return s.lastContent;\n });\n\n if (isNewUser && !this.activeSessionId) {\n this.showAgentSelect = true;\n this.showH5List = false;\n }\n },\n // ── 引导关闭(动画结束后) ──\n handleGuideClosed: function handleGuideClosed() {\n this.showGuide = false;\n this.guidePageTransitioning = false; // 如果用户在引导期间被带到了详情页,但引导已完成,不需要额外操作\n }\n },\n beforeDestroy: function beforeDestroy() {\n window.removeEventListener('resize', this.updateViewportState);\n document.removeEventListener('touchmove', this._onSwipeMove);\n document.removeEventListener('touchend', this._onSwipeEnd);\n window.removeEventListener('popstate', this._onPopState);\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/components/chatMain/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
885
885
 
886
886
  /***/ }),
887
887
 
@@ -11075,7 +11075,7 @@ eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\
11075
11075
  /*! exports provided: name, version, main, private, scripts, dependencies, devDependencies, browserslist, directories, keywords, license, files, default */
11076
11076
  /***/ (function(module) {
11077
11077
 
11078
- eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.21\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11078
+ eval("module.exports = JSON.parse(\"{\\\"name\\\":\\\"zj-plugin-intelligent\\\",\\\"version\\\":\\\"1.2.8-beta.22\\\",\\\"main\\\":\\\"lib/ZjPluginIntelligent.umd.min.js\\\",\\\"private\\\":false,\\\"scripts\\\":{\\\"serve\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve\\\",\\\"build\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build\\\",\\\"lib\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\",\\\"lib:test\\\":\\\"set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build --mode test --target lib --name ZjPluginIntelligent --dest lib src/lib/index.js\\\"},\\\"dependencies\\\":{\\\"@jboltai/tokui\\\":\\\"^0.1.6\\\",\\\"crypto-js\\\":\\\"^4.2.0\\\",\\\"html2canvas\\\":\\\"^1.4.1\\\",\\\"markdown-it\\\":\\\"^14.1.0\\\"},\\\"devDependencies\\\":{\\\"@babel/preset-env\\\":\\\"^7.14.9\\\",\\\"@vue/cli-plugin-babel\\\":\\\"~4.5.0\\\",\\\"@vue/cli-plugin-eslint\\\":\\\"^4.5.13\\\",\\\"@vue/cli-plugin-vuex\\\":\\\"~4.5.0\\\",\\\"@vue/cli-service\\\":\\\"~4.5.0\\\",\\\"axios\\\":\\\"^0.27.2\\\",\\\"babel-eslint\\\":\\\"^10.1.0\\\",\\\"babel-plugin-component\\\":\\\"^1.1.1\\\",\\\"compression-webpack-plugin\\\":\\\"^6.0.3\\\",\\\"core-js\\\":\\\"^3.6.5\\\",\\\"element-ui\\\":\\\"^2.15.4\\\",\\\"eslint\\\":\\\"^7.30.0\\\",\\\"eslint-plugin-vue\\\":\\\"^7.13.0\\\",\\\"js-cookie\\\":\\\"^2.2.1\\\",\\\"obs-upload\\\":\\\"^1.0.4\\\",\\\"pako\\\":\\\"^2.1.0\\\",\\\"reconnecting-websocket\\\":\\\"^4.4.0\\\",\\\"sass\\\":\\\"^1.71.0\\\",\\\"sass-loader\\\":\\\"^8.0.2\\\",\\\"snowflake-id\\\":\\\"^1.1.0\\\",\\\"vue\\\":\\\"^2.6.11\\\",\\\"vue-template-compiler\\\":\\\"^2.6.11\\\",\\\"vuex\\\":\\\"^3.4.0\\\",\\\"webpack-bundle-analyzer\\\":\\\"^4.4.2\\\"},\\\"browserslist\\\":[\\\"> 1%\\\",\\\"last 2 versions\\\",\\\"not dead\\\"],\\\"directories\\\":{\\\"lib\\\":\\\"lib\\\"},\\\"keywords\\\":[],\\\"license\\\":\\\"ISC\\\",\\\"files\\\":[\\\"lib\\\"]}\");\n\n//# sourceURL=webpack://ZjPluginIntelligent/./package.json?");
11079
11079
 
11080
11080
  /***/ }),
11081
11081
 
@@ -12111,7 +12111,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
12111
12111
  /***/ (function(module, exports, __webpack_require__) {
12112
12112
 
12113
12113
  "use strict";
12114
- eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 09:24:39\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12114
+ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/interopRequireDefault */ \"./node_modules/@babel/runtime/helpers/interopRequireDefault.js\").default;\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setAuth = setAuth;\nexports.setToken = setToken;\nexports.setUserNo = setUserNo;\nexports.getAuth = getAuth;\nexports.setBaseURL = setBaseURL;\nexports.signQueryParams = signQueryParams;\nexports.default = void 0;\n\nvar _axios = _interopRequireDefault(__webpack_require__(/*! axios */ \"./node_modules/axios/index.js\"));\n\nvar _cookie = __webpack_require__(/*! @lib/utils/cookie.js */ \"./src/lib/utils/cookie.js\");\n\nvar _message = __webpack_require__(/*! @lib/utils/message.js */ \"./src/lib/utils/message.js\");\n\n/*\r\n * @Author: 高瑞廷 2419056691@qq.com\r\n * @Date: 2026-06-04 11:27:13\r\n * @LastEditors: 高瑞廷 2419056691@qq.com\r\n * @LastEditTime: 2026-08-24 16:20:29\r\n * @FilePath: \\zjkj-nodejs-npm_customer-client\\src\\lib\\utils\\request.js\r\n * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r\n */\nvar runtimeAK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_AK || '';\nvar runtimeSK = Object({\"NODE_ENV\":\"test\",\"VUE_APP_API\":\"https://api.qgbtech.cn\",\"VUE_APP_BASE_API\":\"https://ai.jybtech.cn\",\"VUE_APP_EMTERPRISE\":\"/enterprise-managerment\",\"VUE_APP_NAME\":\"development\",\"BASE_URL\":\"/\"}).VUE_APP_BASE_SK || ''; // let runtimeToken = ''\n\nvar runtimeToken = '';\nvar _user = '';\nvar _companyNo = '';\nvar _userNo = '';\nvar runtimeBaseURL = \"https://ai.jybtech.cn\" || false;\n\nvar CryptoJS = __webpack_require__(/*! crypto-js */ \"./node_modules/crypto-js/index.js\");\n\nvar service = _axios.default.create({\n baseURL: runtimeBaseURL,\n timeout: 15000\n});\n\nfunction hmacSha256Base64(rawSignStr, sk) {\n var hmac = CryptoJS.HmacSHA256(rawSignStr, sk); // 转为 Base64\n\n return CryptoJS.enc.Base64.stringify(hmac);\n}\n\nfunction setAuth(ak, sk, user, companyNo, token, userno) {\n runtimeAK = ak || '';\n runtimeSK = sk || '';\n _user = user;\n _companyNo = companyNo;\n runtimeToken = token || '';\n}\n\nfunction setToken(token) {\n runtimeToken = token || '';\n}\n\nfunction setUserNo(userno) {\n _userNo = userno || '';\n}\n\nfunction getAuth() {\n return {\n ak: runtimeAK,\n sk: runtimeSK,\n token: runtimeToken,\n user: _user,\n companyNo: _companyNo,\n userno: _userNo\n };\n}\n\nfunction setBaseURL(url) {\n runtimeBaseURL = url || '';\n service.defaults.baseURL = runtimeBaseURL;\n}\n\nfunction signQueryParams(params, secretKey) {\n var keys = Object.keys(params).filter(function (k) {\n return k !== 'ak' && k !== 'sign';\n }).sort();\n var raw = keys.map(function (k) {\n return \"\".concat(k, \"=\").concat(params[k] || '');\n }).join('&');\n return hmacSha256Base64(raw, secretKey);\n}\n\nservice.interceptors.request.use(function (config) {\n // 流式接口跳过 Header 签名\n if (config.url.includes('/chat/stream')) {\n return config;\n }\n\n var ts = Date.now().toString();\n var token = runtimeToken || (0, _cookie.getToken)();\n var externalUser = _user || '';\n var signParts = []; // 1. 第一位:token(有值才加入)\n\n if (_companyNo) {\n signParts.push(\"companyNo=\".concat(_companyNo));\n }\n\n if (token) {\n signParts.push(\"token=\".concat(token));\n } // 2. 第二位:user(有值才加入)\n\n\n if (externalUser) {\n signParts.push(\"user=\".concat(externalUser));\n } // 3. 第三位:ts(必选,永远存在)\n\n\n signParts.push(\"ts=\".concat(ts)); // 拼接最终待签字符串\n\n var signStr = signParts.join('&'); // 计算签名\n\n var sign = hmacSha256Base64(signStr, runtimeSK);\n\n if (_companyNo) {\n config.headers['X-Company-No'] = _companyNo;\n } // 设置请求头\n\n\n config.headers['X-AK'] = runtimeAK;\n config.headers['X-Ts'] = ts;\n config.headers['X-Sign'] = sign;\n var rawToken = (token || '').trim();\n\n if (rawToken) {\n config.headers['X-Auth-Token'] = \"\".concat(rawToken);\n config.headers.Authorization = \"Bearer \".concat(rawToken);\n }\n\n config.headers['X-External-User'] = externalUser;\n config.headers['Content-Type'] = 'application/json'; // console.log('排序后key:', sortedKeys)\n\n return config;\n}, function (error) {\n return Promise.reject(error);\n});\nservice.interceptors.response.use(function (response) {\n // 解密返回数据(迁移自 http/index.js)\n if (response.headers.isencryption && response.headers.isencryption == 1 && response.data.payload) {\n var param = ['data', 'result', 'records'];\n var current = param.find(function (i) {\n return i in response.data;\n });\n\n if (current) {\n var decryptData = window.spiderHack.decryptJson(response.data.payload);\n var dataType = response.headers.datatype;\n var handler = {\n object: JSON.parse,\n list: JSON.parse,\n long: parseFloat,\n integer: parseFloat,\n boolean: function boolean(parse) {\n return typeof parse === 'boolean' ? parse : !!(typeof parse === 'string' && parse === 'true');\n }\n };\n response.data[current] = handler[dataType] ? handler[dataType](decryptData) : decryptData;\n }\n }\n\n var res = response.data;\n\n if (res.code === 200) {\n return res;\n } else if (res.code === 40101) {\n (0, _message.showMessage)('登录已过期,请重新登录');\n return Promise.reject(new Error(res.message));\n } else {\n (0, _message.showMessage)(res.message || res.msg || '请求失败');\n return Promise.reject(new Error(res.message));\n }\n}, function (error) {\n (0, _message.showMessage)(error.message || '网络异常');\n return Promise.reject(error);\n});\nvar _default = service;\nexports.default = _default;\n\n//# sourceURL=webpack://ZjPluginIntelligent/./src/lib/utils/request.js?");
12115
12115
 
12116
12116
  /***/ }),
12117
12117
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zj-plugin-intelligent",
3
- "version": "1.2.8-beta.21",
3
+ "version": "1.2.8-beta.22",
4
4
  "main": "lib/ZjPluginIntelligent.umd.min.js",
5
5
  "private": false,
6
6
  "scripts": {