telemetry.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import { z } from "zod"
  2. import { providerNames } from "./provider-settings.js"
  3. import { clineMessageSchema } from "./message.js"
  4. /**
  5. * TelemetrySetting
  6. */
  7. export const telemetrySettings = ["unset", "enabled", "disabled"] as const
  8. export const telemetrySettingsSchema = z.enum(telemetrySettings)
  9. export type TelemetrySetting = z.infer<typeof telemetrySettingsSchema>
  10. /**
  11. * TelemetryEventName
  12. */
  13. export enum TelemetryEventName {
  14. TASK_CREATED = "Task Created",
  15. TASK_RESTARTED = "Task Reopened",
  16. TASK_COMPLETED = "Task Completed",
  17. TASK_MESSAGE = "Task Message",
  18. TASK_CONVERSATION_MESSAGE = "Conversation Message",
  19. LLM_COMPLETION = "LLM Completion",
  20. MODE_SWITCH = "Mode Switched",
  21. TOOL_USED = "Tool Used",
  22. CHECKPOINT_CREATED = "Checkpoint Created",
  23. CHECKPOINT_RESTORED = "Checkpoint Restored",
  24. CHECKPOINT_DIFFED = "Checkpoint Diffed",
  25. TAB_SHOWN = "Tab Shown",
  26. MODE_SETTINGS_CHANGED = "Mode Setting Changed",
  27. CUSTOM_MODE_CREATED = "Custom Mode Created",
  28. CONTEXT_CONDENSED = "Context Condensed",
  29. SLIDING_WINDOW_TRUNCATION = "Sliding Window Truncation",
  30. CODE_ACTION_USED = "Code Action Used",
  31. PROMPT_ENHANCED = "Prompt Enhanced",
  32. TITLE_BUTTON_CLICKED = "Title Button Clicked",
  33. AUTHENTICATION_INITIATED = "Authentication Initiated",
  34. MARKETPLACE_ITEM_INSTALLED = "Marketplace Item Installed",
  35. MARKETPLACE_ITEM_REMOVED = "Marketplace Item Removed",
  36. MARKETPLACE_TAB_VIEWED = "Marketplace Tab Viewed",
  37. MARKETPLACE_INSTALL_BUTTON_CLICKED = "Marketplace Install Button Clicked",
  38. SHARE_BUTTON_CLICKED = "Share Button Clicked",
  39. SHARE_ORGANIZATION_CLICKED = "Share Organization Clicked",
  40. SHARE_PUBLIC_CLICKED = "Share Public Clicked",
  41. SHARE_CONNECT_TO_CLOUD_CLICKED = "Share Connect To Cloud Clicked",
  42. ACCOUNT_CONNECT_CLICKED = "Account Connect Clicked",
  43. ACCOUNT_CONNECT_SUCCESS = "Account Connect Success",
  44. ACCOUNT_LOGOUT_CLICKED = "Account Logout Clicked",
  45. ACCOUNT_LOGOUT_SUCCESS = "Account Logout Success",
  46. SCHEMA_VALIDATION_ERROR = "Schema Validation Error",
  47. DIFF_APPLICATION_ERROR = "Diff Application Error",
  48. SHELL_INTEGRATION_ERROR = "Shell Integration Error",
  49. CONSECUTIVE_MISTAKE_ERROR = "Consecutive Mistake Error",
  50. }
  51. /**
  52. * TelemetryProperties
  53. */
  54. export const appPropertiesSchema = z.object({
  55. appName: z.string(),
  56. appVersion: z.string(),
  57. vscodeVersion: z.string(),
  58. platform: z.string(),
  59. editorName: z.string(),
  60. language: z.string(),
  61. mode: z.string(),
  62. cloudIsAuthenticated: z.boolean().optional(),
  63. })
  64. export const taskPropertiesSchema = z.object({
  65. taskId: z.string().optional(),
  66. apiProvider: z.enum(providerNames).optional(),
  67. modelId: z.string().optional(),
  68. diffStrategy: z.string().optional(),
  69. isSubtask: z.boolean().optional(),
  70. })
  71. export const telemetryPropertiesSchema = z.object({
  72. ...appPropertiesSchema.shape,
  73. ...taskPropertiesSchema.shape,
  74. })
  75. export type TelemetryProperties = z.infer<typeof telemetryPropertiesSchema>
  76. /**
  77. * TelemetryEvent
  78. */
  79. export type TelemetryEvent = {
  80. event: TelemetryEventName
  81. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  82. properties?: Record<string, any>
  83. }
  84. /**
  85. * RooCodeTelemetryEvent
  86. */
  87. export const rooCodeTelemetryEventSchema = z.discriminatedUnion("type", [
  88. z.object({
  89. type: z.enum([
  90. TelemetryEventName.TASK_CREATED,
  91. TelemetryEventName.TASK_RESTARTED,
  92. TelemetryEventName.TASK_COMPLETED,
  93. TelemetryEventName.TASK_CONVERSATION_MESSAGE,
  94. TelemetryEventName.MODE_SWITCH,
  95. TelemetryEventName.TOOL_USED,
  96. TelemetryEventName.CHECKPOINT_CREATED,
  97. TelemetryEventName.CHECKPOINT_RESTORED,
  98. TelemetryEventName.CHECKPOINT_DIFFED,
  99. TelemetryEventName.CODE_ACTION_USED,
  100. TelemetryEventName.PROMPT_ENHANCED,
  101. TelemetryEventName.TITLE_BUTTON_CLICKED,
  102. TelemetryEventName.AUTHENTICATION_INITIATED,
  103. TelemetryEventName.MARKETPLACE_ITEM_INSTALLED,
  104. TelemetryEventName.MARKETPLACE_ITEM_REMOVED,
  105. TelemetryEventName.MARKETPLACE_TAB_VIEWED,
  106. TelemetryEventName.MARKETPLACE_INSTALL_BUTTON_CLICKED,
  107. TelemetryEventName.SHARE_BUTTON_CLICKED,
  108. TelemetryEventName.SHARE_ORGANIZATION_CLICKED,
  109. TelemetryEventName.SHARE_PUBLIC_CLICKED,
  110. TelemetryEventName.SHARE_CONNECT_TO_CLOUD_CLICKED,
  111. TelemetryEventName.ACCOUNT_CONNECT_CLICKED,
  112. TelemetryEventName.ACCOUNT_CONNECT_SUCCESS,
  113. TelemetryEventName.ACCOUNT_LOGOUT_CLICKED,
  114. TelemetryEventName.ACCOUNT_LOGOUT_SUCCESS,
  115. TelemetryEventName.SCHEMA_VALIDATION_ERROR,
  116. TelemetryEventName.DIFF_APPLICATION_ERROR,
  117. TelemetryEventName.SHELL_INTEGRATION_ERROR,
  118. TelemetryEventName.CONSECUTIVE_MISTAKE_ERROR,
  119. TelemetryEventName.CONTEXT_CONDENSED,
  120. TelemetryEventName.SLIDING_WINDOW_TRUNCATION,
  121. TelemetryEventName.TAB_SHOWN,
  122. TelemetryEventName.MODE_SETTINGS_CHANGED,
  123. TelemetryEventName.CUSTOM_MODE_CREATED,
  124. ]),
  125. properties: telemetryPropertiesSchema,
  126. }),
  127. z.object({
  128. type: z.literal(TelemetryEventName.TASK_MESSAGE),
  129. properties: z.object({
  130. ...telemetryPropertiesSchema.shape,
  131. taskId: z.string(),
  132. message: clineMessageSchema,
  133. }),
  134. }),
  135. z.object({
  136. type: z.literal(TelemetryEventName.LLM_COMPLETION),
  137. properties: z.object({
  138. ...telemetryPropertiesSchema.shape,
  139. inputTokens: z.number(),
  140. outputTokens: z.number(),
  141. cacheReadTokens: z.number().optional(),
  142. cacheWriteTokens: z.number().optional(),
  143. cost: z.number().optional(),
  144. }),
  145. }),
  146. ])
  147. export type RooCodeTelemetryEvent = z.infer<typeof rooCodeTelemetryEventSchema>
  148. /**
  149. * TelemetryEventSubscription
  150. */
  151. export type TelemetryEventSubscription =
  152. | { type: "include"; events: TelemetryEventName[] }
  153. | { type: "exclude"; events: TelemetryEventName[] }
  154. /**
  155. * TelemetryPropertiesProvider
  156. */
  157. export interface TelemetryPropertiesProvider {
  158. getTelemetryProperties(): Promise<TelemetryProperties>
  159. }
  160. /**
  161. * TelemetryClient
  162. */
  163. export interface TelemetryClient {
  164. subscription?: TelemetryEventSubscription
  165. setProvider(provider: TelemetryPropertiesProvider): void
  166. capture(options: TelemetryEvent): Promise<void>
  167. updateTelemetryState(didUserOptIn: boolean): void
  168. isTelemetryEnabled(): boolean
  169. shutdown(): Promise<void>
  170. }