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),