From e15a6fff02415bdbe6dd332c965aeca4845f08ca Mon Sep 17 00:00:00 2001
From: LukeParkerDev <10430890+Hona@users.noreply.github.com>
Date: Tue, 14 Jul 2026 08:55:05 +1000
Subject: [PATCH] fix(app): enable remote session auto-accept
---
.../e2e/regression/remote-tab-busy.spec.ts | 22 +++++++++++++++++++
packages/app/src/pages/home.tsx | 4 ++--
packages/app/src/pages/layout-new.tsx | 2 --
packages/app/src/pages/new-session.tsx | 3 ++-
packages/app/src/pages/session.tsx | 21 +++++++++++++-----
5 files changed, 42 insertions(+), 10 deletions(-)
diff --git a/packages/app/e2e/regression/remote-tab-busy.spec.ts b/packages/app/e2e/regression/remote-tab-busy.spec.ts
index 119fc7ee2d..523065e8ef 100644
--- a/packages/app/e2e/regression/remote-tab-busy.spec.ts
+++ b/packages/app/e2e/regression/remote-tab-busy.spec.ts
@@ -38,6 +38,28 @@ test("tab busy indicator reflects the tab server's own session status", async ({
await expect(tabA.locator('[data-component="session-progress-indicator-v2"]')).toHaveCount(0)
})
+test("auto-accept can be enabled for a session on a remote server", async ({ page }) => {
+ await mockServers(page)
+ await page.addInitScript(
+ ({ serverB }) => {
+ localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
+ localStorage.setItem("opencode.global.dat:server", JSON.stringify({ list: [serverB] }))
+ },
+ { serverB },
+ )
+
+ await page.goto(`/server/${base64Encode(serverB)}/session/${sessionB.id}`)
+ await expect(page.getByText(sessionB.title).first()).toBeVisible()
+ await page.keyboard.press("Control+,")
+
+ const autoAccept = page.locator('[data-action="settings-auto-accept-permissions"]')
+ const input = autoAccept.locator('[data-slot="switch-input"]')
+ await expect(autoAccept).toBeVisible()
+ await expect(input).toBeEnabled()
+ await autoAccept.locator('[data-slot="switch-control"]').click()
+ await expect(input).toBeChecked()
+})
+
function session(id: string, directory: string, title: string) {
return {
id,
diff --git a/packages/app/src/pages/home.tsx b/packages/app/src/pages/home.tsx
index d697e53ae7..07035c585f 100644
--- a/packages/app/src/pages/home.tsx
+++ b/packages/app/src/pages/home.tsx
@@ -35,7 +35,7 @@ import { usePlatform } from "@/context/platform"
import { DateTime } from "luxon"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { useDirectoryPicker } from "@/components/directory-picker"
-import { useSettingsDialog } from "@/components/settings-dialog"
+import { useSettingsCommand } from "@/components/settings-dialog"
import { DialogSelectServer, useServerManagementController } from "@/components/dialog-select-server"
import { DialogServerV2 } from "@/components/settings-v2/dialog-server-v2"
import { ServerConnection, serverName, useServer } from "@/context/server"
@@ -269,7 +269,7 @@ export function NewHome() {
const command = useCommand()
const notification = useNotification()
const marked = useMarked()
- const openSettings = useSettingsDialog()
+ const openSettings = useSettingsCommand()
let focusSessionSearch: (() => void) | undefined
const [state, setState] = createStore({
search: "",
diff --git a/packages/app/src/pages/layout-new.tsx b/packages/app/src/pages/layout-new.tsx
index 095d1ebd7e..45844320cb 100644
--- a/packages/app/src/pages/layout-new.tsx
+++ b/packages/app/src/pages/layout-new.tsx
@@ -6,13 +6,11 @@ import { Titlebar, type TitlebarUpdate } from "@/components/titlebar"
import { usePlatform } from "@/context/platform"
import { setNavigate } from "@/utils/notification-click"
import { setV2Toast, ToastRegion } from "@/utils/toast"
-import { useSettingsCommand } from "@/components/settings-dialog"
export default function NewLayout(props: ParentProps) {
const platform = usePlatform()
const navigate = useNavigate()
setNavigate(navigate)
- useSettingsCommand()
createEffect(() => setV2Toast(true))
diff --git a/packages/app/src/pages/new-session.tsx b/packages/app/src/pages/new-session.tsx
index 19c90b9a38..3cb5a0d459 100644
--- a/packages/app/src/pages/new-session.tsx
+++ b/packages/app/src/pages/new-session.tsx
@@ -28,7 +28,7 @@ import { PromptWorkspaceSelector } from "@/components/prompt-workspace-selector"
import { useTitlebarRightMount } from "@/components/titlebar"
import { useCommand } from "@/context/command"
import { useProviders } from "@/hooks/use-providers"
-import { useSettingsDialog } from "@/components/settings-dialog"
+import { useSettingsCommand, useSettingsDialog } from "@/components/settings-dialog"
import { Persist, persisted } from "@/utils/persist"
import createPresence from "solid-presence"
import { useLocal } from "@/context/local"
@@ -54,6 +54,7 @@ export default function NewSessionPage() {
const command = useCommand()
const providers = useProviders(() => sdk().directory)
const openProviderSettings = useSettingsDialog("providers")
+ useSettingsCommand()
const route = useSessionKey()
const [searchParams, setSearchParams] = useSearchParams<{ draftId?: string; prompt?: string }>()
const local = useLocal()
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 7ce4627135..e24ae41556 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -58,6 +58,7 @@ import { useSync } from "@/context/sync"
import { useTabs } from "@/context/tabs"
import { TerminalProvider, useTerminal } from "@/context/terminal"
import { PromptInput } from "@/components/prompt-input"
+import { useSettingsCommand } from "@/components/settings-dialog"
import { type FollowupDraft, sendFollowupDraft } from "@/components/prompt-input/submit"
import {
createPromptInputController,
@@ -153,13 +154,23 @@ export function SessionPage() {
// workspace-scoped state (terminal, directory providers) lives below.
export function TargetSessionRouteContent() {
const params = useParams<{ serverKey: string; id: string }>()
+ const serverSync = useServerSync()
+ const directory = createMemo(() => serverSync().session.lineage.peek(params.id)?.session.directory)
return (
-
-
-
+
+
+
+
+
+
)
}
+function TargetSessionSettingsCommand() {
+ useSettingsCommand()
+ return null
+}
+
export function SessionRouteErrorBoundary(
props: ParentProps<{ sessionID?: string; serverKey?: ServerConnection.Key; padded?: boolean }>,
) {
@@ -281,10 +292,10 @@ function TargetServerScopedProviders(
props: ParentProps<{ directory?: () => string | undefined; sessionID?: () => string | undefined }>,
) {
return (
-
+ <>
{props.children}
-
+ >
)
}