diff --git a/frontend/src/stores/account-auth.js b/frontend/src/stores/account-auth.js index 6bb4b270b3..dcc098b156 100644 --- a/frontend/src/stores/account-auth.js +++ b/frontend/src/stores/account-auth.js @@ -162,6 +162,10 @@ export const useAccountAuthStore = defineStore('account-auth', { } } + useProductExpertSupportAgentStore().$reset() + useProductExpertInsightsAgentStore().$reset() + useProductExpertStore().$reset() + if (router.currentRoute.value.meta.requiresLogin !== false) { const currentPath = router.currentRoute.value.fullPath === '/' ? window.location.pathname + window.location.search + window.location.hash @@ -207,25 +211,7 @@ export const useAccountAuthStore = defineStore('account-auth', { ) return disconnect .then(() => userApi.logout()) - .then(() => { - useAccountAuthStore().$reset() - useAccountStore().$reset() - useUxLoadingStore().$reset() - useAccountSettingsStore().$reset() - useUxDialogStore().$reset() - useUxToursStore().$reset() - useUxNavigationStore().$reset() - useUxDrawersStore().$reset() - useUxStore().$reset() - useContextStore().$reset() - useCookieConsentStore().reset() - useProductTablesStore().$reset() - useProductBrokersStore().$reset() - useProductAssistantStore().$reset() - useProductExpertSupportAgentStore().$reset() - useProductExpertInsightsAgentStore().$reset() - useProductExpertStore().$reset() - }) + .then(() => this.clearStores()) .catch(_ => {}) .finally(() => { if (window._hsq) { @@ -233,6 +219,25 @@ export const useAccountAuthStore = defineStore('account-auth', { } window.location = logoutURL }) + }, + clearStores () { + useAccountAuthStore().$reset() + useAccountStore().$reset() + useUxLoadingStore().$reset() + useAccountSettingsStore().$reset() + useUxDialogStore().$reset() + useUxToursStore().$reset() + useUxNavigationStore().$reset() + useUxDrawersStore().$reset() + useUxStore().$reset() + useContextStore().$reset() + useCookieConsentStore().reset() + useProductTablesStore().$reset() + useProductBrokersStore().$reset() + useProductAssistantStore().$reset() + useProductExpertSupportAgentStore().$reset() + useProductExpertInsightsAgentStore().$reset() + useProductExpertStore().$reset() } }, persist: { diff --git a/frontend/src/stores/product-expert-insights-agent.js b/frontend/src/stores/product-expert-insights-agent.js index 79b9ec7f6c..e3d34eda53 100644 --- a/frontend/src/stores/product-expert-insights-agent.js +++ b/frontend/src/stores/product-expert-insights-agent.js @@ -46,5 +46,17 @@ export const useProductExpertInsightsAgentStore = defineStore('product-expert-in const data = await expertApi.getCapabilities({ context: { teamId: team.id } }) this.capabilityServers = data.servers || [] } + }, + persist: { + pick: ['messages', 'sessionId', 'sessionStartTime', 'sessionWarningShown', 'sessionExpiredShown', 'selectedCapabilities'], + storage: localStorage, + afterHydrate (store) { + store.messages.forEach(msg => { + msg._streamed = true + if (msg.answer) { + msg.answer.forEach(a => { a._streamed = true }) + } + }) + } } }) diff --git a/frontend/src/stores/product-expert-support-agent.js b/frontend/src/stores/product-expert-support-agent.js index e41aa6acd5..ed82ef49ca 100644 --- a/frontend/src/stores/product-expert-support-agent.js +++ b/frontend/src/stores/product-expert-support-agent.js @@ -28,7 +28,15 @@ export const useProductExpertSupportAgentStore = defineStore('product-expert-sup } }, persist: { - pick: ['context'], - storage: localStorage + pick: ['context', 'messages', 'sessionId', 'sessionStartTime', 'sessionWarningShown', 'sessionExpiredShown'], + storage: localStorage, + afterHydrate (store) { + store.messages.forEach(msg => { + msg._streamed = true + if (msg.answer) { + msg.answer.forEach(a => { a._streamed = true }) + } + }) + } } }) diff --git a/frontend/src/stores/product-expert.js b/frontend/src/stores/product-expert.js index f1df68056f..168b68015d 100644 --- a/frontend/src/stores/product-expert.js +++ b/frontend/src/stores/product-expert.js @@ -144,6 +144,9 @@ export const useProductExpertStore = defineStore('product-expert', { this.setAgentMode(INSIGHTS_AGENT) } + // Resume the session check interval if a persisted session exists (e.g. after page refresh) + this.resumeSessionTimer() + // In immersive editor context, navigate to the Expert tab instead of opening RightDrawer const contextStore = useContextStore() if (contextStore.isImmersiveEditor) { @@ -664,26 +667,13 @@ export const useProductExpertStore = defineStore('product-expert', { } }, // Session timing actions - startSessionTimer () { + _startSessionCheckInterval () { const agentStore = this._agentStore - - // Clear any existing timer - if (agentStore.sessionCheckTimer) { - clearInterval(agentStore.sessionCheckTimer) - } - - // Set session start time - agentStore.sessionStartTime = Date.now() - agentStore.sessionWarningShown = false - agentStore.sessionExpiredShown = false - - // Check every 30 seconds if we've reached the warning/expiration threshold const timer = setInterval(() => { const elapsed = Date.now() - agentStore.sessionStartTime const warningThreshold = 25 * 60 * 1000 // 25 minutes const expirationThreshold = 28 * 60 * 1000 // 28 minutes - // Show 25-minute warning if (elapsed >= warningThreshold && !agentStore.sessionWarningShown) { agentStore.sessionWarningShown = true this.addSystemMessage({ @@ -692,7 +682,6 @@ export const useProductExpertStore = defineStore('product-expert', { }) } - // Show 30-minute expiration if (elapsed >= expirationThreshold && !agentStore.sessionExpiredShown) { agentStore.sessionExpiredShown = true this.addSystemMessage({ @@ -700,10 +689,23 @@ export const useProductExpertStore = defineStore('product-expert', { type: 'expired' }) } - }, 30000) // Check every 30 seconds + }, 30000) agentStore.setSessionCheckTimer(timer) }, + startSessionTimer () { + const agentStore = this._agentStore + + if (agentStore.sessionCheckTimer) { + clearInterval(agentStore.sessionCheckTimer) + } + + agentStore.sessionStartTime = Date.now() + agentStore.sessionWarningShown = false + agentStore.sessionExpiredShown = false + + this._startSessionCheckInterval() + }, resetSessionTimer () { const agentStore = this._agentStore if (agentStore.sessionCheckTimer) { @@ -714,6 +716,13 @@ export const useProductExpertStore = defineStore('product-expert', { agentStore.sessionWarningShown = false agentStore.sessionExpiredShown = false }, + // Restart the session check interval without resetting sessionStartTime. + // Used after page refresh to let the persisted timer continue its course. + resumeSessionTimer () { + const agentStore = this._agentStore + if (!agentStore.sessionStartTime || agentStore.sessionCheckTimer) return + this._startSessionCheckInterval() + }, /** * * @param {'support-agent' | 'insights-agent'} mode @@ -1300,7 +1309,7 @@ export const useProductExpertStore = defineStore('product-expert', { } }, persist: { - pick: ['shouldWakeUpAssistant', 'questionCadence'], + pick: ['shouldWakeUpAssistant', 'questionCadence', 'agentMode'], storage: localStorage } })