From ae614d919f262c78d3d2feb099f2fe0f42d9cef5 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 7 Apr 2026 21:03:24 -0400 Subject: [PATCH] fix(tui): simplify console org display (#21339) Co-authored-by: opencode-agent[bot] --- .../cli/cmd/tui/component/dialog-model.tsx | 13 ++------ .../cli/cmd/tui/component/dialog-provider.tsx | 8 ++--- .../cli/cmd/tui/component/prompt/index.tsx | 25 ++------------- .../src/cli/cmd/tui/util/provider-origin.ts | 13 -------- packages/opencode/test/tool/registry.test.ts | 31 +++++++++++++++++++ packages/opencode/test/tool/webfetch.test.ts | 3 +- 6 files changed, 40 insertions(+), 53 deletions(-) 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 1fd1c130c6..fb6849d72d 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -8,7 +8,6 @@ import { createDialogProviderOptions, DialogProvider } from "./dialog-provider" import { DialogVariant } from "./dialog-variant" import { useKeybind } from "../context/keybind" import * as fuzzysort from "fuzzysort" -import { consoleManagedProviderLabel } from "@tui/util/provider-origin" export function useConnected() { const sync = useSync() @@ -47,11 +46,7 @@ export function DialogModel(props: { providerID?: string }) { key: item, value: { providerID: provider.id, modelID: model.id }, title: model.name ?? item.modelID, - description: consoleManagedProviderLabel( - sync.data.console_state.consoleManagedProviders, - provider.id, - provider.name, - ), + description: provider.name, category, disabled: provider.id === "opencode" && model.id.includes("-nano"), footer: model.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined, @@ -89,9 +84,7 @@ export function DialogModel(props: { providerID?: string }) { description: favorites.some((item) => item.providerID === provider.id && item.modelID === model) ? "(Favorite)" : undefined, - category: connected() - ? consoleManagedProviderLabel(sync.data.console_state.consoleManagedProviders, provider.id, provider.name) - : undefined, + category: connected() ? provider.name : undefined, disabled: provider.id === "opencode" && model.includes("-nano"), footer: info.cost?.input === 0 && provider.id === "opencode" ? "Free" : undefined, onSelect() { @@ -142,7 +135,7 @@ export function DialogModel(props: { providerID?: string }) { const title = createMemo(() => { const value = provider() if (!value) return "Select model" - return consoleManagedProviderLabel(sync.data.console_state.consoleManagedProviders, value.id, value.name) + return value.name }) function onSelect(providerID: string, modelID: string) { 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 cb7abb8227..c0e39e0e21 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx @@ -13,7 +13,7 @@ import { DialogModel } from "./dialog-model" import { useKeyboard } from "@opentui/solid" import { Clipboard } from "@tui/util/clipboard" import { useToast } from "../ui/toast" -import { CONSOLE_MANAGED_ICON, isConsoleManagedProvider } from "@tui/util/provider-origin" +import { isConsoleManagedProvider } from "@tui/util/provider-origin" const PROVIDER_PRIORITY: Record = { opencode: 0, @@ -49,11 +49,7 @@ export function createDialogProviderOptions() { }[provider.id], footer: consoleManaged ? sync.data.console_state.activeOrgName : undefined, category: provider.id in PROVIDER_PRIORITY ? "Popular" : "Other", - gutter: consoleManaged ? ( - {CONSOLE_MANAGED_ICON} - ) : connected ? ( - - ) : undefined, + gutter: connected ? : undefined, async onSelect() { if (consoleManaged) return diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 045d730c9e..747c61fd0b 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -36,7 +36,6 @@ import { useToast } from "../../ui/toast" import { useKV } from "../../context/kv" import { useTextareaKeybindings } from "../textarea-keybindings" import { DialogSkill } from "../dialog-skill" -import { CONSOLE_MANAGED_ICON, consoleManagedProviderLabel } from "@tui/util/provider-origin" export type PromptProps = { sessionID?: string @@ -96,15 +95,8 @@ export function Prompt(props: PromptProps) { const list = createMemo(() => props.placeholders?.normal ?? []) const shell = createMemo(() => props.placeholders?.shell ?? []) const [auto, setAuto] = createSignal() - const activeOrgName = createMemo(() => sync.data.console_state.activeOrgName) - const canSwitchOrgs = createMemo(() => sync.data.console_state.switchableOrgCount > 1) - const currentProviderLabel = createMemo(() => { - const current = local.model.current() - const provider = local.model.parsed().provider - if (!current) return provider - return consoleManagedProviderLabel(sync.data.console_state.consoleManagedProviders, current.providerID, provider) - }) - const hasRightContent = createMemo(() => Boolean(props.right || activeOrgName())) + const currentProviderLabel = createMemo(() => local.model.parsed().provider) + const hasRightContent = createMemo(() => Boolean(props.right)) function promptModelWarning() { toast.show({ @@ -1120,17 +1112,6 @@ export function Prompt(props: PromptProps) { {props.right} - - { - if (!canSwitchOrgs()) return - command.trigger("console.org.switch") - }} - > - {`${CONSOLE_MANAGED_ICON} ${activeOrgName()}`} - - @@ -1162,7 +1143,7 @@ export function Prompt(props: PromptProps) { } /> - + }> , providerID: string) => Array.isArray(consoleManagedProviders) ? consoleManagedProviders.includes(providerID) @@ -7,14 +5,3 @@ const contains = (consoleManagedProviders: string[] | ReadonlySet, provi export const isConsoleManagedProvider = (consoleManagedProviders: string[] | ReadonlySet, providerID: string) => contains(consoleManagedProviders, providerID) - -export const consoleManagedProviderSuffix = ( - consoleManagedProviders: string[] | ReadonlySet, - providerID: string, -) => (contains(consoleManagedProviders, providerID) ? ` ${CONSOLE_MANAGED_ICON}` : "") - -export const consoleManagedProviderLabel = ( - consoleManagedProviders: string[] | ReadonlySet, - providerID: string, - providerName: string, -) => `${providerName}${consoleManagedProviderSuffix(consoleManagedProviders, providerID)}` diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index c9951ef198..e3a274bb21 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -98,6 +98,37 @@ describe("tool.registry", () => { }), ) + await Bun.write( + path.join(opencodeDir, "package-lock.json"), + JSON.stringify({ + name: "custom-tools", + lockfileVersion: 3, + packages: { + "": { + dependencies: { + "@opencode-ai/plugin": "^0.0.0", + cowsay: "^1.6.0", + }, + }, + }, + }), + ) + + const cowsayDir = path.join(opencodeDir, "node_modules", "cowsay") + await fs.mkdir(cowsayDir, { recursive: true }) + await Bun.write( + path.join(cowsayDir, "package.json"), + JSON.stringify({ + name: "cowsay", + type: "module", + exports: "./index.js", + }), + ) + await Bun.write( + path.join(cowsayDir, "index.js"), + ["export function say({ text }) {", " return `moo ${text}`", "}", ""].join("\n"), + ) + await Bun.write( path.join(toolsDir, "cowsay.ts"), [ diff --git a/packages/opencode/test/tool/webfetch.test.ts b/packages/opencode/test/tool/webfetch.test.ts index c37ba3e08a..5233f10816 100644 --- a/packages/opencode/test/tool/webfetch.test.ts +++ b/packages/opencode/test/tool/webfetch.test.ts @@ -147,8 +147,7 @@ describe("tool.webfetch", () => { ) expect(ids).toHaveLength(1) - expect(cleared).toHaveLength(1) - expect(cleared[0]).toBe(ids[0]) + expect(cleared).toContain(ids[0]) }) }) })