| author | |
| committer | |
| log | 268bb4bfa3c2e33aaedb456885475f61ca8b0845 |
| tree | edc63b572ca644af4193d3fec48c969876ae4309 |
| parent | 477b4f9d0ec7e7a48cb74357ea00ecf7bddfc62f |
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 | ); |
| 273 | 263 | ||
| 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)); |
| 68 | 65 | ||
| 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") { |
| 215 | const sleep = (ms: number) => | 215 | const sleep = (ms: number) => |
| 216 | Effect.promise(() => new Promise<void>((resolve) => setTimeout(resolve, ms))); | 216 | Effect.promise(() => new Promise<void>((resolve) => setTimeout(resolve, ms))); |
| 217 | 217 | ||
| 218 | const noopAnalyticsLayer = Layer.succeed(AnalyticsService, { | ||
| 219 | record: () => Effect.void, | ||
| 220 | flush: Effect.void, | ||
| 221 | }); | ||
| 222 | |||
| 223 | function makeProviderServiceLayer() { | 218 | function 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, |
| 247 | 242 | ||
| ... | @@ -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 | ); |
| 293 | 288 | ||
| 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 | ); |
| 352 | 347 | ||
| 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 | ); |
| 395 | 390 | ||
| 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 | }); |
| 97 | 97 | ||
| 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 | }); | ||
| 107 | 108 | ||
| 108 | if (batch.length === 0) { | 109 | if (batch.length === 0) { |
| 109 | return; | 110 | return; |
| 110 | } | 111 | } |
| 111 | 112 | ||
| 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 }))); |
| 120 | 122 | ||
| 121 | const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) { | 123 | const record: AnalyticsServiceShape["record"] = Effect.fnUntraced(function* (event, properties) { |