From 09388c98f3bbf737615845e3d40c2adfe66089f7 Mon Sep 17 00:00:00 2001 From: David Hill Date: Sun, 8 Mar 2026 01:27:45 +0000 Subject: [PATCH] Revert "tui: remove prompt model/thinking/permissions selectors on dev so the composer stays simple" This reverts commit ae25c1e7b75c17d799f7a245f03ca0cd8bef1eab. --- packages/app/src/components/prompt-input.tsx | 149 ++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index de7a219c8..3ae362e6f 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -23,11 +23,15 @@ import { useComments } from "@/context/comments" import { Button } from "@opencode-ai/ui/button" import { DockShellForm, DockTray } from "@opencode-ai/ui/dock-surface" import { Icon } from "@opencode-ai/ui/icon" +import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { IconButton } from "@opencode-ai/ui/icon-button" import { Select } from "@opencode-ai/ui/select" import { RadioGroup } from "@opencode-ai/ui/radio-group" import { useDialog } from "@opencode-ai/ui/context/dialog" +import { ModelSelectorPopover } from "@/components/dialog-select-model" +import { DialogSelectModelUnpaid } from "@/components/dialog-select-model-unpaid" +import { useProviders } from "@/hooks/use-providers" import { useCommand } from "@/context/command" import { Persist, persisted } from "@/utils/persist" import { usePermission } from "@/context/permission" @@ -100,6 +104,7 @@ export const PromptInput: Component = (props) => { const comments = useComments() const params = useParams() const dialog = useDialog() + const providers = useProviders() const command = useCommand() const permission = usePermission() const language = useLanguage() @@ -945,12 +950,21 @@ export const PromptInput: Component = (props) => { readClipboardImage: platform.readClipboardImage, }) + const variants = createMemo(() => ["default", ...local.model.variant.list()]) const accepting = createMemo(() => { const id = params.id if (!id) return permission.isAutoAcceptingDirectory(sdk.directory) return permission.isAutoAccepting(id, sdk.directory) }) + const flip = () => { + if (!params.id) { + permission.toggleAutoAcceptDirectory(sdk.directory) + return + } + permission.toggleAutoAccept(params.id, sdk.directory) + } + const { abort, handleSubmit } = createPromptSubmit({ info, imageAttachments, @@ -1176,7 +1190,11 @@ export const PromptInput: Component = (props) => { onMouseDown={(e) => { const target = e.target if (!(target instanceof HTMLElement)) return - if (target.closest('[data-action="prompt-attach"], [data-action="prompt-submit"]')) { + if ( + target.closest( + '[data-action="prompt-attach"], [data-action="prompt-submit"], [data-action="prompt-permissions"]', + ) + ) { return } editorRef?.focus() @@ -1310,6 +1328,99 @@ export const PromptInput: Component = (props) => { + + 0} + fallback={ + + + + } + > + + + + + + + {local.model.current()?.name ?? language.t("dialog.model.select.title")} + + + + + + + + + x === "autoaccept" + ? language.t("command.permissions.autoaccept.enable") + : `${language.t("common.default")} ${language.t("command.category.permissions")}` + } + onSelect={(x) => { + if (!x) return + if (x === "autoaccept" && accepting()) return + if (x === "default" && !accepting()) return + flip() + }} + class="max-w-[220px]" + valueClass="truncate text-13-regular text-text-base" + triggerStyle={{ + height: "28px", + opacity: buttonsSpring(), + transform: `scale(${0.95 + buttonsSpring() * 0.05})`, + filter: `blur(${(1 - buttonsSpring()) * 2}px)`, + "pointer-events": buttonsSpring() > 0.5 ? "auto" : "none", + }} + variant="ghost" + /> +