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 = (...@@ -253,22 +253,12 @@ export const makeOrchestrationIntegrationHarness = (
253 ? makeProviderServiceLive().pipe(253 ? makeProviderServiceLive().pipe(
254 Layer.provide(providerSessionDirectoryLayer),254 Layer.provide(providerSessionDirectoryLayer),
255 Layer.provide(realCodexRegistry),255 Layer.provide(realCodexRegistry),
256 Layer.provide(256 Layer.provide(AnalyticsService.layerTest),
257 Layer.succeed(AnalyticsService, {
258 record: () => Effect.void,
259 flush: Effect.void,
260 }),
261 ),
262 )257 )
263 : makeProviderServiceLive().pipe(258 : makeProviderServiceLive().pipe(
264 Layer.provide(providerSessionDirectoryLayer),259 Layer.provide(providerSessionDirectoryLayer),
265 Layer.provide(fakeRegistry!),260 Layer.provide(fakeRegistry!),
266 Layer.provide(261 Layer.provide(AnalyticsService.layerTest),
267 Layer.succeed(AnalyticsService, {
268 record: () => Effect.void,
269 flush: Effect.void,
270 }),
271 ),
272 );262 );
273263
274 const runtimeServicesLayer = Layer.mergeAll(264 const runtimeServicesLayer = Layer.mergeAll(
apps/server/integration/providerService.integration.test.ts+1-4
...@@ -60,10 +60,7 @@ const makeIntegrationFixture = Effect.gen(function* () {...@@ -60,10 +60,7 @@ const makeIntegrationFixture = Effect.gen(function* () {
60 const shared = Layer.mergeAll(60 const shared = Layer.mergeAll(
61 directoryLayer,61 directoryLayer,
62 Layer.succeed(ProviderAdapterRegistry, registry),62 Layer.succeed(ProviderAdapterRegistry, registry),
63 Layer.succeed(AnalyticsService, {63 AnalyticsService.layerTest,
64 record: () => Effect.void,
65 flush: Effect.void,
66 }),
67 ).pipe(Layer.provide(SqlitePersistenceMemory));64 ).pipe(Layer.provide(SqlitePersistenceMemory));
6865
69 const layer = makeProviderServiceLive().pipe(Layer.provide(shared));66 const layer = makeProviderServiceLive().pipe(Layer.provide(shared));
apps/server/src/main.test.ts+1-4
...@@ -49,10 +49,7 @@ const testLayer = Layer.mergeAll(...@@ -49,10 +49,7 @@ const testLayer = Layer.mergeAll(
49 openBrowser: (_target: string) => Effect.void,49 openBrowser: (_target: string) => Effect.void,
50 openInEditor: () => Effect.void,50 openInEditor: () => Effect.void,
51 } satisfies OpenShape),51 } satisfies OpenShape),
52 Layer.succeed(AnalyticsService, {52 AnalyticsService.layerTest,
53 record: () => Effect.void,
54 flush: Effect.void,
55 }),
56 FetchHttpClient.layer,53 FetchHttpClient.layer,
57 NodeServices.layer,54 NodeServices.layer,
58);55);
apps/server/src/provider/Layers/ProviderService.test.ts+4-9
...@@ -215,11 +215,6 @@ function makeFakeCodexAdapter(provider: ProviderKind = "codex") {...@@ -215,11 +215,6 @@ function makeFakeCodexAdapter(provider: ProviderKind = "codex") {
215const sleep = (ms: number) =>215const sleep = (ms: number) =>
216 Effect.promise(() => new Promise<void>((resolve) => setTimeout(resolve, ms)));216 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
223function makeProviderServiceLayer() {218function makeProviderServiceLayer() {
224 const codex = makeFakeCodexAdapter();219 const codex = makeFakeCodexAdapter();
225 const registry: typeof ProviderAdapterRegistry.Service = {220 const registry: typeof ProviderAdapterRegistry.Service = {
...@@ -241,7 +236,7 @@ function makeProviderServiceLayer() {...@@ -241,7 +236,7 @@ function makeProviderServiceLayer() {
241 makeProviderServiceLive().pipe(236 makeProviderServiceLive().pipe(
242 Layer.provide(providerAdapterLayer),237 Layer.provide(providerAdapterLayer),
243 Layer.provide(directoryLayer),238 Layer.provide(directoryLayer),
244 Layer.provideMerge(noopAnalyticsLayer),239 Layer.provideMerge(AnalyticsService.layerTest),
245 ),240 ),
246 directoryLayer,241 directoryLayer,
247242
...@@ -288,7 +283,7 @@ it.effect("ProviderServiceLive keeps persisted resumable sessions on startup", (...@@ -288,7 +283,7 @@ it.effect("ProviderServiceLive keeps persisted resumable sessions on startup", (
288 const providerLayer = makeProviderServiceLive().pipe(283 const providerLayer = makeProviderServiceLive().pipe(
289 Layer.provide(Layer.succeed(ProviderAdapterRegistry, registry)),284 Layer.provide(Layer.succeed(ProviderAdapterRegistry, registry)),
290 Layer.provide(directoryLayer),285 Layer.provide(directoryLayer),
291 Layer.provide(noopAnalyticsLayer),286 Layer.provide(AnalyticsService.layerTest),
292 );287 );
293288
294 yield* Effect.gen(function* () {289 yield* Effect.gen(function* () {
...@@ -347,7 +342,7 @@ it.effect(...@@ -347,7 +342,7 @@ it.effect(
347 const firstProviderLayer = makeProviderServiceLive().pipe(342 const firstProviderLayer = makeProviderServiceLive().pipe(
348 Layer.provide(Layer.succeed(ProviderAdapterRegistry, firstRegistry)),343 Layer.provide(Layer.succeed(ProviderAdapterRegistry, firstRegistry)),
349 Layer.provide(firstDirectoryLayer),344 Layer.provide(firstDirectoryLayer),
350 Layer.provide(noopAnalyticsLayer),345 Layer.provide(AnalyticsService.layerTest),
351 );346 );
352347
353 const startedSession = yield* Effect.gen(function* () {348 const startedSession = yield* Effect.gen(function* () {
...@@ -390,7 +385,7 @@ it.effect(...@@ -390,7 +385,7 @@ it.effect(
390 const secondProviderLayer = makeProviderServiceLive().pipe(385 const secondProviderLayer = makeProviderServiceLive().pipe(
391 Layer.provide(Layer.succeed(ProviderAdapterRegistry, secondRegistry)),386 Layer.provide(Layer.succeed(ProviderAdapterRegistry, secondRegistry)),
392 Layer.provide(secondDirectoryLayer),387 Layer.provide(secondDirectoryLayer),
393 Layer.provide(noopAnalyticsLayer),388 Layer.provide(AnalyticsService.layerTest),
394 );389 );
395390
396 secondCodex.startSession.mockClear();391 secondCodex.startSession.mockClear();
apps/server/src/telemetry/Layers/AnalyticsService.ts+19-17
...@@ -96,26 +96,28 @@ const makeAnalyticsService = Effect.gen(function* () {...@@ -96,26 +96,28 @@ const makeAnalyticsService = Effect.gen(function* () {
96 });96 });
9797
98 const flush: AnalyticsServiceShape["flush"] = Effect.gen(function* () {98 const flush: AnalyticsServiceShape["flush"] = Effect.gen(function* () {
99 const batch = yield* Ref.modify(bufferRef, (current) => {99 while (true) {
100 if (current.length === 0) {100 const batch = yield* Ref.modify(bufferRef, (current) => {
101 return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const;101 if (current.length === 0) {
102 }102 return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const;
103 const nextBatch = current.slice(0, telemetryConfig.flushBatchSize);103 }
104 const remaining = current.slice(nextBatch.length);104 const nextBatch = current.slice(0, telemetryConfig.flushBatchSize);
105 return [nextBatch, remaining] as const;105 const remaining = current.slice(nextBatch.length);
106 });106 return [nextBatch, remaining] as const;
107 });
107108
108 if (batch.length === 0) {109 if (batch.length === 0) {
109 return;110 return;
110 }111 }
111112
112 yield* sendBatch(batch).pipe(113 yield* sendBatch(batch).pipe(
113 Effect.catch((error) =>114 Effect.catch((error) =>
114 Ref.update(bufferRef, (current) => [...batch, ...current]).pipe(115 Ref.update(bufferRef, (current) => [...batch, ...current]).pipe(
115 Effect.flatMap(() => Effect.fail(error)),116 Effect.flatMap(() => Effect.fail(error)),
117 ),
116 ),118 ),
117 ),119 );
118 );120 }
119 }).pipe(Effect.catch((cause) => Effect.logError("Failed to flush telemetry", { cause })));121 }).pipe(Effect.catch((cause) => Effect.logError("Failed to flush telemetry", { cause })));
120122
121 const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) {123 const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) {