From 736abb5bb7413edd31592f398897a06dd0771781 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Fri, 31 Oct 2025 23:11:40 -0700 Subject: [PATCH 1/8] Add buttom telemetry foundation and comfy_logo --- src/components/sidebar/ComfyMenuButton.vue | 10 +++++++++- .../providers/cloud/MixpanelTelemetryProvider.ts | 5 +++++ src/platform/telemetry/types.ts | 16 +++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/components/sidebar/ComfyMenuButton.vue b/src/components/sidebar/ComfyMenuButton.vue index 19aa5b0a0f..893bf4d579 100644 --- a/src/components/sidebar/ComfyMenuButton.vue +++ b/src/components/sidebar/ComfyMenuButton.vue @@ -4,7 +4,7 @@ :class="{ 'comfy-menu-button-active': menuRef?.visible }" - @click="menuRef?.toggle($event)" + @click="onLogoMenuClick($event)" > (null) +const telemetry = useTelemetry() + +function onLogoMenuClick(event: MouseEvent) { + telemetry?.trackUiButtonClicked({ button_id: 'comfy_logo' }) + menuRef.value?.toggle(event) +} + const translateMenuItem = (item: MenuItem): MenuItem => { const label = typeof item.label === 'function' ? item.label() : item.label const translatedLabel = label diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index a669235011..7a39e94f27 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -28,6 +28,7 @@ import type { TemplateLibraryMetadata, TemplateLibraryClosedMetadata, TemplateMetadata, + UiButtonClickMetadata, WorkflowImportMetadata } from '../../types' import { TelemetryEvents } from '../../types' @@ -282,6 +283,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { this.trackEvent(TelemetryEvents.EXECUTION_SUCCESS, metadata) } + trackUiButtonClicked(metadata: UiButtonClickMetadata): void { + this.trackEvent(TelemetryEvents.UI_BUTTON_CLICKED, metadata) + } + getExecutionContext(): ExecutionContext { const workflowStore = useWorkflowStore() const templatesStore = useWorkflowTemplatesStore() diff --git a/src/platform/telemetry/types.ts b/src/platform/telemetry/types.ts index fd9225c2cc..964a3da074 100644 --- a/src/platform/telemetry/types.ts +++ b/src/platform/telemetry/types.ts @@ -192,6 +192,14 @@ export interface TemplateFilterMetadata { total_count: number } +/** + * UI button click tracking metadata + */ +export interface UiButtonClickMetadata { + /** Canonical identifier for the button (e.g., "comfy_logo") */ + button_id: string +} + /** * Core telemetry provider interface */ @@ -239,6 +247,9 @@ export interface TelemetryProvider { trackWorkflowExecution(): void trackExecutionError(metadata: ExecutionErrorMetadata): void trackExecutionSuccess(metadata: ExecutionSuccessMetadata): void + + // Generic UI button click events + trackUiButtonClicked(metadata: UiButtonClickMetadata): void } /** @@ -296,7 +307,9 @@ export const TelemetryEvents = { // Execution Lifecycle EXECUTION_START: 'execution_start', EXECUTION_ERROR: 'execution_error', - EXECUTION_SUCCESS: 'execution_success' + EXECUTION_SUCCESS: 'execution_success', + // Generic UI Button Click + UI_BUTTON_CLICKED: 'app:ui_button_clicked' } as const export type TelemetryEventName = @@ -322,3 +335,4 @@ export type TelemetryEventProperties = | NodeSearchMetadata | NodeSearchResultMetadata | TemplateFilterMetadata + | UiButtonClickMetadata From 533306bce7e778d0da1d8300666b8d8e08193c56 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Fri, 31 Oct 2025 23:37:38 -0700 Subject: [PATCH 2/8] Add telemetry from General section --- src/components/sidebar/SideToolbar.vue | 24 ++++++++++++++++++- .../SidebarBottomPanelToggleButton.vue | 11 ++++++++- .../sidebar/SidebarHelpCenterIcon.vue | 5 ++++ .../sidebar/SidebarShortcutsToggleButton.vue | 5 ++++ .../sidebar/SidebarTemplatesButton.vue | 5 ++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/components/sidebar/SideToolbar.vue b/src/components/sidebar/SideToolbar.vue index bac974f1f1..950d82bf60 100644 --- a/src/components/sidebar/SideToolbar.vue +++ b/src/components/sidebar/SideToolbar.vue @@ -57,6 +57,7 @@ import ComfyMenuButton from '@/components/sidebar/ComfyMenuButton.vue' import SidebarBottomPanelToggleButton from '@/components/sidebar/SidebarBottomPanelToggleButton.vue' import SidebarShortcutsToggleButton from '@/components/sidebar/SidebarShortcutsToggleButton.vue' import { useSettingStore } from '@/platform/settings/settingStore' +import { useTelemetry } from '@/platform/telemetry' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { useCommandStore } from '@/stores/commandStore' import { useKeybindingStore } from '@/stores/keybindingStore' @@ -97,10 +98,31 @@ const isConnected = computed( const tabs = computed(() => workspaceStore.getSidebarTabs()) const selectedTab = computed(() => workspaceStore.sidebarTab.activeSidebarTab) -const onTabClick = async (item: SidebarTabExtension) => +/** + * Handle sidebar tab icon click. + * - Emits UI button telemetry for known tabs + * - Delegates to the corresponding toggle command + */ +const onTabClick = async (item: SidebarTabExtension) => { + const telemetry = useTelemetry() + + const isNodeLibraryTab = item.id === 'node-library' + const isModelLibraryTab = item.id === 'model-library' + const isWorkflowsTab = item.id === 'workflows' + const isAssetsTab = item.id === 'assets' + + if (isNodeLibraryTab) + telemetry?.trackUiButtonClicked({ button_id: 'node_library' }) + else if (isModelLibraryTab) + telemetry?.trackUiButtonClicked({ button_id: 'model_library' }) + else if (isWorkflowsTab) + telemetry?.trackUiButtonClicked({ button_id: 'workflows' }) + else if (isAssetsTab) telemetry?.trackUiButtonClicked({ button_id: 'assets' }) + await commandStore.commands .find((cmd) => cmd.id === `Workspace.ToggleSidebarTab.${item.id}`) ?.function?.() +} const keybindingStore = useKeybindingStore() const getTabTooltipSuffix = (tab: SidebarTabExtension) => { diff --git a/src/components/sidebar/SidebarBottomPanelToggleButton.vue b/src/components/sidebar/SidebarBottomPanelToggleButton.vue index e4fcb3f1d9..3a79411c41 100644 --- a/src/components/sidebar/SidebarBottomPanelToggleButton.vue +++ b/src/components/sidebar/SidebarBottomPanelToggleButton.vue @@ -3,7 +3,7 @@ :label="$t('sideToolbar.labels.console')" :tooltip="$t('menu.toggleBottomPanel')" :selected="bottomPanelStore.activePanel == 'terminal'" - @click="bottomPanelStore.toggleBottomPanel" + @click="toggleConsole" > diff --git a/src/components/sidebar/SidebarHelpCenterIcon.vue b/src/components/sidebar/SidebarHelpCenterIcon.vue index 368b2aa169..9564d4de37 100644 --- a/src/components/sidebar/SidebarHelpCenterIcon.vue +++ b/src/components/sidebar/SidebarHelpCenterIcon.vue @@ -65,6 +65,7 @@ import { computed, onMounted, toRefs } from 'vue' import HelpCenterMenuContent from '@/components/helpcenter/HelpCenterMenuContent.vue' import { useSettingStore } from '@/platform/settings/settingStore' +import { useTelemetry } from '@/platform/telemetry' import { useReleaseStore } from '@/platform/updates/common/releaseStore' import ReleaseNotificationToast from '@/platform/updates/components/ReleaseNotificationToast.vue' import WhatsNewPopup from '@/platform/updates/components/WhatsNewPopup.vue' @@ -104,7 +105,11 @@ const sidebarLocation = computed(() => settingStore.get('Comfy.Sidebar.Location') ) +/** + * Toggle Help Center and track UI button click. + */ const toggleHelpCenter = () => { + useTelemetry()?.trackUiButtonClicked({ button_id: 'help_center' }) helpCenterStore.toggle() } diff --git a/src/components/sidebar/SidebarShortcutsToggleButton.vue b/src/components/sidebar/SidebarShortcutsToggleButton.vue index bf80cd1ff6..a1b56ac1d8 100644 --- a/src/components/sidebar/SidebarShortcutsToggleButton.vue +++ b/src/components/sidebar/SidebarShortcutsToggleButton.vue @@ -15,6 +15,7 @@ import { computed } from 'vue' import { useI18n } from 'vue-i18n' +import { useTelemetry } from '@/platform/telemetry' import { useCommandStore } from '@/stores/commandStore' import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore' @@ -34,7 +35,11 @@ const tooltipText = computed( () => `${t('shortcuts.keyboardShortcuts')} (${formatKeySequence(command)})` ) +/** + * Toggle keyboard shortcuts panel and track UI button click. + */ const toggleShortcutsPanel = () => { + useTelemetry()?.trackUiButtonClicked({ button_id: 'keyboard_shortcuts' }) bottomPanelStore.togglePanel('shortcuts') } diff --git a/src/components/sidebar/SidebarTemplatesButton.vue b/src/components/sidebar/SidebarTemplatesButton.vue index d16fd4c09b..426b0539e9 100644 --- a/src/components/sidebar/SidebarTemplatesButton.vue +++ b/src/components/sidebar/SidebarTemplatesButton.vue @@ -14,6 +14,7 @@ import { computed } from 'vue' import { useWorkflowTemplateSelectorDialog } from '@/composables/useWorkflowTemplateSelectorDialog' import { useSettingStore } from '@/platform/settings/settingStore' +import { useTelemetry } from '@/platform/telemetry' import SidebarIcon from './SidebarIcon.vue' @@ -23,7 +24,11 @@ const isSmall = computed( () => settingStore.get('Comfy.Sidebar.Size') === 'small' ) +/** + * Open templates dialog from sidebar and track UI button click. + */ const openTemplates = () => { + useTelemetry()?.trackUiButtonClicked({ button_id: 'templates' }) useWorkflowTemplateSelectorDialog().show('sidebar') } From 593f5dc2667d491995b07dc04c25d18a47b71d99 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Fri, 31 Oct 2025 23:51:29 -0700 Subject: [PATCH 3/8] Add telemetry for Floating bottom right menu --- src/components/graph/GraphCanvasMenu.vue | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/components/graph/GraphCanvasMenu.vue b/src/components/graph/GraphCanvasMenu.vue index 0923db0064..56b844a0d3 100644 --- a/src/components/graph/GraphCanvasMenu.vue +++ b/src/components/graph/GraphCanvasMenu.vue @@ -61,7 +61,7 @@ data-testid="toggle-minimap-button" :style="stringifiedMinimapStyles.buttonStyles" :class="minimapButtonClass" - @click="() => commandStore.execute('Comfy.Canvas.ToggleMinimap')" + @click="onMinimapToggleClick" >