Explorar el Código

Reduce diff size with Roo

By reintroducing some telemetry capture calls. These calls won't do anything because we disabled the TelemetryClients.
Christiaan Arnoldus hace 7 meses
padre
commit
373517ae65

+ 14 - 1
src/activate/registerCommands.ts

@@ -2,6 +2,7 @@ import * as vscode from "vscode"
 import delay from "delay"
 
 import type { CommandId } from "@roo-code/types"
+import { TelemetryService } from "@roo-code/telemetry"
 
 import { getCommand } from "../utils/commands"
 import { ClineProvider } from "../core/webview/ClineProvider"
@@ -79,6 +80,8 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
+		TelemetryService.instance.captureTitleButtonClicked("account")
+
 		visibleProvider.postMessageToWebview({ type: "action", action: "accountButtonClicked" })
 	},
 	plusButtonClicked: async () => {
@@ -88,6 +91,8 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
+		TelemetryService.instance.captureTitleButtonClicked("plus")
+
 		await visibleProvider.removeClineFromStack()
 		await visibleProvider.postStateToWebview()
 		await visibleProvider.postMessageToWebview({ type: "action", action: "chatButtonClicked" })
@@ -99,7 +104,7 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
-		// TelemetryService.instance.captureTitleButtonClicked("mcp")
+		TelemetryService.instance.captureTitleButtonClicked("mcp")
 
 		visibleProvider.postMessageToWebview({ type: "action", action: "mcpButtonClicked" })
 	},
@@ -110,9 +115,13 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
+		TelemetryService.instance.captureTitleButtonClicked("prompts")
+
 		visibleProvider.postMessageToWebview({ type: "action", action: "promptsButtonClicked" })
 	},
 	popoutButtonClicked: () => {
+		TelemetryService.instance.captureTitleButtonClicked("popout")
+
 		return openClineInNewTab({ context, outputChannel })
 	},
 	openInNewTab: () => openClineInNewTab({ context, outputChannel }),
@@ -123,6 +132,8 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
+		TelemetryService.instance.captureTitleButtonClicked("settings")
+
 		visibleProvider.postMessageToWebview({ type: "action", action: "settingsButtonClicked" })
 		// Also explicitly post the visibility message to trigger scroll reliably
 		visibleProvider.postMessageToWebview({ type: "action", action: "didBecomeVisible" })
@@ -134,6 +145,8 @@ const getCommandsMap = ({ context, outputChannel }: RegisterCommandOptions): Rec
 			return
 		}
 
+		TelemetryService.instance.captureTitleButtonClicked("history")
+
 		visibleProvider.postMessageToWebview({ type: "action", action: "historyButtonClicked" })
 	},
 	// kilocode_change begin

+ 14 - 0
src/core/config/ContextProxy.ts

@@ -1,4 +1,5 @@
 import * as vscode from "vscode"
+import { ZodError } from "zod"
 
 import {
 	PROVIDER_SETTINGS_KEYS,
@@ -14,6 +15,7 @@ import {
 	globalSettingsSchema,
 	isSecretStateKey,
 } from "@roo-code/types"
+import { TelemetryService } from "@roo-code/telemetry"
 
 import { logger } from "../../utils/logging"
 
@@ -172,6 +174,10 @@ export class ContextProxy {
 		try {
 			return globalSettingsSchema.parse(values)
 		} catch (error) {
+			if (error instanceof ZodError) {
+				TelemetryService.instance.captureSchemaValidationError({ schemaName: "GlobalSettings", error })
+			}
+
 			return GLOBAL_SETTINGS_KEYS.reduce((acc, key) => ({ ...acc, [key]: values[key] }), {} as GlobalSettings)
 		}
 	}
@@ -186,6 +192,10 @@ export class ContextProxy {
 		try {
 			return providerSettingsSchema.parse(values)
 		} catch (error) {
+			if (error instanceof ZodError) {
+				TelemetryService.instance.captureSchemaValidationError({ schemaName: "ProviderSettings", error })
+			}
+
 			return PROVIDER_SETTINGS_KEYS.reduce((acc, key) => ({ ...acc, [key]: values[key] }), {} as ProviderSettings)
 		}
 	}
@@ -250,6 +260,10 @@ export class ContextProxy {
 
 			return Object.fromEntries(Object.entries(globalSettings).filter(([_, value]) => value !== undefined))
 		} catch (error) {
+			if (error instanceof ZodError) {
+				TelemetryService.instance.captureSchemaValidationError({ schemaName: "GlobalSettings", error })
+			}
+
 			return undefined
 		}
 	}

+ 18 - 0
src/core/task/Task.ts

@@ -1475,6 +1475,24 @@ export class Task extends EventEmitter<ClineEvents> {
 				this.isStreaming = false
 			}
 
+			if (inputTokens > 0 || outputTokens > 0 || cacheWriteTokens > 0 || cacheReadTokens > 0) {
+				TelemetryService.instance.captureLlmCompletion(this.taskId, {
+					inputTokens,
+					outputTokens,
+					cacheWriteTokens,
+					cacheReadTokens,
+					cost:
+						totalCost ??
+						calculateApiCostAnthropic(
+							this.api.getModel().info,
+							inputTokens,
+							outputTokens,
+							cacheWriteTokens,
+							cacheReadTokens,
+						),
+				})
+			}
+
 			// Need to call here in case the stream was aborted.
 			if (this.abort || this.abandoned) {
 				throw new Error(

+ 3 - 0
src/core/tools/applyDiffTool.ts

@@ -1,6 +1,8 @@
 import path from "path"
 import fs from "fs/promises"
 
+import { TelemetryService } from "@roo-code/telemetry"
+
 import { ClineSayTool } from "../../shared/ExtensionMessage"
 import { getReadablePath } from "../../utils/path"
 import { Task } from "../task/Task"
@@ -104,6 +106,7 @@ export async function applyDiffToolLegacy(
 				const currentCount = (cline.consecutiveMistakeCountForApplyDiff.get(relPath) || 0) + 1
 				cline.consecutiveMistakeCountForApplyDiff.set(relPath, currentCount)
 				let formattedError = ""
+				TelemetryService.instance.captureDiffApplicationError(cline.taskId, currentCount)
 
 				if (diffResult.failParts && diffResult.failParts.length > 0) {
 					for (const failPart of diffResult.failParts) {

+ 2 - 0
src/core/tools/executeCommandTool.ts

@@ -4,6 +4,7 @@ import * as path from "path"
 import delay from "delay"
 
 import { CommandExecutionStatus } from "@roo-code/types"
+import { TelemetryService } from "@roo-code/telemetry"
 
 import { Task } from "../task/Task"
 
@@ -191,6 +192,7 @@ export async function executeCommand(
 
 	if (terminalProvider === "vscode") {
 		callbacks.onNoShellIntegration = async (error: string) => {
+			TelemetryService.instance.captureShellIntegrationError(cline.taskId)
 			shellIntegrationError = error
 		}
 	}

+ 14 - 1
src/core/webview/ClineProvider.ts

@@ -89,7 +89,10 @@ class OrganizationAllowListViolationError extends Error {
 	}
 }
 
-export class ClineProvider extends EventEmitter<ClineProviderEvents> implements vscode.WebviewViewProvider {
+export class ClineProvider
+	extends EventEmitter<ClineProviderEvents>
+	implements vscode.WebviewViewProvider, TelemetryPropertiesProvider
+{
 	// Used in package.json as the view's id. This value cannot be changed due
 	// to how VSCode caches views based on their id, and updating the id would
 	// break existing instances of the extension.
@@ -135,6 +138,10 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 		// Start configuration loading (which might trigger indexing) in the background.
 		// Don't await, allowing activation to continue immediately.
 
+		// Register this provider with the telemetry service to enable it to add
+		// properties like mode and provider.
+		TelemetryService.instance.setProvider(this)
+
 		this._workspaceTracker = new WorkspaceTracker(this)
 
 		this.providerSettingsManager = new ProviderSettingsManager(this.context)
@@ -325,6 +332,9 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 		promptType: CodeActionName,
 		params: Record<string, string | any[]>,
 	): Promise<void> {
+		// Capture telemetry for code action usage
+		TelemetryService.instance.captureCodeActionUsed(promptType)
+
 		const visibleProvider = await ClineProvider.getInstance()
 
 		if (!visibleProvider) {
@@ -349,6 +359,8 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 		promptType: TerminalActionPromptType,
 		params: Record<string, string | any[]>,
 	): Promise<void> {
+		TelemetryService.instance.captureCodeActionUsed(promptType)
+
 		const visibleProvider = await ClineProvider.getInstance()
 
 		if (!visibleProvider) {
@@ -798,6 +810,7 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
 		const cline = this.getCurrentCline()
 
 		if (cline) {
+			TelemetryService.instance.captureModeSwitch(cline.taskId, newMode)
 			cline.emit("taskModeSwitched", cline.taskId, newMode)
 		}
 

+ 7 - 3
src/core/webview/__tests__/ClineProvider.spec.ts

@@ -349,6 +349,10 @@ describe("ClineProvider", () => {
 	beforeEach(() => {
 		vi.clearAllMocks()
 
+		if (!TelemetryService.hasInstance()) {
+			TelemetryService.createInstance([])
+		}
+
 		const globalState: Record<string, string | undefined> = {
 			mode: "architect",
 			currentApiConfigName: "current-config",
@@ -2346,9 +2350,9 @@ describe("ClineProvider - Router Models", () => {
 			onDidChangeVisibility: vi.fn().mockImplementation(() => ({ dispose: vi.fn() })),
 		} as unknown as vscode.WebviewView
 
-		// if (!TelemetryService.hasInstance()) {
-		// 	TelemetryService.createInstance([])
-		// }
+		if (!TelemetryService.hasInstance()) {
+			TelemetryService.createInstance([])
+		}
 
 		provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", new ContextProxy(mockContext))
 	})

+ 4 - 0
src/core/webview/webviewMessageHandler.ts

@@ -1240,6 +1240,10 @@ export const webviewMessageHandler = async (
 						supportPrompt.create("ENHANCE", { userInput: message.text }, customSupportPrompts),
 					)
 
+					// Capture telemetry for prompt enhancement.
+					const currentCline = provider.getCurrentCline()
+					TelemetryService.instance.capturePromptEnhanced(currentCline?.taskId)
+
 					await provider.postMessageToWebview({ type: "enhancedPrompt", text: enhancedPrompt })
 				} catch (error) {
 					provider.log(