summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-10 14:48:08 -0600
committerAdam <[email protected]>2025-12-10 15:17:03 -0600
commit190fa4c87aa2b3f954a419f716add1fc29e4011e (patch)
tree835e91a7457c4d92fd8d3118d225f12843b80a5b /packages/desktop/src/context
parent91d743ef9a5c346fe17bb857db68dca92a6e9ba1 (diff)
downloadopencode-190fa4c87aa2b3f954a419f716add1fc29e4011e.tar.gz
opencode-190fa4c87aa2b3f954a419f716add1fc29e4011e.zip
wip(desktop): progress
Diffstat (limited to 'packages/desktop/src/context')
-rw-r--r--packages/desktop/src/context/global-sync.tsx26
-rw-r--r--packages/desktop/src/context/layout.tsx20
-rw-r--r--packages/desktop/src/context/local.tsx38
-rw-r--r--packages/desktop/src/context/session.tsx2
-rw-r--r--packages/desktop/src/context/sync.tsx6
5 files changed, 56 insertions, 36 deletions
diff --git a/packages/desktop/src/context/global-sync.tsx b/packages/desktop/src/context/global-sync.tsx
index 3e2b6bf7d..3a6062fb8 100644
--- a/packages/desktop/src/context/global-sync.tsx
+++ b/packages/desktop/src/context/global-sync.tsx
@@ -1,7 +1,6 @@
import type {
Message,
Agent,
- Provider,
Session,
Part,
Config,
@@ -12,6 +11,7 @@ import type {
FileDiff,
Todo,
SessionStatus,
+ ProviderListResponse,
} from "@opencode-ai/sdk/v2"
import { createStore, produce, reconcile } from "solid-js/store"
import { Binary } from "@opencode-ai/util/binary"
@@ -20,9 +20,9 @@ import { useGlobalSDK } from "./global-sdk"
type State = {
ready: boolean
- // provider: Provider[]
agent: Agent[]
project: string
+ provider: ProviderListResponse
config: Config
path: Path
session: Session[]
@@ -49,15 +49,16 @@ type State = {
export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimpleContext({
name: "GlobalSync",
init: () => {
+ const sdk = useGlobalSDK()
const [globalStore, setGlobalStore] = createStore<{
ready: boolean
- projects: Project[]
- providers: Provider[]
+ project: Project[]
+ provider: ProviderListResponse
children: Record<string, State>
}>({
ready: false,
- projects: [],
- providers: [],
+ project: [],
+ provider: { all: [], connected: [], default: {} },
children: {},
})
@@ -66,11 +67,11 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
if (!children[directory]) {
setGlobalStore("children", directory, {
project: "",
+ provider: { all: [], connected: [], default: {} },
config: {},
path: { state: "", config: "", worktree: "", directory: "", home: "" },
ready: false,
agent: [],
- // provider: [],
session: [],
session_status: {},
session_diff: {},
@@ -86,7 +87,6 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
return children[directory]
}
- const sdk = useGlobalSDK()
sdk.event.listen((e) => {
const directory = e.name
const event = e.details
@@ -94,13 +94,13 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
if (directory === "global") {
switch (event.type) {
case "project.updated": {
- const result = Binary.search(globalStore.projects, event.properties.id, (s) => s.id)
+ const result = Binary.search(globalStore.project, event.properties.id, (s) => s.id)
if (result.found) {
- setGlobalStore("projects", result.index, reconcile(event.properties))
+ setGlobalStore("project", result.index, reconcile(event.properties))
return
}
setGlobalStore(
- "projects",
+ "project",
produce((draft) => {
draft.splice(result.index, 0, event.properties)
}),
@@ -184,14 +184,14 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple
Promise.all([
sdk.client.project.list().then(async (x) => {
setGlobalStore(
- "projects",
+ "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("providers", x.data ?? [])
+ setGlobalStore("provider", x.data ?? {})
}),
]).then(() => setGlobalStore("ready", true))
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index 13c4679d6..1de8550cb 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -40,9 +40,14 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
}),
{
- name: "default-layout.v6",
+ name: "default-layout.v7",
},
)
+ const [ephemeral, setEphemeral] = createStore({
+ dialog: {
+ open: undefined as undefined | "provider" | "model",
+ },
+ })
function pickAvailableColor() {
const available = PASTEL_COLORS.filter((c) => !colors().has(c))
@@ -51,7 +56,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
}
function enrich(project: { worktree: string; expanded: boolean }) {
- const metadata = globalSync.data.projects.find((x) => x.worktree === project.worktree)
+ const metadata = globalSync.data.project.find((x) => x.worktree === project.worktree)
if (!metadata) return []
return [
{
@@ -168,6 +173,17 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("review", "state", "tab")
},
},
+ dialog: {
+ opened: createMemo(() => ephemeral.dialog?.open),
+ open(dialog: "provider" | "model") {
+ setEphemeral("dialog", "open", dialog)
+ },
+ close(dialog: "provider" | "model") {
+ if (ephemeral.dialog?.open === dialog) {
+ setEphemeral("dialog", "open", undefined)
+ }
+ },
+ },
}
},
})
diff --git a/packages/desktop/src/context/local.tsx b/packages/desktop/src/context/local.tsx
index 58a65b0de..74d3ac364 100644
--- a/packages/desktop/src/context/local.tsx
+++ b/packages/desktop/src/context/local.tsx
@@ -39,8 +39,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const sync = useSync()
function isModelValid(model: ModelKey) {
- const provider = sync.data.provider.find((x) => x.id === model.providerID)
- return !!provider?.models[model.modelID]
+ const provider = sync.data.provider?.all.find((x) => x.id === model.providerID)
+ return !!provider?.models[model.modelID] && sync.data.provider?.connected.includes(model.providerID)
}
function getFirstValidModel(...modelFns: (() => ModelKey | undefined)[]) {
@@ -115,17 +115,16 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})
const list = createMemo(() =>
- sync.data.provider.flatMap((p) =>
- Object.values(p.models).map(
- (m) =>
- ({
- ...m,
- name: m.name.replace("(latest)", "").trim(),
- provider: p,
- latest: m.name.includes("(latest)"),
- }) as LocalModel,
+ sync.data.provider.all
+ .filter((p) => sync.data.provider.connected.includes(p.id))
+ .flatMap((p) =>
+ Object.values(p.models).map((m) => ({
+ ...m,
+ name: m.name.replace("(latest)", "").trim(),
+ provider: p,
+ latest: m.name.includes("(latest)"),
+ })),
),
- ),
)
const find = (key: ModelKey) => list().find((m) => m.id === key?.modelID && m.provider.id === key.providerID)
@@ -145,12 +144,17 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
return item
}
}
- const provider = sync.data.provider[0]
- const model = Object.values(provider.models)[0]
- return {
- providerID: provider.id,
- modelID: model.id,
+
+ for (const p of sync.data.provider.connected) {
+ if (p in sync.data.provider.default) {
+ return {
+ providerID: p,
+ modelID: sync.data.provider.default[p],
+ }
+ }
}
+
+ throw new Error("No default model found")
})
const currentModel = createMemo(() => {
diff --git a/packages/desktop/src/context/session.tsx b/packages/desktop/src/context/session.tsx
index 31004811b..db2b3af7c 100644
--- a/packages/desktop/src/context/session.tsx
+++ b/packages/desktop/src/context/session.tsx
@@ -94,7 +94,7 @@ export const { use: useSession, provider: SessionProvider } = createSimpleContex
() => messages().findLast((x) => x.role === "assistant" && x.tokens.output > 0) as AssistantMessage,
)
const model = createMemo(() =>
- last() ? sync.data.provider.find((x) => x.id === last().providerID)?.models[last().modelID] : undefined,
+ last() ? sync.data.provider.all.find((x) => x.id === last().providerID)?.models[last().modelID] : undefined,
)
const diffs = createMemo(() => (params.id ? (sync.data.session_diff[params.id] ?? []) : []))
diff --git a/packages/desktop/src/context/sync.tsx b/packages/desktop/src/context/sync.tsx
index 85986c327..1a11cd599 100644
--- a/packages/desktop/src/context/sync.tsx
+++ b/packages/desktop/src/context/sync.tsx
@@ -14,7 +14,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
const load = {
project: () => sdk.client.project.current().then((x) => setStore("project", x.data!.id)),
- provider: () => sdk.client.config.providers().then((x) => setStore("provider", x.data!.providers)),
+ provider: () => sdk.client.provider.list().then((x) => setStore("provider", x.data!)),
path: () => sdk.client.path.get().then((x) => setStore("path", x.data!)),
agent: () => sdk.client.app.agents().then((x) => setStore("agent", x.data ?? [])),
session: () =>
@@ -42,8 +42,8 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
return store.ready
},
get project() {
- const match = Binary.search(globalSync.data.projects, store.project, (p) => p.id)
- if (match.found) return globalSync.data.projects[match.index]
+ const match = Binary.search(globalSync.data.project, store.project, (p) => p.id)
+ if (match.found) return globalSync.data.project[match.index]
return undefined
},
session: {