{"version":3,"file":"telemetry-client.mjs","names":["uuidv4","scarfClient"],"sources":["../../src/telemetry/telemetry-client.ts"],"sourcesContent":["import { Analytics } from \"@segment/analytics-node\";\nimport { AnalyticsEvents } from \"./events\";\nimport { flattenObject } from \"./utils\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport scarfClient from \"./scarf-client\";\n\n/**\n * Checks if telemetry is disabled via environment variables.\n * Users can opt out by setting:\n * - COPILOTKIT_TELEMETRY_DISABLED=true or COPILOTKIT_TELEMETRY_DISABLED=1\n * - DO_NOT_TRACK=true or DO_NOT_TRACK=1\n */\nexport function isTelemetryDisabled(): boolean {\n  return (\n    (process.env as Record<string, string | undefined>)\n      .COPILOTKIT_TELEMETRY_DISABLED === \"true\" ||\n    (process.env as Record<string, string | undefined>)\n      .COPILOTKIT_TELEMETRY_DISABLED === \"1\" ||\n    (process.env as Record<string, string | undefined>).DO_NOT_TRACK ===\n      \"true\" ||\n    (process.env as Record<string, string | undefined>).DO_NOT_TRACK === \"1\"\n  );\n}\n\nexport class TelemetryClient {\n  segment: Analytics | undefined;\n  globalProperties: Record<string, any> = {};\n  cloudConfiguration: { publicApiKey: string; baseUrl: string } | null = null;\n  packageName: string;\n  packageVersion: string;\n  private telemetryDisabled: boolean = false;\n  private sampleRate: number = 0.05;\n  private anonymousId = `anon_${uuidv4()}`;\n\n  constructor({\n    packageName,\n    packageVersion,\n    telemetryDisabled,\n    telemetryBaseUrl,\n    sampleRate,\n  }: {\n    packageName: string;\n    packageVersion: string;\n    telemetryDisabled?: boolean;\n    telemetryBaseUrl?: string;\n    sampleRate?: number;\n  }) {\n    this.packageName = packageName;\n    this.packageVersion = packageVersion;\n    this.telemetryDisabled = telemetryDisabled || isTelemetryDisabled();\n\n    if (this.telemetryDisabled) {\n      return;\n    }\n\n    this.setSampleRate(sampleRate);\n\n    // eslint-disable-next-line\n    const writeKey =\n      process.env.COPILOTKIT_SEGMENT_WRITE_KEY ||\n      \"n7XAZtQCGS2v1vvBy3LgBCv2h3Y8whja\";\n\n    this.segment = new Analytics({\n      writeKey,\n    });\n\n    this.setGlobalProperties({\n      \"copilotkit.package.name\": packageName,\n      \"copilotkit.package.version\": packageVersion,\n    });\n  }\n\n  private shouldSendEvent() {\n    const randomNumber = Math.random();\n    return randomNumber < this.sampleRate;\n  }\n\n  async capture<K extends keyof AnalyticsEvents>(\n    event: K,\n    properties: AnalyticsEvents[K],\n  ) {\n    if (!this.shouldSendEvent() || !this.segment) {\n      return;\n    }\n\n    const flattenedProperties = flattenObject(properties);\n    const propertiesWithGlobal = {\n      ...this.globalProperties,\n      ...flattenedProperties,\n    };\n    const orderedPropertiesWithGlobal = Object.keys(propertiesWithGlobal)\n      .sort()\n      .reduce(\n        (obj, key) => {\n          obj[key] = propertiesWithGlobal[key];\n          return obj;\n        },\n        {} as Record<string, any>,\n      );\n\n    this.segment.track({\n      anonymousId: this.anonymousId,\n      event,\n      properties: { ...orderedPropertiesWithGlobal },\n    });\n\n    await scarfClient.logEvent({\n      event,\n    });\n  }\n\n  setGlobalProperties(properties: Record<string, any>) {\n    const flattenedProperties = flattenObject(properties);\n    this.globalProperties = {\n      ...this.globalProperties,\n      ...flattenedProperties,\n    };\n  }\n\n  setCloudConfiguration(properties: { publicApiKey: string; baseUrl: string }) {\n    this.cloudConfiguration = properties;\n\n    this.setGlobalProperties({\n      cloud: {\n        publicApiKey: properties.publicApiKey,\n        baseUrl: properties.baseUrl,\n      },\n    });\n  }\n\n  private setSampleRate(sampleRate: number | undefined) {\n    let _sampleRate: number;\n\n    _sampleRate = sampleRate ?? 0.05;\n\n    // eslint-disable-next-line\n    if (process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE) {\n      // eslint-disable-next-line\n      _sampleRate = parseFloat(process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE);\n    }\n\n    if (_sampleRate < 0 || _sampleRate > 1) {\n      throw new Error(\"Sample rate must be between 0 and 1\");\n    }\n\n    this.sampleRate = _sampleRate;\n    this.setGlobalProperties({\n      sampleRate: this.sampleRate,\n      sampleRateAdjustmentFactor: 1 - this.sampleRate,\n      sampleWeight: 1 / this.sampleRate,\n    });\n  }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,SAAgB,sBAA+B;AAC7C,QACG,QAAQ,IACN,kCAAkC,UACpC,QAAQ,IACN,kCAAkC,OACpC,QAAQ,IAA2C,iBAClD,UACD,QAAQ,IAA2C,iBAAiB;;AAIzE,IAAa,kBAAb,MAA6B;CAU3B,YAAY,EACV,aACA,gBACA,mBACA,kBACA,cAOC;0BApBqC,EAAE;4BAC6B;2BAGlC;oBACR;qBACP,QAAQA,IAAQ;AAepC,OAAK,cAAc;AACnB,OAAK,iBAAiB;AACtB,OAAK,oBAAoB,qBAAqB,qBAAqB;AAEnE,MAAI,KAAK,kBACP;AAGF,OAAK,cAAc,WAAW;AAO9B,OAAK,UAAU,IAAI,UAAU,EAC3B,UAJA,QAAQ,IAAI,gCACZ,oCAID,CAAC;AAEF,OAAK,oBAAoB;GACvB,2BAA2B;GAC3B,8BAA8B;GAC/B,CAAC;;CAGJ,AAAQ,kBAAkB;AAExB,SADqB,KAAK,QAAQ,GACZ,KAAK;;CAG7B,MAAM,QACJ,OACA,YACA;AACA,MAAI,CAAC,KAAK,iBAAiB,IAAI,CAAC,KAAK,QACnC;EAGF,MAAM,sBAAsB,cAAc,WAAW;EACrD,MAAM,uBAAuB;GAC3B,GAAG,KAAK;GACR,GAAG;GACJ;EACD,MAAM,8BAA8B,OAAO,KAAK,qBAAqB,CAClE,MAAM,CACN,QACE,KAAK,QAAQ;AACZ,OAAI,OAAO,qBAAqB;AAChC,UAAO;KAET,EAAE,CACH;AAEH,OAAK,QAAQ,MAAM;GACjB,aAAa,KAAK;GAClB;GACA,YAAY,EAAE,GAAG,6BAA6B;GAC/C,CAAC;AAEF,QAAMC,qBAAY,SAAS,EACzB,OACD,CAAC;;CAGJ,oBAAoB,YAAiC;EACnD,MAAM,sBAAsB,cAAc,WAAW;AACrD,OAAK,mBAAmB;GACtB,GAAG,KAAK;GACR,GAAG;GACJ;;CAGH,sBAAsB,YAAuD;AAC3E,OAAK,qBAAqB;AAE1B,OAAK,oBAAoB,EACvB,OAAO;GACL,cAAc,WAAW;GACzB,SAAS,WAAW;GACrB,EACF,CAAC;;CAGJ,AAAQ,cAAc,YAAgC;EACpD,IAAI;AAEJ,gBAAc,cAAc;AAG5B,MAAI,QAAQ,IAAI,iCAEd,eAAc,WAAW,QAAQ,IAAI,iCAAiC;AAGxE,MAAI,cAAc,KAAK,cAAc,EACnC,OAAM,IAAI,MAAM,sCAAsC;AAGxD,OAAK,aAAa;AAClB,OAAK,oBAAoB;GACvB,YAAY,KAAK;GACjB,4BAA4B,IAAI,KAAK;GACrC,cAAc,IAAI,KAAK;GACxB,CAAC"}