Add telemetry for entering linear mode (#8263)

Standard disclaimer: Telemetry only applies on cloud builds

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8263-Add-telemetry-for-entering-linear-mode-2f16d73d3650819ea53efeeb562ea095)
by [Unito](https://www.unito.io)
This commit is contained in:
AustinMroz
2026-01-22 21:28:41 -08:00
committed by GitHub
parent df85c4d463
commit 7952eb477e
5 changed files with 28 additions and 4 deletions

View File

@@ -5,6 +5,11 @@ import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
import { useCommandStore } from '@/stores/commandStore' import { useCommandStore } from '@/stores/commandStore'
const canvasStore = useCanvasStore() const canvasStore = useCanvasStore()
function toggleLinearMode() {
useCommandStore().execute('Comfy.ToggleLinear', {
metadata: { source: 'button' }
})
}
</script> </script>
<template> <template>
<div class="p-1 bg-secondary-background rounded-lg w-10"> <div class="p-1 bg-secondary-background rounded-lg w-10">
@@ -12,7 +17,7 @@ const canvasStore = useCanvasStore()
size="icon" size="icon"
:title="t('linearMode.linearMode')" :title="t('linearMode.linearMode')"
:variant="canvasStore.linearMode ? 'inverted' : 'secondary'" :variant="canvasStore.linearMode ? 'inverted' : 'secondary'"
@click="useCommandStore().execute('Comfy.ToggleLinear')" @click="toggleLinearMode"
> >
<i class="icon-[lucide--panels-top-left]" /> <i class="icon-[lucide--panels-top-left]" />
</Button> </Button>
@@ -20,7 +25,7 @@ const canvasStore = useCanvasStore()
size="icon" size="icon"
:title="t('linearMode.graphMode')" :title="t('linearMode.graphMode')"
:variant="canvasStore.linearMode ? 'secondary' : 'inverted'" :variant="canvasStore.linearMode ? 'secondary' : 'inverted'"
@click="useCommandStore().execute('Comfy.ToggleLinear')" @click="toggleLinearMode"
> >
<i class="icon-[comfy--workflow]" /> <i class="icon-[comfy--workflow]" />
</Button> </Button>

View File

@@ -1235,8 +1235,11 @@ export function useCoreCommands(): ComfyCommand[] {
id: 'Comfy.ToggleLinear', id: 'Comfy.ToggleLinear',
icon: 'pi pi-database', icon: 'pi pi-database',
label: 'Toggle Simple Mode', label: 'Toggle Simple Mode',
function: () => { function: (metadata?: Record<string, unknown>) => {
const source =
typeof metadata?.source === 'string' ? metadata.source : 'keybind'
const newMode = !canvasStore.linearMode const newMode = !canvasStore.linearMode
if (newMode) useTelemetry()?.trackEnterLinear({ source })
app.rootGraph.extra.linearMode = newMode app.rootGraph.extra.linearMode = newMode
workflowStore.activeWorkflow?.changeTracker?.checkState() workflowStore.activeWorkflow?.changeTracker?.checkState()
canvasStore.linearMode = newMode canvasStore.linearMode = newMode

View File

@@ -17,6 +17,7 @@ import { reduceAllNodes } from '@/utils/graphTraversalUtil'
import type { import type {
AuthMetadata, AuthMetadata,
CreditTopupMetadata, CreditTopupMetadata,
EnterLinearMetadata,
ExecutionContext, ExecutionContext,
ExecutionTriggerSource, ExecutionTriggerSource,
ExecutionErrorMetadata, ExecutionErrorMetadata,
@@ -354,6 +355,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
this.trackEvent(TelemetryEvents.WORKFLOW_OPENED, metadata) this.trackEvent(TelemetryEvents.WORKFLOW_OPENED, metadata)
} }
trackEnterLinear(metadata: EnterLinearMetadata): void {
this.trackEvent(TelemetryEvents.ENTER_LINEAR_MODE, metadata)
}
trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void { trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void {
this.trackEvent(TelemetryEvents.PAGE_VISIBILITY_CHANGED, metadata) this.trackEvent(TelemetryEvents.PAGE_VISIBILITY_CHANGED, metadata)
} }

View File

@@ -124,6 +124,10 @@ export interface WorkflowImportMetadata {
open_source?: 'file_button' | 'file_drop' | 'template' | 'unknown' open_source?: 'file_button' | 'file_drop' | 'template' | 'unknown'
} }
export interface EnterLinearMetadata {
source?: string
}
/** /**
* Workflow open metadata * Workflow open metadata
*/ */
@@ -297,6 +301,7 @@ export interface TelemetryProvider {
// Workflow management events // Workflow management events
trackWorkflowImported(metadata: WorkflowImportMetadata): void trackWorkflowImported(metadata: WorkflowImportMetadata): void
trackWorkflowOpened(metadata: WorkflowImportMetadata): void trackWorkflowOpened(metadata: WorkflowImportMetadata): void
trackEnterLinear(metadata: EnterLinearMetadata): void
// Page visibility events // Page visibility events
trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void trackPageVisibilityChanged(metadata: PageVisibilityMetadata): void
@@ -372,6 +377,7 @@ export const TelemetryEvents = {
// Workflow Management // Workflow Management
WORKFLOW_IMPORTED: 'app:workflow_imported', WORKFLOW_IMPORTED: 'app:workflow_imported',
WORKFLOW_OPENED: 'app:workflow_opened', WORKFLOW_OPENED: 'app:workflow_opened',
ENTER_LINEAR_MODE: 'app:toggle_linear_mode',
// Page Visibility // Page Visibility
PAGE_VISIBILITY_CHANGED: 'app:page_visibility_changed', PAGE_VISIBILITY_CHANGED: 'app:page_visibility_changed',
@@ -441,3 +447,4 @@ export type TelemetryEventProperties =
| HelpResourceClickedMetadata | HelpResourceClickedMetadata
| HelpCenterClosedMetadata | HelpCenterClosedMetadata
| WorkflowCreatedMetadata | WorkflowCreatedMetadata
| EnterLinearMetadata

View File

@@ -10,6 +10,7 @@ import {
ComfyWorkflow, ComfyWorkflow,
useWorkflowStore useWorkflowStore
} from '@/platform/workflow/management/stores/workflowStore' } from '@/platform/workflow/management/stores/workflowStore'
import { useTelemetry } from '@/platform/telemetry'
import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema' import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema'
import { useCanvasStore } from '@/renderer/core/canvas/canvasStore' import { useCanvasStore } from '@/renderer/core/canvas/canvasStore'
import { useWorkflowThumbnail } from '@/renderer/core/thumbnail/useWorkflowThumbnail' import { useWorkflowThumbnail } from '@/renderer/core/thumbnail/useWorkflowThumbnail'
@@ -315,8 +316,11 @@ export const useWorkflowService = () => {
if ( if (
workflowData.extra?.linearMode !== undefined || workflowData.extra?.linearMode !== undefined ||
!workflowData.nodes.length !workflowData.nodes.length
) ) {
if (workflowData.extra?.linearMode && !useCanvasStore().linearMode)
useTelemetry()?.trackEnterLinear({ source: 'workflow' })
useCanvasStore().linearMode = !!workflowData.extra?.linearMode useCanvasStore().linearMode = !!workflowData.extra?.linearMode
}
if (value === null || typeof value === 'string') { if (value === null || typeof value === 'string') {
const path = value as string | null const path = value as string | null