diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index bcdca3eebaab9b20d4097ed05fdf9c92fe5e5a30..c466d6a4d9cee17b60e2132e88df07fef7b62896 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -10,7 +10,7 @@ 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 * as NodeHttpClient from "@effect/platform-node/NodeHttpClient"; +import { FetchHttpClient } from "effect/unstable/http"; const RuntimeLayer = Layer.empty.pipe( Layer.provideMerge(CliConfig.layer), @@ -19,7 +19,7 @@ const RuntimeLayer = Layer.empty.pipe( Layer.provideMerge(OpenLive), Layer.provideMerge(NetService.layer), Layer.provideMerge(NodeServices.layer), - Layer.provideMerge(NodeHttpClient.layerUndici), + Layer.provideMerge(FetchHttpClient.layer), ); Command.run(t3Cli, { version }).pipe(Effect.provide(RuntimeLayer), NodeRuntime.runMain); diff --git a/apps/server/src/provider/Layers/ProviderService.ts b/apps/server/src/provider/Layers/ProviderService.ts index 704fa3c9a35346822bc138facc52b02221c52a5a..d26a45d44bcff6d205393743fff36d2d6b8c69bc 100644 --- a/apps/server/src/provider/Layers/ProviderService.ts +++ b/apps/server/src/provider/Layers/ProviderService.ts @@ -276,8 +276,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) => yield* upsertSessionBinding(session, threadId); yield* analytics.record("provider.session.started", { provider: session.provider, - hasResumeCursor: session.resumeCursor !== undefined, - hasCwd: typeof input.cwd === "string" && input.cwd.trim().length > 0, approvalPolicy: input.approvalPolicy, sandboxMode: input.sandboxMode, }); @@ -322,8 +320,8 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) => }); yield* analytics.record("provider.turn.sent", { provider: routed.adapter.provider, - attachmentCount: input.attachments.length, - hasInput: typeof input.input === "string" && input.input.trim().length > 0, + model: input.model, + effort: input.effort, }); return turn; }); @@ -343,7 +341,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) => yield* routed.adapter.interruptTurn(routed.threadId, input.turnId); yield* analytics.record("provider.turn.interrupted", { provider: routed.adapter.provider, - hasTurnId: input.turnId !== undefined, }); }); @@ -379,8 +376,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) => allowRecovery: true, }); yield* routed.adapter.respondToUserInput(routed.threadId, input.requestId, input.answers); - yield* analytics.record("provider.user_input.responded", { - provider: routed.adapter.provider, }); }); @@ -402,7 +397,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) => yield* directory.remove(input.threadId); yield* analytics.record("provider.session.stopped", { provider: routed.adapter.provider, - wasActive: routed.isActive, }); }); diff --git a/apps/server/src/telemetry/Layers/AnalyticsService.ts b/apps/server/src/telemetry/Layers/AnalyticsService.ts index e295daa5bc45d69d140fa8240bff8bb735f2f6fb..f5214c5839493c38696321d04887807b70a90efd 100644 --- a/apps/server/src/telemetry/Layers/AnalyticsService.ts +++ b/apps/server/src/telemetry/Layers/AnalyticsService.ts @@ -126,7 +126,11 @@ const makeAnalyticsService = Effect.gen(function* () { } }); - yield* Effect.forever(flush, { disableYield: true }).pipe(Effect.forkDetach); + yield* Effect.forever(Effect.sleep(1000).pipe(Effect.flatMap(() => flush)), { + disableYield: true, + }).pipe(Effect.forkDetach); + + yield* Effect.addFinalizer(() => flush); return { record, diff --git a/apps/server/src/telemetry/Services/AnalyticsService.ts b/apps/server/src/telemetry/Services/AnalyticsService.ts index d556daad1567b1442840ff726acb3eb79fa3f6ec..64f8c8de55271906996450246fb3e8981e6f3002 100644 --- a/apps/server/src/telemetry/Services/AnalyticsService.ts +++ b/apps/server/src/telemetry/Services/AnalyticsService.ts @@ -6,7 +6,7 @@ * * @module AnalyticsService */ -import { Effect, ServiceMap } from "effect"; +import { Effect, Layer, ServiceMap } from "effect"; export interface AnalyticsServiceShape { /** @@ -25,4 +25,9 @@ export interface AnalyticsServiceShape { export class AnalyticsService extends ServiceMap.Service()( "t3/telemetry/Services/AnalyticsService", -) {} +) { + static readonly layerTest = Layer.succeed(AnalyticsService, { + record: () => Effect.void, + flush: Effect.void, + }); +} diff --git a/apps/server/src/wsServer.test.ts b/apps/server/src/wsServer.test.ts index 12829e5d660cdcc52d22abff630f5d4ca6a2c8df..adb4b3cfba3c8b457dd8b3c69e48bc7f059ed7d9 100644 --- a/apps/server/src/wsServer.test.ts +++ b/apps/server/src/wsServer.test.ts @@ -50,8 +50,7 @@ import type { GitCoreShape } from "./git/Services/GitCore.ts"; import { GitCore } from "./git/Services/GitCore.ts"; import { GitCommandError, GitManagerError } from "./git/Errors.ts"; import { MigrationError } from "@effect/sql-sqlite-bun/SqliteMigrator"; -import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService.ts"; -import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient"; +import { AnalyticsService } from "./telemetry/Services/AnalyticsService.ts"; interface PendingMessages { queue: unknown[]; @@ -436,6 +435,7 @@ describe("WebSocket Server", () => { ? Layer.succeed(TerminalManager, options.terminalManager) : Layer.empty, ); + const runtimeLayer = Layer.merge( Layer.merge( makeServerRuntimeServicesLayer().pipe(Layer.provide(infrastructureLayer)), @@ -448,9 +448,8 @@ describe("WebSocket Server", () => { Layer.provideMerge(providerHealthLayer), Layer.provideMerge(openLayer), Layer.provideMerge(serverConfigLayer), - Layer.provideMerge(AnalyticsServiceLayerLive), + Layer.provideMerge(AnalyticsService.layerTest), Layer.provideMerge(NodeServices.layer), - Layer.provideMerge(NodeHttpClient.layerUndici), ); const runtimeServices = await Effect.runPromise( Layer.build(dependenciesLayer).pipe(Scope.provide(scope)),