summaryrefslogtreecommitdiff
path: root/packages/core/src/utils/user_id.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/utils/user_id.ts')
-rw-r--r--packages/core/src/utils/user_id.ts58
1 files changed, 58 insertions, 0 deletions
diff --git a/packages/core/src/utils/user_id.ts b/packages/core/src/utils/user_id.ts
new file mode 100644
index 00000000..5db080a4
--- /dev/null
+++ b/packages/core/src/utils/user_id.ts
@@ -0,0 +1,58 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import * as os from 'os';
+import * as fs from 'fs';
+import * as path from 'path';
+import { randomUUID } from 'crypto';
+import { GEMINI_DIR } from './paths.js';
+
+const homeDir = os.homedir() ?? '';
+const geminiDir = path.join(homeDir, GEMINI_DIR);
+const userIdFile = path.join(geminiDir, 'user_id');
+
+function ensureGeminiDirExists() {
+ if (!fs.existsSync(geminiDir)) {
+ fs.mkdirSync(geminiDir, { recursive: true });
+ }
+}
+
+function readUserIdFromFile(): string | null {
+ if (fs.existsSync(userIdFile)) {
+ const userId = fs.readFileSync(userIdFile, 'utf-8').trim();
+ return userId || null;
+ }
+ return null;
+}
+
+function writeUserIdToFile(userId: string) {
+ fs.writeFileSync(userIdFile, userId, 'utf-8');
+}
+
+/**
+ * Retrieves the persistent user ID from a file, creating it if it doesn't exist.
+ * This ID is used for unique user tracking.
+ * @returns A UUID string for the user.
+ */
+export function getPersistentUserId(): string {
+ try {
+ ensureGeminiDirExists();
+ let userId = readUserIdFromFile();
+
+ if (!userId) {
+ userId = randomUUID();
+ writeUserIdToFile(userId);
+ }
+
+ return userId;
+ } catch (error) {
+ console.error(
+ 'Error accessing persistent user ID file, generating ephemeral ID:',
+ error,
+ );
+ return '123456789';
+ }
+}