diff --git a/apps/server/src/provider/Layers/ProviderRegistry.ts b/apps/server/src/provider/Layers/ProviderRegistry.ts index 1e66ce8ff5..fb2f33c293 100644 --- a/apps/server/src/provider/Layers/ProviderRegistry.ts +++ b/apps/server/src/provider/Layers/ProviderRegistry.ts @@ -40,18 +40,19 @@ export const ProviderRegistryLive = Layer.effect( yield* loadProviders(codexProvider, claudeProvider), ); - const syncProviders = (options?: { readonly publish?: boolean }) => - Effect.gen(function* () { - const previousProviders = yield* Ref.get(providersRef); - const providers = yield* loadProviders(codexProvider, claudeProvider); - yield* Ref.set(providersRef, providers); + const syncProviders = Effect.fn("syncProviders")(function* (options?: { + readonly publish?: boolean; + }) { + const previousProviders = yield* Ref.get(providersRef); + const providers = yield* loadProviders(codexProvider, claudeProvider); + yield* Ref.set(providersRef, providers); - if (options?.publish !== false && haveProvidersChanged(previousProviders, providers)) { - yield* PubSub.publish(changesPubSub, providers); - } + if (options?.publish !== false && haveProvidersChanged(previousProviders, providers)) { + yield* PubSub.publish(changesPubSub, providers); + } - return providers; - }); + return providers; + }); yield* Stream.runForEach(codexProvider.streamChanges, () => syncProviders()).pipe( Effect.forkScoped, @@ -60,28 +61,30 @@ export const ProviderRegistryLive = Layer.effect( Effect.forkScoped, ); + const refresh = Effect.fn("refresh")(function* (provider?: ProviderKind) { + switch (provider) { + case "codex": + yield* codexProvider.refresh; + break; + case "claudeAgent": + yield* claudeProvider.refresh; + break; + default: + yield* Effect.all([codexProvider.refresh, claudeProvider.refresh], { + concurrency: "unbounded", + }); + break; + } + return yield* syncProviders(); + }); + return { getProviders: syncProviders({ publish: false }).pipe( Effect.tapError(Effect.logError), Effect.orElseSucceed(() => []), ), refresh: (provider?: ProviderKind) => - Effect.gen(function* () { - switch (provider) { - case "codex": - yield* codexProvider.refresh; - break; - case "claudeAgent": - yield* claudeProvider.refresh; - break; - default: - yield* Effect.all([codexProvider.refresh, claudeProvider.refresh], { - concurrency: "unbounded", - }); - break; - } - return yield* syncProviders(); - }).pipe( + refresh(provider).pipe( Effect.tapError(Effect.logError), Effect.orElseSucceed(() => []), ),