authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-05 18:06:39-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-05 23:40:49-08:00
log268bb4bfa3c2e33aaedb456885475f61ca8b0845
treeedc63b572ca644af4193d3fec48c969876ae4309
parent477b4f9d0ec7e7a48cb74357ea00ecf7bddfc62f

simplify layers


5 files changed, 27 insertions(+), 46 deletions(-)

apps/server/integration/OrchestrationEngineHarness.integration.ts+2-12
......@@ -253,22 +253,12 @@ export const makeOrchestrationIntegrationHarness = (
253253 ? makeProviderServiceLive().pipe(
254254 Layer.provide(providerSessionDirectoryLayer),
255255 Layer.provide(realCodexRegistry),
256 Layer.provide(
257 Layer.succeed(AnalyticsService, {
258 record: () => Effect.void,
259 flush: Effect.void,
260 }),
261 ),
256 Layer.provide(AnalyticsService.layerTest),
262257 )
263258 : makeProviderServiceLive().pipe(
264259 Layer.provide(providerSessionDirectoryLayer),
265260 Layer.provide(fakeRegistry!),
266 Layer.provide(
267 Layer.succeed(AnalyticsService, {
268 record: () => Effect.void,
269 flush: Effect.void,
270 }),
271 ),
261 Layer.provide(AnalyticsService.layerTest),
272262 );
273263
274264 const runtimeServicesLayer = Layer.mergeAll(
apps/server/integration/providerService.integration.test.ts+1-4
......@@ -60,10 +60,7 @@ const makeIntegrationFixture = Effect.gen(function* () {
6060 const shared = Layer.mergeAll(
6161 directoryLayer,
6262 Layer.succeed(ProviderAdapterRegistry, registry),
63 Layer.succeed(AnalyticsService, {
64 record: () => Effect.void,
65 flush: Effect.void,
66 }),
63 AnalyticsService.layerTest,
6764 ).pipe(Layer.provide(SqlitePersistenceMemory));
6865
6966 const layer = makeProviderServiceLive().pipe(Layer.provide(shared));
apps/server/src/main.test.ts+1-4
......@@ -49,10 +49,7 @@ const testLayer = Layer.mergeAll(
4949 openBrowser: (_target: string) => Effect.void,
5050 openInEditor: () => Effect.void,
5151 } satisfies OpenShape),
52 Layer.succeed(AnalyticsService, {
53 record: () => Effect.void,
54 flush: Effect.void,
55 }),
52 AnalyticsService.layerTest,
5653 FetchHttpClient.layer,
5754 NodeServices.layer,
5855);
apps/server/src/provider/Layers/ProviderService.test.ts+4-9
......@@ -215,11 +215,6 @@ function makeFakeCodexAdapter(provider: ProviderKind = "codex") {
215215const sleep = (ms: number) =>
216216 Effect.promise(() => new Promise<void>((resolve) => setTimeout(resolve, ms)));
217217
218const noopAnalyticsLayer = Layer.succeed(AnalyticsService, {
219 record: () => Effect.void,
220 flush: Effect.void,
221});
222
223218function makeProviderServiceLayer() {
224219 const codex = makeFakeCodexAdapter();
225220 const registry: typeof ProviderAdapterRegistry.Service = {
......@@ -241,7 +236,7 @@ function makeProviderServiceLayer() {
241236 makeProviderServiceLive().pipe(
242237 Layer.provide(providerAdapterLayer),
243238 Layer.provide(directoryLayer),
244 Layer.provideMerge(noopAnalyticsLayer),
239 Layer.provideMerge(AnalyticsService.layerTest),
245240 ),
246241 directoryLayer,
247242
......@@ -288,7 +283,7 @@ it.effect("ProviderServiceLive keeps persisted resumable sessions on startup", (
288283 const providerLayer = makeProviderServiceLive().pipe(
289284 Layer.provide(Layer.succeed(ProviderAdapterRegistry, registry)),
290285 Layer.provide(directoryLayer),
291 Layer.provide(noopAnalyticsLayer),
286 Layer.provide(AnalyticsService.layerTest),
292287 );
293288
294289 yield* Effect.gen(function* () {
......@@ -347,7 +342,7 @@ it.effect(
347342 const firstProviderLayer = makeProviderServiceLive().pipe(
348343 Layer.provide(Layer.succeed(ProviderAdapterRegistry, firstRegistry)),
349344 Layer.provide(firstDirectoryLayer),
350 Layer.provide(noopAnalyticsLayer),
345 Layer.provide(AnalyticsService.layerTest),
351346 );
352347
353348 const startedSession = yield* Effect.gen(function* () {
......@@ -390,7 +385,7 @@ it.effect(
390385 const secondProviderLayer = makeProviderServiceLive().pipe(
391386 Layer.provide(Layer.succeed(ProviderAdapterRegistry, secondRegistry)),
392387 Layer.provide(secondDirectoryLayer),
393 Layer.provide(noopAnalyticsLayer),
388 Layer.provide(AnalyticsService.layerTest),
394389 );
395390
396391 secondCodex.startSession.mockClear();
apps/server/src/telemetry/Layers/AnalyticsService.ts+19-17
......@@ -96,26 +96,28 @@ const makeAnalyticsService = Effect.gen(function* () {
9696 });
9797
9898 const flush: AnalyticsServiceShape["flush"] = Effect.gen(function* () {
99 const batch = yield* Ref.modify(bufferRef, (current) => {
100 if (current.length === 0) {
101 return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const;
102 }
103 const nextBatch = current.slice(0, telemetryConfig.flushBatchSize);
104 const remaining = current.slice(nextBatch.length);
105 return [nextBatch, remaining] as const;
106 });
99 while (true) {
100 const batch = yield* Ref.modify(bufferRef, (current) => {
101 if (current.length === 0) {
102 return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const;
103 }
104 const nextBatch = current.slice(0, telemetryConfig.flushBatchSize);
105 const remaining = current.slice(nextBatch.length);
106 return [nextBatch, remaining] as const;
107 });
107108
108 if (batch.length === 0) {
109 return;
110 }
109 if (batch.length === 0) {
110 return;
111 }
111112
112 yield* sendBatch(batch).pipe(
113 Effect.catch((error) =>
114 Ref.update(bufferRef, (current) => [...batch, ...current]).pipe(
115 Effect.flatMap(() => Effect.fail(error)),
113 yield* sendBatch(batch).pipe(
114 Effect.catch((error) =>
115 Ref.update(bufferRef, (current) => [...batch, ...current]).pipe(
116 Effect.flatMap(() => Effect.fail(error)),
117 ),
116118 ),
117 ),
118 );
119 );
120 }
119121 }).pipe(Effect.catch((cause) => Effect.logError("Failed to flush telemetry", { cause })));
120122
121123 const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) {