summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-10 21:16:50 -0600
committerAdam <[email protected]>2025-12-11 06:48:58 -0600
commit3bb546c94d6bb295bfeafdafbb9d34b7cc462560 (patch)
tree54ae4fa1b18c68d23ff460caab596e942593a857 /packages/desktop/src/context
parent8e15bcb68e9a8a37bb12afca3984f3967ccb58eb (diff)
downloadopencode-3bb546c94d6bb295bfeafdafbb9d34b7cc462560.tar.gz
opencode-3bb546c94d6bb295bfeafdafbb9d34b7cc462560.zip
wip(desktop): progress
Diffstat (limited to 'packages/desktop/src/context')
-rw-r--r--packages/desktop/src/context/global-sync.tsx44
-rw-r--r--packages/desktop/src/context/layout.tsx22
-rw-r--r--packages/desktop/src/context/sync.tsx23
3 files changed, 69 insertions, 20 deletions
diff --git a/packages/desktop/src/context/global-sync.tsx b/packages/desktop/src/context/global-sync.tsx
index 3a6062fb8..09dfb3a83 100644
--- a/packages/desktop/src/context/global-sync.tsx
+++ b/packages/desktop/src/context/global-sync.tsx
@@ -12,11 +12,13 @@ import type {
Todo,
SessionStatus,
ProviderListResponse,
+ ProviderAuthResponse,
} from "@opencode-ai/sdk/v2"
import { createStore, produce, reconcile } from "solid-js/store"
import { Binary } from "@opencode-ai/util/binary"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { useGlobalSDK } from "./global-sdk"
+import { onMount } from "solid-js"
type State = {
ready: boolean
@@ -54,11 +56,13 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
ready: boolean
project: Project[]
provider: ProviderListResponse
+ provider_auth: ProviderAuthResponse
children: Record<string, State>
}>({
ready: false,
project: [],
provider: { all: [], connected: [], default: {} },
+ provider_auth: {},
children: {},
})
@@ -113,6 +117,10 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
const [store, setStore] = child(directory)
switch (event.type) {
+ // case "server.instance.disposed": {
+ // bootstrap()
+ // break
+ // }
case "session.updated": {
const result = Binary.search(store.session, event.properties.info.id, (s) => s.id)
if (result.found) {
@@ -181,19 +189,28 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
}
})
- Promise.all([
- sdk.client.project.list().then(async (x) => {
- setGlobalStore(
- "project",
- x
- .data!.filter((p) => !p.worktree.includes("opencode-test") && p.vcs)
- .sort((a, b) => a.id.localeCompare(b.id)),
- )
- }),
- sdk.client.provider.list().then((x) => {
- setGlobalStore("provider", x.data ?? {})
- }),
- ]).then(() => setGlobalStore("ready", true))
+ async function bootstrap() {
+ return Promise.all([
+ sdk.client.project.list().then(async (x) => {
+ setGlobalStore(
+ "project",
+ x
+ .data!.filter((p) => !p.worktree.includes("opencode-test") && p.vcs)
+ .sort((a, b) => a.id.localeCompare(b.id)),
+ )
+ }),
+ sdk.client.provider.list().then((x) => {
+ setGlobalStore("provider", x.data ?? {})
+ }),
+ sdk.client.provider.auth().then((x) => {
+ setGlobalStore("provider_auth", x.data ?? {})
+ }),
+ ]).then(() => setGlobalStore("ready", true))
+ }
+
+ onMount(() => {
+ bootstrap()
+ })
return {
data: globalStore,
@@ -201,6 +218,7 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
return globalStore.ready
},
child,
+ bootstrap,
}
},
})
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index 5530ad28f..d00e101b8 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -1,5 +1,5 @@
import { createStore } from "solid-js/store"
-import { createMemo, onMount } from "solid-js"
+import { batch, createMemo, onMount } from "solid-js"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { makePersisted } from "@solid-primitives/storage"
import { useGlobalSync } from "./global-sync"
@@ -19,6 +19,8 @@ const PASTEL_COLORS = [
"#C1E1C1", // pastel mint
]
+type Dialog = "provider" | "model" | "connect"
+
export const { use: useLayout, provider: LayoutProvider } = createSimpleContext({
name: "Layout",
init: () => {
@@ -44,8 +46,11 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
)
const [ephemeral, setEphemeral] = createStore({
+ connect: {
+ provider: undefined as undefined | string,
+ },
dialog: {
- open: undefined as undefined | "provider" | "model",
+ open: undefined as undefined | Dialog,
},
})
const usedColors = new Set<string>()
@@ -169,14 +174,23 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
dialog: {
opened: createMemo(() => ephemeral.dialog?.open),
- open(dialog: "provider" | "model") {
+ open(dialog: Dialog) {
setEphemeral("dialog", "open", dialog)
},
- close(dialog: "provider" | "model") {
+ close(dialog: Dialog) {
if (ephemeral.dialog?.open === dialog) {
setEphemeral("dialog", "open", undefined)
}
},
+ connect(provider: string) {
+ batch(() => {
+ setEphemeral("dialog", "open", "connect")
+ setEphemeral("connect", "provider", provider)
+ })
+ },
+ },
+ connect: {
+ provider: createMemo(() => ephemeral.connect.provider),
},
}
},
diff --git a/packages/desktop/src/context/sync.tsx b/packages/desktop/src/context/sync.tsx
index 1a11cd599..d64fcce2a 100644
--- a/packages/desktop/src/context/sync.tsx
+++ b/packages/desktop/src/context/sync.tsx
@@ -1,5 +1,5 @@
import { produce } from "solid-js/store"
-import { createMemo } from "solid-js"
+import { createMemo, onMount } from "solid-js"
import { Binary } from "@opencode-ai/util/binary"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { useGlobalSync } from "./global-sync"
@@ -31,7 +31,24 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
node: () => sdk.client.file.list({ path: "/" }).then((x) => setStore("node", x.data!)),
}
- Promise.all(Object.values(load).map((p) => p())).then(() => setStore("ready", true))
+ async function bootstrap() {
+ return Promise.all(Object.values(load).map((p) => p())).then(() => setStore("ready", true))
+ }
+
+ onMount(() => {
+ bootstrap()
+ })
+
+ sdk.event.listen((e) => {
+ if (e.name !== sdk.directory) return
+ const event = e.details
+ switch (event.type) {
+ case "server.instance.disposed": {
+ bootstrap()
+ break
+ }
+ }
+ })
const absolute = (path: string) => (store.path.directory + "/" + path).replace("//", "/")
@@ -82,7 +99,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
},
more: createMemo(() => store.session.length >= store.limit),
},
- load,
+ bootstrap,
absolute,
get directory() {
return store.path.directory