From b4a6bd5eda7bd464925d9cbcc4b4c3c1af4e3371 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Sat, 4 Apr 2026 12:17:57 -0400 Subject: [PATCH] refactor(tui): simplify console state plumbing --- .../cli/cmd/tui/component/dialog-console-org.tsx | 10 ++-------- .../src/cli/cmd/tui/component/dialog-model.tsx | 9 ++++++--- .../src/cli/cmd/tui/component/dialog-provider.tsx | 4 +--- packages/opencode/src/cli/cmd/tui/context/sync.tsx | 2 +- packages/opencode/src/config/config.ts | 14 ++++++-------- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-console-org.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-console-org.tsx index 670f8fdfbd..eaf3450196 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-console-org.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-console-org.tsx @@ -4,15 +4,9 @@ import { useSDK } from "@tui/context/sdk" import { useDialog } from "@tui/ui/dialog" import { useToast } from "@tui/ui/toast" import { useTheme } from "@tui/context/theme" +import type { ExperimentalConsoleListOrgsResponse } from "@opencode-ai/sdk/v2" -type OrgOption = { - accountID: string - accountEmail: string - accountUrl: string - orgID: string - orgName: string - active: boolean -} +type OrgOption = ExperimentalConsoleListOrgsResponse["orgs"][number] const accountHost = (url: string) => { try { diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx index 966e3e7eec..1fd1c130c6 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -34,7 +34,6 @@ export function DialogModel(props: { providerID?: string }) { const showSections = showExtra() && needle.length === 0 const favorites = connected() ? local.model.favorite() : [] const recents = local.model.recent() - const consoleManagedProviders = new Set(sync.data.console_state.consoleManagedProviders) function toOptions(items: typeof favorites, category: string) { if (!showSections) return [] @@ -48,7 +47,11 @@ export function DialogModel(props: { providerID?: string }) { key: item, value: { providerID: provider.id, modelID: model.id }, title: model.name ?? item.modelID, - description: consoleManagedProviderLabel(consoleManagedProviders, provider.id, provider.name), + description: consoleManagedProviderLabel( + sync.data.console_state.consoleManagedProviders, + provider.id, + provider.name, + ), category, disabled: provider.id === "opencode" && model.id.includes("-nano"), footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined, @@ -87,7 +90,7 @@ export function DialogModel(props: { providerID?: string }) { ? "(Favorite)" : undefined, category: connected() - ? consoleManagedProviderLabel(consoleManagedProviders, provider.id, provider.name) + ? consoleManagedProviderLabel(sync.data.console_state.consoleManagedProviders, provider.id, provider.name) : undefined, disabled: provider.id === "opencode" && model.includes("-nano"), footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined, diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx index b6d8863bf3..8add73dd6e 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx @@ -31,13 +31,11 @@ export function createDialogProviderOptions() { const toast = useToast() const { theme } = useTheme() const options = createMemo(() => { - const consoleManagedProviders = new Set(sync.data.console_state.consoleManagedProviders) - return pipe( sync.data.provider_next.all, sortBy((x) => PROVIDER_PRIORITY[x.id] ?? 99), map((provider) => { - const consoleManaged = isConsoleManagedProvider(consoleManagedProviders, provider.id) + const consoleManaged = isConsoleManagedProvider(sync.data.console_state.consoleManagedProviders, provider.id) const connected = sync.data.provider_next.connected.includes(provider.id) return { diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index b85eacef1b..11336d5002 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -377,7 +377,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const blockingRequests: Promise[] = [ providersPromise, providerListPromise, - consoleStatePromise, agentsPromise, configPromise, ...(args.continue ? [sessionListPromise] : []), @@ -423,6 +422,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ // non-blocking Promise.all([ ...(args.continue ? [] : [sessionListPromise.then((sessions) => setStore("session", reconcile(sessions)))]), + consoleStatePromise.then((consoleState) => setStore("console_state", reconcile(consoleState))), sdk.client.command.list().then((x) => setStore("command", reconcile(x.data ?? []))), sdk.client.lsp.status().then((x) => setStore("lsp", reconcile(x.data!))), sdk.client.mcp.status().then((x) => setStore("mcp", reconcile(x.data!))), diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 8aea8f7382..83e677bcb7 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -1051,8 +1051,7 @@ export namespace Config { config: Info directories: string[] deps: Promise[] - consoleManagedProviders: string[] - activeOrgName?: string + consoleState: ConsoleState } export interface Interface { @@ -1467,8 +1466,10 @@ export namespace Config { config: result, directories, deps, - consoleManagedProviders: Array.from(consoleManagedProviders), - activeOrgName, + consoleState: { + consoleManagedProviders: Array.from(consoleManagedProviders), + activeOrgName, + }, } }) @@ -1487,10 +1488,7 @@ export namespace Config { }) const getConsoleState = Effect.fn("Config.getConsoleState")(function* () { - return yield* InstanceState.use(state, (s) => ({ - consoleManagedProviders: s.consoleManagedProviders, - activeOrgName: s.activeOrgName, - })) + return yield* InstanceState.use(state, (s) => s.consoleState) }) const waitForDependencies = Effect.fn("Config.waitForDependencies")(function* () {