import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client" import { createSimpleContext } from "@opencode-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { createEffect, createMemo, onCleanup, type Accessor } from "solid-js" import { useGlobalSDK } from "./global-sdk" import { usePlatform } from "./platform" type SDKEventMap = { [key in Event["type"]]: Extract } export const { use: useSDK, provider: SDKProvider } = createSimpleContext({ name: "SDK", init: (props: { directory: Accessor }) => { const platform = usePlatform() const globalSDK = useGlobalSDK() const directory = createMemo(props.directory) const client = createMemo(() => createOpencodeClient({ baseUrl: globalSDK.url, fetch: platform.fetch, 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 }, } }, })