From 766b89beb7b13dc957148648e2946dc0ea937604 Mon Sep 17 00:00:00 2001 From: d-morrison Date: Sat, 29 Aug 2026 22:54:23 -0700 Subject: [PATCH] fix(app): reflect global permission:allow in Settings auto-accept toggle When permission is set to "allow" globally (in opencode.json), the Settings -> Auto-accept permissions toggle previously showed off/disabled even though permissions were already auto-approved via config. This disconnect is reported across #38154, #41069, #16258, #37617. Make accepting() return true when global permission is "allow" or {"*":"allow"}, and disable the toggle (global config overrides per-directory auto-accept) so UI matches runtime. Fixes the visual mismatch where a new session shows toggle off after restarting with global auto-accept enabled. --- packages/app/src/components/settings-general.tsx | 14 ++++++++++---- .../components/settings-v2/general-controllers.ts | 9 ++++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index 8adaa1f0fdf9..447907ad6487 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -95,7 +95,16 @@ export const SettingsGeneral: Component = () => { const linux = createMemo(() => platform.platform === "desktop" && platform.os === "linux") const dir = createMemo(() => decode64(params.dir)) + const serverSync = useServerSync() + const serverSdk = useServerSDK() + const globalAutoAccept = createMemo(() => { + const perm = (serverSync().data.config as any)?.permission + if (perm === "allow") return true + if (perm && typeof perm === "object" && perm["*"] === "allow") return true + return false + }) const accepting = createMemo(() => { + if (globalAutoAccept()) return true const value = dir() if (!value) return false if (!params.id) return permission.isAutoAcceptingDirectory(value) @@ -123,9 +132,6 @@ export const SettingsGeneral: Component = () => { const themeOptions = createMemo(() => theme.ids().map((id) => ({ id, name: theme.name(id) }))) - const serverSync = useServerSync() - const serverSdk = useServerSDK() - const [shells] = createResource( async () => { const sdk = serverSdk() @@ -321,7 +327,7 @@ export const SettingsGeneral: Component = () => { description={language.t("toast.permissions.autoaccept.on.description")} >
- +
diff --git a/packages/app/src/components/settings-v2/general-controllers.ts b/packages/app/src/components/settings-v2/general-controllers.ts index ae77fa332f22..e2d233cfb396 100644 --- a/packages/app/src/components/settings-v2/general-controllers.ts +++ b/packages/app/src/components/settings-v2/general-controllers.ts @@ -25,6 +25,12 @@ export type { ShellOption, ShellSelectOption } from "./general-controller-behavi export function createPermissionScopeController(sessionID: Accessor) { const permission = usePermission() const serverSync = useServerSync() + const globalAutoAccept = createMemo(() => { + const perm = (serverSync().data.config as any)?.permission + if (perm === "allow") return true + if (perm && typeof perm === "object" && perm["*"] === "allow") return true + return false + }) const directory = createMemo(() => { const id = sessionID() if (!id) return undefined @@ -33,12 +39,13 @@ export function createPermissionScopeController(sessionID: Accessor { + if (globalAutoAccept()) return true const id = sessionID() const dir = directory() if (!id || !dir) return false return permission.isAutoAccepting(id, dir) }), - enabled: createMemo(() => !!directory()), + enabled: createMemo(() => !globalAutoAccept() && !!directory()), set: (checked: boolean) => { const id = sessionID() const dir = directory()