import type { ProviderKind, ServerProvider } from "@t3tools/contracts"; import type { Stream } from "effect"; import type { ProviderAdapterError } from "./Errors.ts"; import type { ProviderAdapterShape } from "./Services/ProviderAdapter.ts"; import type { ServerProviderShape } from "./Services/ServerProvider.ts"; export type ProviderSnapshotSource = { readonly provider: ProviderKind; readonly getSnapshot: ServerProviderShape["getSnapshot"]; readonly refresh: ServerProviderShape["refresh"]; readonly streamChanges: Stream.Stream; }; type BuiltInProviderServiceMap = Record; type BuiltInAdapterMap = { readonly codex: ProviderAdapterShape; readonly claudeAgent: ProviderAdapterShape; readonly opencode: ProviderAdapterShape; readonly cursor?: ProviderAdapterShape; }; export const BUILT_IN_PROVIDER_ORDER = [ "codex", "claudeAgent", "opencode", "cursor", ] as const satisfies ReadonlyArray; export function createBuiltInProviderSources( services: BuiltInProviderServiceMap, ): ReadonlyArray { return BUILT_IN_PROVIDER_ORDER.map((provider) => ({ provider, getSnapshot: services[provider].getSnapshot, refresh: services[provider].refresh, streamChanges: services[provider].streamChanges, })); } export function createBuiltInAdapterList( adapters: BuiltInAdapterMap, ): ReadonlyArray> { return [ adapters.codex, adapters.claudeAgent, adapters.opencode, ...(adapters.cursor ? [adapters.cursor] : []), ]; }