Skip to content

Commit ef25691

Browse files
Prefer Claude user ID for telemetry identity (#1249)
1 parent 34cef62 commit ef25691

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

apps/server/src/telemetry/Identify.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ const CodexAuthJsonSchema = Schema.Struct({
99
}),
1010
});
1111

12+
const ClaudeJsonSchema = Schema.Struct({
13+
userID: Schema.String,
14+
});
15+
1216
class IdentifyUserError extends Schema.TaggedErrorClass<IdentifyUserError>()("IdentifyUserError", {
1317
message: Schema.String,
1418
cause: Schema.optional(Schema.Defect),
@@ -37,6 +41,19 @@ const getCodexAccountId = Effect.gen(function* () {
3741
return authJson.tokens.account_id;
3842
});
3943

44+
const getClaudeUserId = Effect.gen(function* () {
45+
const fileSystem = yield* FileSystem.FileSystem;
46+
const path = yield* Path.Path;
47+
48+
const claudeJsonPath = path.join(homedir(), ".claude.json");
49+
const claudeJson = yield* Effect.flatMap(
50+
fileSystem.readFileString(claudeJsonPath),
51+
Schema.decodeEffect(Schema.fromJsonString(ClaudeJsonSchema)),
52+
);
53+
54+
return claudeJson.userID;
55+
});
56+
4057
const upsertAnonymousId = Effect.gen(function* () {
4158
const fileSystem = yield* FileSystem.FileSystem;
4259
const path = yield* Path.Path;
@@ -59,14 +76,20 @@ const upsertAnonymousId = Effect.gen(function* () {
5976
/**
6077
* getTelemetryIdentifier - Users are "identified" by finding the first match of the following, then hashing the value.
6178
* 1. ~/.codex/auth.json tokens.account_id
62-
* 2. ~/.t3/telemetry/anonymous-id
79+
* 2. ~/.claude.json userID
80+
* 3. ~/.t3/telemetry/anonymous-id
6381
*/
6482
export const getTelemetryIdentifier = Effect.gen(function* () {
6583
const codexAccountId = yield* Effect.result(getCodexAccountId);
6684
if (codexAccountId._tag === "Success") {
6785
return yield* hash(codexAccountId.success);
6886
}
6987

88+
const claudeUserId = yield* Effect.result(getClaudeUserId);
89+
if (claudeUserId._tag === "Success") {
90+
return yield* hash(claudeUserId.success);
91+
}
92+
7093
const anonymousId = yield* Effect.result(upsertAnonymousId);
7194
if (anonymousId._tag === "Success") {
7295
return yield* hash(anonymousId.success);

0 commit comments

Comments
 (0)