From 477b4f9d0ec7e7a48cb74357ea00ecf7bddfc62f Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 5 Mar 2026 18:03:54 -0800 Subject: [PATCH] Wire telemetry in main and store anonymous ID in state dir - move `AnalyticsServiceLayerLive` from CLI runtime setup into `main` server layer - persist telemetry `anonymous-id` under configured `stateDir` instead of home directory - add `FetchHttpClient.layer` to `main.test.ts` test layer wiring --- apps/server/src/index.ts | 2 -- apps/server/src/main.test.ts | 2 ++ apps/server/src/main.ts | 2 ++ apps/server/src/telemetry/Identify.ts | 4 +++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index c466d6a4d9cee17b60e2132e88df07fef7b62896..363a07ee386f11d7853d8822f2eac4fc996046bf 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -9,12 +9,10 @@ import { Command } from "effect/unstable/cli"; import { version } from "../package.json" with { type: "json" }; import { ServerLive } from "./wsServer"; import { NetService } from "@t3tools/shared/Net"; -import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService"; import { FetchHttpClient } from "effect/unstable/http"; const RuntimeLayer = Layer.empty.pipe( Layer.provideMerge(CliConfig.layer), - Layer.provideMerge(AnalyticsServiceLayerLive), Layer.provideMerge(ServerLive), Layer.provideMerge(OpenLive), Layer.provideMerge(NetService.layer), diff --git a/apps/server/src/main.test.ts b/apps/server/src/main.test.ts index 58c6050a2581780b593f3e7dbe881e1e51f191c4..613655fe5e0340174dee62fbe31e4593be7e8c20 100644 --- a/apps/server/src/main.test.ts +++ b/apps/server/src/main.test.ts @@ -5,6 +5,7 @@ import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Command from "effect/unstable/cli/Command"; +import { FetchHttpClient } from "effect/unstable/http"; import { beforeEach } from "vitest"; import { NetService } from "@t3tools/shared/Net"; @@ -52,6 +53,7 @@ const testLayer = Layer.mergeAll( record: () => Effect.void, flush: Effect.void, }), + FetchHttpClient.layer, NodeServices.layer, ); diff --git a/apps/server/src/main.ts b/apps/server/src/main.ts index 4a0faf9802ef95dc32724f0dbe18725e21429129..3deb46aebc331a14a0188dd5f39da9f8fbdc61ac 100644 --- a/apps/server/src/main.ts +++ b/apps/server/src/main.ts @@ -23,6 +23,7 @@ import { makeServerProviderLayer, makeServerRuntimeServicesLayer } from "./serve import { ProviderHealthLive } from "./provider/Layers/ProviderHealth"; import { Server } from "./wsServer"; import { ServerLoggerLive } from "./serverLogger"; +import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService"; export class StartupError extends Data.TaggedError("StartupError")<{ readonly message: string; @@ -197,6 +198,7 @@ const LayerLive = (input: CliInput) => Layer.provideMerge(ProviderHealthLive), Layer.provideMerge(SqlitePersistence.layerConfig), Layer.provideMerge(ServerLoggerLive), + Layer.provideMerge(AnalyticsServiceLayerLive), Layer.provideMerge(ServerConfigLive(input)), ); diff --git a/apps/server/src/telemetry/Identify.ts b/apps/server/src/telemetry/Identify.ts index 68fc312adffa806d088e17fa3778d4029b99218c..cf6ac7217874fa93b5f03f5d5e765ae185de8a99 100644 --- a/apps/server/src/telemetry/Identify.ts +++ b/apps/server/src/telemetry/Identify.ts @@ -1,6 +1,7 @@ import { Effect, FileSystem, Path, Random, Schema } from "effect"; import * as Crypto from "node:crypto"; import { homedir } from "node:os"; +import { ServerConfig } from "../config"; const CodexAuthJsonSchema = Schema.Struct({ tokens: Schema.Struct({ @@ -39,8 +40,9 @@ const getCodexAccountId = Effect.gen(function* () { const upsertAnonymousId = Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; + const serverConfig = yield* ServerConfig; - const anonymousIdPath = path.join(homedir(), ".t3", "telemetry", "anonymous-id"); + const anonymousIdPath = path.join(serverConfig.stateDir, "anonymous-id"); const anonymousId = yield* fileSystem.readFileString(anonymousIdPath).pipe( Effect.catch(() => Effect.gen(function* () { -- 2.54.0