authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-05 17:52:05-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-05 23:40:49-08:00
logfcb1a50ee42a051ed1c0605f688cb6c94f043838
tree3f0593d72ba31030228da26d7d066cb20dd98fa4
parentec3778bbf4a5d8726cff22bddfcba82cd1c6ebde

adjust


5 files changed, 19 insertions(+), 17 deletions(-)

apps/server/src/index.ts+2-2
......@@ -10,7 +10,7 @@ import { version } from "../package.json" with { type: "json" };
1010import { ServerLive } from "./wsServer";
1111import { NetService } from "@t3tools/shared/Net";
1212import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService";
13import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
13import { FetchHttpClient } from "effect/unstable/http";
1414
1515const RuntimeLayer = Layer.empty.pipe(
1616 Layer.provideMerge(CliConfig.layer),
......@@ -19,7 +19,7 @@ const RuntimeLayer = Layer.empty.pipe(
1919 Layer.provideMerge(OpenLive),
2020 Layer.provideMerge(NetService.layer),
2121 Layer.provideMerge(NodeServices.layer),
22 Layer.provideMerge(NodeHttpClient.layerUndici),
22 Layer.provideMerge(FetchHttpClient.layer),
2323);
2424
2525Command.run(t3Cli, { version }).pipe(Effect.provide(RuntimeLayer), NodeRuntime.runMain);
apps/server/src/provider/Layers/ProviderService.ts+2-8
......@@ -276,8 +276,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) =>
276276 yield* upsertSessionBinding(session, threadId);
277277 yield* analytics.record("provider.session.started", {
278278 provider: session.provider,
279 hasResumeCursor: session.resumeCursor !== undefined,
280 hasCwd: typeof input.cwd === "string" && input.cwd.trim().length > 0,
281279 approvalPolicy: input.approvalPolicy,
282280 sandboxMode: input.sandboxMode,
283281 });
......@@ -322,8 +320,8 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) =>
322320 });
323321 yield* analytics.record("provider.turn.sent", {
324322 provider: routed.adapter.provider,
325 attachmentCount: input.attachments.length,
326 hasInput: typeof input.input === "string" && input.input.trim().length > 0,
323 model: input.model,
324 effort: input.effort,
327325 });
328326 return turn;
329327 });
......@@ -343,7 +341,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) =>
343341 yield* routed.adapter.interruptTurn(routed.threadId, input.turnId);
344342 yield* analytics.record("provider.turn.interrupted", {
345343 provider: routed.adapter.provider,
346 hasTurnId: input.turnId !== undefined,
347344 });
348345 });
349346
......@@ -379,8 +376,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) =>
379376 allowRecovery: true,
380377 });
381378 yield* routed.adapter.respondToUserInput(routed.threadId, input.requestId, input.answers);
382 yield* analytics.record("provider.user_input.responded", {
383 provider: routed.adapter.provider,
384379 });
385380 });
386381
......@@ -402,7 +397,6 @@ const makeProviderService = (options?: ProviderServiceLiveOptions) =>
402397 yield* directory.remove(input.threadId);
403398 yield* analytics.record("provider.session.stopped", {
404399 provider: routed.adapter.provider,
405 wasActive: routed.isActive,
406400 });
407401 });
408402
apps/server/src/telemetry/Layers/AnalyticsService.ts+5-1
......@@ -126,7 +126,11 @@ const makeAnalyticsService = Effect.gen(function* () {
126126 }
127127 });
128128
129 yield* Effect.forever(flush, { disableYield: true }).pipe(Effect.forkDetach);
129 yield* Effect.forever(Effect.sleep(1000).pipe(Effect.flatMap(() => flush)), {
130 disableYield: true,
131 }).pipe(Effect.forkDetach);
132
133 yield* Effect.addFinalizer(() => flush);
130134
131135 return {
132136 record,
apps/server/src/telemetry/Services/AnalyticsService.ts+7-2
......@@ -6,7 +6,7 @@
66 *
77 * @module AnalyticsService
88 */
9import { Effect, ServiceMap } from "effect";
9import { Effect, Layer, ServiceMap } from "effect";
1010
1111export interface AnalyticsServiceShape {
1212 /**
......@@ -25,4 +25,9 @@ export interface AnalyticsServiceShape {
2525
2626export class AnalyticsService extends ServiceMap.Service<AnalyticsService, AnalyticsServiceShape>()(
2727 "t3/telemetry/Services/AnalyticsService",
28) {}
28) {
29 static readonly layerTest = Layer.succeed(AnalyticsService, {
30 record: () => Effect.void,
31 flush: Effect.void,
32 });
33}
apps/server/src/wsServer.test.ts+3-4
......@@ -50,8 +50,7 @@ import type { GitCoreShape } from "./git/Services/GitCore.ts";
5050import { GitCore } from "./git/Services/GitCore.ts";
5151import { GitCommandError, GitManagerError } from "./git/Errors.ts";
5252import { MigrationError } from "@effect/sql-sqlite-bun/SqliteMigrator";
53import { AnalyticsServiceLayerLive } from "./telemetry/Layers/AnalyticsService.ts";
54import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
53import { AnalyticsService } from "./telemetry/Services/AnalyticsService.ts";
5554
5655interface PendingMessages {
5756 queue: unknown[];
......@@ -436,6 +435,7 @@ describe("WebSocket Server", () => {
436435 ? Layer.succeed(TerminalManager, options.terminalManager)
437436 : Layer.empty,
438437 );
438
439439 const runtimeLayer = Layer.merge(
440440 Layer.merge(
441441 makeServerRuntimeServicesLayer().pipe(Layer.provide(infrastructureLayer)),
......@@ -448,9 +448,8 @@ describe("WebSocket Server", () => {
448448 Layer.provideMerge(providerHealthLayer),
449449 Layer.provideMerge(openLayer),
450450 Layer.provideMerge(serverConfigLayer),
451 Layer.provideMerge(AnalyticsServiceLayerLive),
451 Layer.provideMerge(AnalyticsService.layerTest),
452452 Layer.provideMerge(NodeServices.layer),
453 Layer.provideMerge(NodeHttpClient.layerUndici),
454453 );
455454 const runtimeServices = await Effect.runPromise(
456455 Layer.build(dependenciesLayer).pipe(Scope.provide(scope)),