import type { Event } from "@opencode-ai/sdk/v2/client" import { createSimpleContext } from "@opencode-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { type Accessor, createEffect, createMemo, onCleanup } from "solid-js" import { useGlobalSDK } from "./global-sdk" type SDKEventMap = { [key in Event["type"]]: Extract } export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ name: "SDK", init: (props: { directory: Accessor }) => { const globalSDK = useGlobalSDK() const directory = createMemo(props.directory) const client = createMemo(() => globalSDK.createClient({ directory: directory(), throwOnError: true, }), ) const emitter = createGlobalEmitter() createEffect(() => { const unsub = globalSDK.event.on(directory(), (event) => { emitter.emit(event.type, event) }) onCleanup(unsub) }) return { get directory() { return directory() }, get client() { return client() }, event: emitter, get url() { return globalSDK.url }, createClient(opts: Parameters[0]) { return globalSDK.createClient(opts) }, } }, })