From 9ce3bd2f82e8d2121fef065c145cc9a47ed979a8 Mon Sep 17 00:00:00 2001 From: Ammar Date: Fri, 5 Dec 2025 14:55:23 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20feat:=20include=20workspaceId=20?= =?UTF-8?q?in=20message=5Fsent=20telemetry=20payload?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add workspace ID (already random/anonymous) to the message_sent event to enable per-workspace analytics without exposing user information. - Add workspaceId field to MessageSentPayload interface - Update trackMessageSent function signature in tracking.ts - Update useTelemetry hook to accept workspaceId parameter - Update ChatInput call site to pass props.workspaceId - Update oRPC schema for MessageSentPropertiesSchema --- src/browser/components/ChatInput/index.tsx | 1 + src/browser/hooks/useTelemetry.ts | 5 +++-- src/common/orpc/schemas/telemetry.ts | 1 + src/common/telemetry/payload.ts | 2 ++ src/common/telemetry/tracking.ts | 2 ++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/browser/components/ChatInput/index.tsx b/src/browser/components/ChatInput/index.tsx index 235bacd253..674ccf2aea 100644 --- a/src/browser/components/ChatInput/index.tsx +++ b/src/browser/components/ChatInput/index.tsx @@ -1018,6 +1018,7 @@ export const ChatInput: React.FC = (props) => { } else { // Track telemetry for successful message send telemetry.messageSent( + props.workspaceId, sendMessageOptions.model, mode, actualMessageText.length, diff --git a/src/browser/hooks/useTelemetry.ts b/src/browser/hooks/useTelemetry.ts index 301b92226b..329e92e9fa 100644 --- a/src/browser/hooks/useTelemetry.ts +++ b/src/browser/hooks/useTelemetry.ts @@ -29,7 +29,7 @@ import type { * * telemetry.workspaceSwitched(fromId, toId); * telemetry.workspaceCreated(workspaceId, runtimeType); - * telemetry.messageSent(model, mode, messageLength, runtimeType, thinkingLevel); + * telemetry.messageSent(workspaceId, model, mode, messageLength, runtimeType, thinkingLevel); * telemetry.streamCompleted(model, wasInterrupted, durationSecs, outputTokens); * telemetry.providerConfigured(provider, keyType); * telemetry.commandUsed(commandType); @@ -48,13 +48,14 @@ export function useTelemetry() { const messageSent = useCallback( ( + workspaceId: string, model: string, mode: string, messageLength: number, runtimeType: TelemetryRuntimeType, thinkingLevel: TelemetryThinkingLevel ) => { - trackMessageSent(model, mode, messageLength, runtimeType, thinkingLevel); + trackMessageSent(workspaceId, model, mode, messageLength, runtimeType, thinkingLevel); }, [] ); diff --git a/src/common/orpc/schemas/telemetry.ts b/src/common/orpc/schemas/telemetry.ts index 6dec67c06c..bc3e3d9c05 100644 --- a/src/common/orpc/schemas/telemetry.ts +++ b/src/common/orpc/schemas/telemetry.ts @@ -61,6 +61,7 @@ const WorkspaceSwitchedPropertiesSchema = z.object({ }); const MessageSentPropertiesSchema = z.object({ + workspaceId: z.string(), model: z.string(), mode: z.string(), message_length_b2: z.number(), diff --git a/src/common/telemetry/payload.ts b/src/common/telemetry/payload.ts index 45c42415fc..5cafb390cd 100644 --- a/src/common/telemetry/payload.ts +++ b/src/common/telemetry/payload.ts @@ -92,6 +92,8 @@ export type TelemetryThinkingLevel = "off" | "low" | "medium" | "high"; * Chat/AI interaction events */ export interface MessageSentPayload { + /** Workspace ID (randomly generated, safe to send) */ + workspaceId: string; /** Full model identifier (e.g., 'anthropic/claude-3-5-sonnet-20241022') */ model: string; /** UI mode (e.g., 'plan', 'exec', 'edit') */ diff --git a/src/common/telemetry/tracking.ts b/src/common/telemetry/tracking.ts index 162cdb139a..c033b804e6 100644 --- a/src/common/telemetry/tracking.ts +++ b/src/common/telemetry/tracking.ts @@ -65,6 +65,7 @@ export function trackWorkspaceSwitched(fromWorkspaceId: string, toWorkspaceId: s * @param messageLength - Raw character count (will be rounded to base-2) */ export function trackMessageSent( + workspaceId: string, model: string, mode: string, messageLength: number, @@ -74,6 +75,7 @@ export function trackMessageSent( trackEvent({ event: "message_sent", properties: { + workspaceId, model, mode, message_length_b2: roundToBase2(messageLength),