import { useGlobalSync } from "@/context/global-sync" import { decode64 } from "@/utils/base64" import { useParams } from "@solidjs/router" import { Iterable, pipe } from "effect" import { createMemo } from "solid-js" export const popularProviders = [ "opencode", "opencode-go", "anthropic", "github-copilot", "openai", "google", "openrouter", "vercel", ] const popularProviderSet = new Set(popularProviders) export function useProviders() { const globalSync = useGlobalSync() const params = useParams() const dir = createMemo(() => decode64(params.dir) ?? "") const providers = () => { if (dir()) { const [projectStore] = globalSync.child(dir()) if (projectStore.provider_ready) return projectStore.provider } return globalSync.data.provider } return { all: () => providers().all, default: () => providers().default, popular: () => pipe( providers().all, Iterable.map(([, p]) => p), Iterable.filter((p) => popularProviderSet.has(p.id)), (v) => Array.from(v), ), connected: () => { const connected = new Set(providers().connected) return pipe( providers().all, Iterable.map(([, p]) => p), Iterable.filter((p) => connected.has(p.id)), (v) => Array.from(v), ) }, paid: () => { const connected = new Set(providers().connected) return [ ...Iterable.filter( providers().all, ([id]) => connected.has(id) && (id !== "opencode" || Object.values(providers().all.get(id)?.models ?? {}).some((m) => m.cost?.input)), ), ] }, } }