refactor(tui): simplify console state plumbing

This commit is contained in:
Kit Langton
2026-04-04 12:17:57 -04:00
parent 2036d40771
commit b4a6bd5eda
5 changed files with 16 additions and 23 deletions

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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 {

View File

@@ -377,7 +377,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
const blockingRequests: Promise<unknown>[] = [
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!))),

View File

@@ -1051,8 +1051,7 @@ export namespace Config {
config: Info
directories: string[]
deps: Promise<void>[]
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* () {