authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-05 18:03:54-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-05 23:40:49-08:00
log477b4f9d0ec7e7a48cb74357ea00ecf7bddfc62f
tree9ab54bd81a91cda272bd193f8a0ae5e1aaee94f7
parentd5d88270f0d9cdc9797a650ed6ccace28cb1dc39

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

4 files changed, 7 insertions(+), 3 deletions(-)

apps/server/src/index.ts-2
......@@ -9,12 +9,10 @@ import { Command } from "effect/unstable/cli";
99import { version } from "../package.json" with { type: "json" };
1010import { ServerLive } from "./wsServer";
1111import { NetService } from "@t3tools/shared/Net";
12import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService";
1312import { FetchHttpClient } from "effect/unstable/http";
1413
1514const RuntimeLayer = Layer.empty.pipe(
1615 Layer.provideMerge(CliConfig.layer),
17 Layer.provideMerge(AnalyticsServiceLayerLive),
1816 Layer.provideMerge(ServerLive),
1917 Layer.provideMerge(OpenLive),
2018 Layer.provideMerge(NetService.layer),
apps/server/src/main.test.ts+2
......@@ -5,6 +5,7 @@ import * as ConfigProvider from "effect/ConfigProvider";
55import * as Effect from "effect/Effect";
66import * as Layer from "effect/Layer";
77import * as Command from "effect/unstable/cli/Command";
8import { FetchHttpClient } from "effect/unstable/http";
89import { beforeEach } from "vitest";
910import { NetService } from "@t3tools/shared/Net";
1011
......@@ -52,6 +53,7 @@ const testLayer = Layer.mergeAll(
5253 record: () => Effect.void,
5354 flush: Effect.void,
5455 }),
56 FetchHttpClient.layer,
5557 NodeServices.layer,
5658);
5759
apps/server/src/main.ts+2
......@@ -23,6 +23,7 @@ import { makeServerProviderLayer, makeServerRuntimeServicesLayer } from "./serve
2323import { ProviderHealthLive } from "./provider/Layers/ProviderHealth";
2424import { Server } from "./wsServer";
2525import { ServerLoggerLive } from "./serverLogger";
26import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService";
2627
2728export class StartupError extends Data.TaggedError("StartupError")<{
2829 readonly message: string;
......@@ -197,6 +198,7 @@ const LayerLive = (input: CliInput) =>
197198 Layer.provideMerge(ProviderHealthLive),
198199 Layer.provideMerge(SqlitePersistence.layerConfig),
199200 Layer.provideMerge(ServerLoggerLive),
201 Layer.provideMerge(AnalyticsServiceLayerLive),
200202 Layer.provideMerge(ServerConfigLive(input)),
201203 );
202204
apps/server/src/telemetry/Identify.ts+3-1
......@@ -1,6 +1,7 @@
11import { Effect, FileSystem, Path, Random, Schema } from "effect";
22import * as Crypto from "node:crypto";
33import { homedir } from "node:os";
4import { ServerConfig } from "../config";
45
56const CodexAuthJsonSchema = Schema.Struct({
67 tokens: Schema.Struct({
......@@ -39,8 +40,9 @@ const getCodexAccountId = Effect.gen(function* () {
3940const upsertAnonymousId = Effect.gen(function* () {
4041 const fileSystem = yield* FileSystem.FileSystem;
4142 const path = yield* Path.Path;
43 const serverConfig = yield* ServerConfig;
4244
43 const anonymousIdPath = path.join(homedir(), ".t3", "telemetry", "anonymous-id");
45 const anonymousIdPath = path.join(serverConfig.stateDir, "anonymous-id");
4446 const anonymousId = yield* fileSystem.readFileString(anonymousIdPath).pipe(
4547 Effect.catch(() =>
4648 Effect.gen(function* () {