agent-orchestrator/frontend/src/shared/telemetry.ts

51 lines
1.4 KiB
TypeScript

import { mkdir, readFile, writeFile } from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { randomUUID } from "node:crypto";
export type TelemetryBootstrap = {
distinctId: string;
appVersion: string;
platform: NodeJS.Platform;
};
export function defaultDataDir(
platform: NodeJS.Platform,
env: Record<string, string | undefined>,
homeDir: string,
): string | null {
void platform;
if (env.AO_DATA_DIR) return env.AO_DATA_DIR;
if (!homeDir) return null;
return path.join(homeDir, ".ao", "data");
}
export async function loadOrCreateTelemetryInstallId(dataDir: string): Promise<string> {
const file = path.join(dataDir, "telemetry_install_id");
try {
const existing = (await readFile(file, "utf8")).trim();
if (existing) return existing;
} catch {
// Create the id on first use.
}
await mkdir(dataDir, { recursive: true });
const distinctId = `ins_${randomUUID()}`;
await writeFile(file, `${distinctId}\n`, { mode: 0o600 });
return distinctId;
}
export async function buildTelemetryBootstrap(
env: Record<string, string | undefined>,
appVersion: string,
platform: NodeJS.Platform,
homeDir = os.homedir(),
): Promise<TelemetryBootstrap | null> {
const dataDir = defaultDataDir(platform, env, homeDir);
if (!dataDir) return null;
return {
distinctId: await loadOrCreateTelemetryInstallId(dataDir),
appVersion,
platform,
};
}