import { describe, it, assert } from "@effect/vitest"; import { ProviderDriverKind, ProviderInstanceId, type ServerProvider } from "@t3tools/contracts"; import { createModelCapabilities } from "@t3tools/shared/model"; import * as Deferred from "effect/Deferred"; import * as Effect from "effect/Effect"; import * as Fiber from "effect/Fiber"; import * as PubSub from "effect/PubSub"; import * as Ref from "effect/Ref"; import * as Stream from "effect/Stream"; import { makeManagedServerProvider } from "./makeManagedServerProvider.ts"; const emptyCapabilities = createModelCapabilities({ optionDescriptors: [] }); const fastModeCapabilities = createModelCapabilities({ optionDescriptors: [ { id: "fastMode", label: "Fast Mode", type: "boolean", }, ], }); interface TestSettings { readonly enabled: boolean; } const maintenanceCapabilities = { provider: ProviderDriverKind.make("codex"), packageName: "@openai/codex", update: { command: "npm install -g @openai/codex@latest", executable: "npm", args: ["install", "-g", "@openai/codex@latest"], lockKey: "npm-global", }, } as const; const initialSnapshot: ServerProvider = { instanceId: ProviderInstanceId.make("codex"), driver: ProviderDriverKind.make("codex"), enabled: true, installed: true, version: null, status: "warning", auth: { status: "unknown" }, checkedAt: "2026-04-10T00:00:00.000Z", message: "Checking provider availability...", models: [], slashCommands: [], skills: [], }; const refreshedSnapshot: ServerProvider = { instanceId: ProviderInstanceId.make("codex"), driver: ProviderDriverKind.make("codex"), enabled: true, installed: true, version: "1.0.0", status: "ready", auth: { status: "authenticated" }, checkedAt: "2026-04-10T00:00:01.000Z", models: [], slashCommands: [], skills: [], }; const enrichedSnapshot: ServerProvider = { ...refreshedSnapshot, checkedAt: "2026-04-10T00:00:02.000Z", models: [ { slug: "composer-2", name: "Composer 2", isCustom: false, capabilities: fastModeCapabilities, }, ], }; const refreshedSnapshotSecond: ServerProvider = { ...refreshedSnapshot, checkedAt: "2026-04-10T00:00:03.000Z", message: "Refreshed provider availability again.", }; const enrichedSnapshotSecond: ServerProvider = { ...refreshedSnapshotSecond, checkedAt: "2026-04-10T00:00:04.000Z", models: [ { slug: "gpt-5.4", name: "GPT-5.4", isCustom: false, capabilities: emptyCapabilities, }, ], }; describe("makeManagedServerProvider", () => { it.effect( "runs the initial provider check in the background and streams the refreshed snapshot", () => Effect.scoped( Effect.gen(function* () { const checkCalls = yield* Ref.make(0); const releaseCheck = yield* Deferred.make(); const provider = yield* makeManagedServerProvider({ maintenanceCapabilities, getSettings: Effect.succeed({ enabled: true }), streamSettings: Stream.empty, haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled, initialSnapshot: () => Effect.succeed(initialSnapshot), checkProvider: Ref.update(checkCalls, (count) => count + 1).pipe( Effect.flatMap(() => Deferred.await(releaseCheck)), Effect.as(refreshedSnapshot), ), refreshInterval: "1 hour", }); const initial = yield* provider.getSnapshot; assert.deepStrictEqual(initial, initialSnapshot); const updatesFiber = yield* Stream.take(provider.streamChanges, 1).pipe( Stream.runCollect, Effect.forkChild, ); yield* Effect.yieldNow; assert.strictEqual(yield* Ref.get(checkCalls), 1); yield* Deferred.succeed(releaseCheck, undefined); const updates = Array.from(yield* Fiber.join(updatesFiber)); const latest = yield* provider.getSnapshot; assert.deepStrictEqual(updates, [refreshedSnapshot]); assert.deepStrictEqual(latest, refreshedSnapshot); assert.strictEqual(yield* Ref.get(checkCalls), 1); }), ), ); it.effect("reruns the provider check when streamed settings change", () => Effect.scoped( Effect.gen(function* () { const settingsRef = yield* Ref.make({ enabled: true }); const settingsChanges = yield* PubSub.unbounded(); const checkCalls = yield* Ref.make(0); const releaseInitialCheck = yield* Deferred.make(); const releaseSettingsCheck = yield* Deferred.make(); const provider = yield* makeManagedServerProvider({ maintenanceCapabilities, getSettings: Ref.get(settingsRef), streamSettings: Stream.fromPubSub(settingsChanges), haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled, initialSnapshot: () => Effect.succeed(initialSnapshot), checkProvider: Ref.updateAndGet(checkCalls, (count) => count + 1).pipe( Effect.flatMap((count) => count === 1 ? Deferred.await(releaseInitialCheck).pipe(Effect.as(refreshedSnapshot)) : Deferred.await(releaseSettingsCheck).pipe(Effect.as(refreshedSnapshotSecond)), ), ), refreshInterval: "1 hour", }); const updatesFiber = yield* Stream.take(provider.streamChanges, 2).pipe( Stream.runCollect, Effect.forkChild, ); yield* Effect.yieldNow; yield* Deferred.succeed(releaseInitialCheck, undefined); yield* Ref.set(settingsRef, { enabled: false }); yield* PubSub.publish(settingsChanges, { enabled: false }); yield* Deferred.succeed(releaseSettingsCheck, undefined); const updates = Array.from(yield* Fiber.join(updatesFiber)); const latest = yield* provider.getSnapshot; assert.deepStrictEqual(updates, [refreshedSnapshot, refreshedSnapshotSecond]); assert.deepStrictEqual(latest, refreshedSnapshotSecond); assert.strictEqual(yield* Ref.get(checkCalls), 2); }), ), ); it.effect("streams supplemental snapshot updates after the base provider check completes", () => Effect.scoped( Effect.gen(function* () { const releaseEnrichment = yield* Deferred.make(); const releaseCheck = yield* Deferred.make(); const provider = yield* makeManagedServerProvider({ maintenanceCapabilities, getSettings: Effect.succeed({ enabled: true }), streamSettings: Stream.empty, haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled, initialSnapshot: () => Effect.succeed(initialSnapshot), checkProvider: Deferred.await(releaseCheck).pipe(Effect.as(refreshedSnapshot)), enrichSnapshot: ({ publishSnapshot }) => Deferred.await(releaseEnrichment).pipe( Effect.flatMap(() => publishSnapshot(enrichedSnapshot)), ), refreshInterval: "1 hour", }); const updatesFiber = yield* Stream.take(provider.streamChanges, 2).pipe( Stream.runCollect, Effect.forkChild, ); yield* Effect.yieldNow; yield* Deferred.succeed(releaseCheck, undefined); yield* Deferred.succeed(releaseEnrichment, undefined); const updates = Array.from(yield* Fiber.join(updatesFiber)); const latest = yield* provider.getSnapshot; assert.deepStrictEqual(updates, [refreshedSnapshot, enrichedSnapshot]); assert.deepStrictEqual(latest, enrichedSnapshot); }), ), ); it.effect("ignores stale enrichment callbacks after a newer refresh advances generation", () => Effect.scoped( Effect.gen(function* () { const publishCallbacks: Array<(snapshot: ServerProvider) => Effect.Effect> = []; const refreshCount = yield* Ref.make(0); const firstCallbackReady = yield* Deferred.make(); const secondCallbackReady = yield* Deferred.make(); const allowFirstRefresh = yield* Deferred.make(); const provider = yield* makeManagedServerProvider({ maintenanceCapabilities, getSettings: Effect.succeed({ enabled: true }), streamSettings: Stream.empty, haveSettingsChanged: (previous, next) => previous.enabled !== next.enabled, initialSnapshot: () => Effect.succeed(initialSnapshot), checkProvider: Ref.updateAndGet(refreshCount, (count) => count + 1).pipe( Effect.flatMap((count) => count === 1 ? Deferred.await(allowFirstRefresh).pipe(Effect.as(refreshedSnapshot)) : Effect.succeed(refreshedSnapshotSecond), ), ), enrichSnapshot: ({ publishSnapshot }) => Effect.gen(function* () { publishCallbacks.push(publishSnapshot); if (publishCallbacks.length === 1) { yield* Deferred.succeed(firstCallbackReady, undefined).pipe(Effect.ignore); } else if (publishCallbacks.length === 2) { yield* Deferred.succeed(secondCallbackReady, undefined).pipe(Effect.ignore); } }), refreshInterval: "1 hour", }); const updatesFiber = yield* Stream.take(provider.streamChanges, 3).pipe( Stream.runCollect, Effect.forkChild, ); yield* Effect.yieldNow; yield* Deferred.succeed(allowFirstRefresh, undefined); yield* Deferred.await(firstCallbackReady); yield* provider.refresh; yield* Deferred.await(secondCallbackReady); yield* publishCallbacks[0]!(enrichedSnapshot); yield* publishCallbacks[1]!(enrichedSnapshotSecond); const updates = Array.from(yield* Fiber.join(updatesFiber)); const latest = yield* provider.getSnapshot; assert.deepStrictEqual(updates, [ refreshedSnapshot, refreshedSnapshotSecond, enrichedSnapshotSecond, ]); assert.deepStrictEqual(latest, enrichedSnapshotSecond); }), ), ); });