Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Frank <frank@anoma.ly>
51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
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<Event, { type: key }>
|
|
}
|
|
|
|
export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
|
|
name: "SDK",
|
|
init: (props: { directory: Accessor<string> }) => {
|
|
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<SDKEventMap>()
|
|
|
|
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
|
|
},
|
|
}
|
|
},
|
|
})
|