From 137f0e726beec896a034c1c0ac829cce90c1bec7 Mon Sep 17 00:00:00 2001 From: Pranav Date: Thu, 29 Jan 2026 09:56:29 -0800 Subject: [PATCH] Summaries in the ChatList --- .../widgets/conversation/ConversationCard.vue | 40 ++++- .../conversation/ConversationSummary.vue | 90 +++++++++++ .../dashboard/composables/useUISettings.js | 1 + .../dashboard/i18n/locale/en/chatlist.json | 7 +- .../i18n/locale/en/conversation.json | 9 ++ .../dashboard/conversation/ContactPanel.vue | 32 +++- .../conversation/ConversationSummary.vue | 150 ++++++++++++++++++ .../openai/openai_prompts/summary.liquid | 51 +++--- 8 files changed, 349 insertions(+), 31 deletions(-) create mode 100644 app/javascript/dashboard/components/widgets/conversation/ConversationSummary.vue create mode 100644 app/javascript/dashboard/routes/dashboard/conversation/ConversationSummary.vue diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue index 5093e5c4b..cff40f2aa 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ConversationCard.vue @@ -1,6 +1,7 @@ + + diff --git a/app/javascript/dashboard/composables/useUISettings.js b/app/javascript/dashboard/composables/useUISettings.js index 9f1943414..7e3d7ba27 100644 --- a/app/javascript/dashboard/composables/useUISettings.js +++ b/app/javascript/dashboard/composables/useUISettings.js @@ -2,6 +2,7 @@ import { computed } from 'vue'; import { useStore, useStoreGetters } from 'dashboard/composables/store'; export const DEFAULT_CONVERSATION_SIDEBAR_ITEMS_ORDER = Object.freeze([ + { name: 'conversation_summary' }, { name: 'conversation_actions' }, { name: 'macros' }, { name: 'conversation_info' }, diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json index 92e67635b..b12dbb2b8 100644 --- a/app/javascript/dashboard/i18n/locale/en/chatlist.json +++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json @@ -137,6 +137,11 @@ "HIDE_QUOTED_TEXT": "Hide Quoted Text", "SHOW_QUOTED_TEXT": "Show Quoted Text", "MESSAGE_READ": "Read", - "SENDING": "Sending" + "SENDING": "Sending", + "SUMMARY": { + "TITLE": "Generate Summary", + "LOADING": "Generating summary...", + "ERROR": "Failed to generate summary" + } } } diff --git a/app/javascript/dashboard/i18n/locale/en/conversation.json b/app/javascript/dashboard/i18n/locale/en/conversation.json index 010c8c171..67a17e989 100644 --- a/app/javascript/dashboard/i18n/locale/en/conversation.json +++ b/app/javascript/dashboard/i18n/locale/en/conversation.json @@ -347,6 +347,7 @@ "CONVERSATION_ACTIONS": "Conversation Actions", "CONVERSATION_LABELS": "Conversation Labels", "CONVERSATION_INFO": "Conversation Information", + "CONVERSATION_SUMMARY": "AI Summary", "CONTACT_NOTES": "Contact Notes", "CONTACT_ATTRIBUTES": "Contact Attributes", "PREVIOUS_CONVERSATION": "Previous Conversations", @@ -354,6 +355,14 @@ "LINEAR_ISSUES": "Linked Linear Issues", "SHOPIFY_ORDERS": "Shopify Orders" }, + "SUMMARY": { + "DESCRIPTION": "Generate an AI-powered summary of this conversation", + "GENERATE": "Generate Summary", + "REGENERATE": "Regenerate", + "RETRY": "Retry", + "ERROR": "Failed to generate summary", + "EMPTY": "No summary available" + }, "SHOPIFY": { "ORDER_ID": "Order #{id}", "ERROR": "Error loading orders", diff --git a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue index b163bfdc8..839848a50 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/ContactPanel.vue @@ -13,6 +13,7 @@ import AccordionItem from 'dashboard/components/Accordion/AccordionItem.vue'; import ContactConversations from './ContactConversations.vue'; import ConversationAction from './ConversationAction.vue'; import ConversationParticipant from './ConversationParticipant.vue'; +import ConversationSummary from './ConversationSummary.vue'; import ContactInfo from './contact/ContactInfo.vue'; import ContactNotes from './contact/ContactNotes.vue'; import ConversationInfo from './ConversationInfo.vue'; @@ -44,6 +45,7 @@ const { const dragging = ref(false); const conversationSidebarItems = ref([]); +const summaryRef = ref(null); const shopifyIntegration = useFunctionGetter( 'integrations/getIntegration', @@ -60,6 +62,10 @@ const isLinearFeatureEnabled = computed(() => isCloudFeatureEnabled(FEATURE_FLAGS.LINEAR) ); +const isCaptainTasksEnabled = computed(() => + isCloudFeatureEnabled(FEATURE_FLAGS.CAPTAIN_TASKS) +); + const linearIntegration = useFunctionGetter( 'integrations/getIntegration', 'linear' @@ -150,7 +156,31 @@ onMounted(() => { >