Compare commits

...

4 Commits

Author SHA1 Message Date
Elephant Lumps fb95922251 import telemetryService 2025-05-06 15:23:28 -05:00
Elephant Lumps 413693611c merge conflicts 2025-05-06 13:11:05 -05:00
Elephant Lumps 46b133f41e changeset 2025-05-05 13:41:15 -05:00
Elephant Lumps fc9031dcff add featureFlagProvider service 2025-05-05 13:40:35 -05:00
11 changed files with 89 additions and 14 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"claude-dev": minor
---
Add FeatureFlagProvider service for the Node.js extension side
+1 -1
View File
@@ -20,7 +20,7 @@ import { ClineAccountService } from "@services/account/ClineAccountService"
import { BrowserSession } from "@services/browser/BrowserSession"
import { McpHub } from "@services/mcp/McpHub"
import { searchWorkspaceFiles } from "@services/search/file-search"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
import { ApiProvider, ModelInfo } from "@shared/api"
import { ChatContent } from "@shared/ChatContent"
import { ChatSettings } from "@shared/ChatSettings"
+2 -1
View File
@@ -25,7 +25,7 @@ import { BrowserSession } from "@services/browser/BrowserSession"
import { UrlContentFetcher } from "@services/browser/UrlContentFetcher"
import { listFiles } from "@services/glob/list-files"
import { regexSearchFiles } from "@services/ripgrep"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
import { parseSourceCodeForDefinitionsTopLevel } from "@services/tree-sitter"
import { ApiConfiguration } from "@shared/api"
import { findLast, findLastIndex, parsePartialArrayString } from "@shared/array"
@@ -98,6 +98,7 @@ import { parseSlashCommands } from "@core/slash-commands"
import WorkspaceTracker from "@integrations/workspace/WorkspaceTracker"
import { McpHub } from "@services/mcp/McpHub"
import { isInTestMode } from "../../services/test/TestMode"
import { featureFlagsService } from "@/services/posthog/feature-flags/FeatureFlagsService"
export const cwd =
vscode.workspace.workspaceFolders?.map((folder) => folder.uri.fsPath).at(0) ?? path.join(os.homedir(), "Desktop") // may or may not exist but fs checking existence would immediately ask for permission which would be bad UX, need to come up with a better solution
+3 -2
View File
@@ -8,10 +8,11 @@ import { createClineAPI } from "./exports"
import "./utils/path" // necessary to have access to String.prototype.toPosix
import { DIFF_VIEW_URI_SCHEME } from "./integrations/editor/DiffViewProvider"
import assert from "node:assert"
import { telemetryService } from "./services/telemetry/TelemetryService"
import { posthogClientProvider } from "./services/posthog/PostHogClientProvider"
import { WebviewProvider } from "./core/webview"
import { ErrorService } from "./services/error/ErrorService"
import { initializeTestMode, cleanupTestMode } from "./services/test/TestMode"
import { telemetryService } from "./services/posthog/telemetry/TelemetryService"
/*
Built using https://github.com/microsoft/vscode-webview-ui-toolkit
@@ -439,7 +440,7 @@ export async function deactivate() {
// Clean up test mode
cleanupTestMode()
await telemetryService.shutdown()
await posthogClientProvider.shutdown()
Logger.log("Cline extension deactivated")
}
@@ -4,7 +4,7 @@ import * as path from "path"
import simpleGit, { SimpleGit } from "simple-git"
import { fileExistsAtPath } from "@utils/fs"
import { getLfsPatterns, writeExcludesFile } from "./CheckpointExclusions"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
interface CheckpointAddResult {
success: boolean
@@ -2,7 +2,7 @@ import fs from "fs/promises"
import * as path from "path"
import simpleGit from "simple-git"
import * as vscode from "vscode"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
import { GitOperations } from "./CheckpointGitOperations"
import { getShadowGitPath, getWorkingDirectory, hashWorkingDir } from "./CheckpointUtils"
+1 -1
View File
@@ -15,7 +15,7 @@ import { BrowserSettings } from "@shared/BrowserSettings"
import { discoverChromeInstances, testBrowserConnection, isPortOpen } from "./BrowserDiscovery"
import * as chromeLauncher from "chrome-launcher"
import { Controller } from "@core/controller"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
interface PCRStats {
puppeteer: { launch: typeof launch }
+1 -1
View File
@@ -1,6 +1,6 @@
import * as Sentry from "@sentry/browser"
import * as vscode from "vscode"
import { telemetryService } from "@services/telemetry/TelemetryService"
import { telemetryService } from "@/services/posthog/telemetry/TelemetryService"
import * as pkg from "../../../package.json"
let telemetryLevel = vscode.workspace.getConfiguration("telemetry").get<string>("telemetryLevel", "all")
@@ -0,0 +1,31 @@
import { PostHog } from "posthog-node"
import { posthogConfig } from "@/shared/services/config/posthog-config"
class PostHogClientProvider {
private static instance: PostHogClientProvider
private client: PostHog
private constructor() {
this.client = new PostHog(posthogConfig.apiKey, {
host: posthogConfig.host,
enableExceptionAutocapture: false,
})
}
public static getInstance(): PostHogClientProvider {
if (!PostHogClientProvider.instance) {
PostHogClientProvider.instance = new PostHogClientProvider()
}
return PostHogClientProvider.instance
}
public getClient(): PostHog {
return this.client
}
public async shutdown(): Promise<void> {
await this.client.shutdown()
}
}
export const posthogClientProvider = PostHogClientProvider.getInstance()
@@ -0,0 +1,40 @@
import { PostHog } from "posthog-node"
import { posthogClientProvider } from "../PostHogClientProvider"
class FeatureFlagsService {
private static instance: FeatureFlagsService
private readonly client: PostHog
private constructor() {
// Get the shared client
this.client = posthogClientProvider.getClient()
}
public static getInstance(): FeatureFlagsService {
if (!FeatureFlagsService.instance) {
FeatureFlagsService.instance = new FeatureFlagsService()
}
return FeatureFlagsService.instance
}
/**
* Check if a feature flag is enabled
* @param flagName The feature flag key
* @returns Boolean indicating if the feature is enabled
*/
public async isFeatureFlagEnabled(flagName: string): Promise<boolean> {
try {
const payload = await this.client.getFeatureFlagPayload(flagName, "_irrelevant_" /* optional params */)
if (payload && typeof payload === "object" && "enabled" in payload) {
return Boolean(payload.enabled)
}
console.warn(`Feature flag ${flagName} not found or missing enabled property.`)
return false
} catch (error) {
console.error(`Error checking if feature flag ${flagName} is enabled:`, error)
return false
}
}
}
export const featureFlagsService = FeatureFlagsService.getInstance()
@@ -1,10 +1,10 @@
import { PostHog } from "posthog-node"
import * as vscode from "vscode"
import { version as extensionVersion } from "../../../package.json"
import { version as extensionVersion } from "../../../../package.json"
import type { TaskFeedbackType } from "@shared/WebviewMessage"
import type { BrowserSettings } from "@shared/BrowserSettings"
import { posthogConfig } from "@/shared/services/config/posthog-config"
import { posthogClientProvider } from "../PostHogClientProvider"
/**
* PostHogClient handles telemetry event tracking for the Cline extension
@@ -111,10 +111,7 @@ class PostHogClient {
* Initializes PostHog client with configuration
*/
private constructor() {
this.client = new PostHog(posthogConfig.apiKey, {
host: posthogConfig.host,
enableExceptionAutocapture: false,
})
this.client = posthogClientProvider.getClient()
}
/**