From d7365562f7d353cd0c853426d253dfbeac27241a Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Tue, 3 Feb 2026 08:57:04 -0800 Subject: [PATCH] feat: add manual engine reload in settings --- packages/app/src/app/app.tsx | 4 ++ packages/app/src/app/pages/dashboard.tsx | 9 +++++ packages/app/src/app/pages/settings.tsx | 49 ++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/packages/app/src/app/app.tsx b/packages/app/src/app/app.tsx index 5160d5df..ed23aee0 100644 --- a/packages/app/src/app/app.tsx +++ b/packages/app/src/app/app.tsx @@ -3921,6 +3921,10 @@ export default function App() { updateOpenworkServerSettings, resetOpenworkServerSettings, testOpenworkServerConnection, + canReloadWorkspace: canReloadWorkspace(), + reloadWorkspaceEngine, + reloadBusy: reloadBusy(), + reloadError: reloadError(), activeWorkspaceDisplay: activeWorkspaceDisplay(), workspaceSearch: workspaceStore.workspaceSearch(), setWorkspaceSearch: workspaceStore.setWorkspaceSearch, diff --git a/packages/app/src/app/pages/dashboard.tsx b/packages/app/src/app/pages/dashboard.tsx index 5768a6b0..e47d278b 100644 --- a/packages/app/src/app/pages/dashboard.tsx +++ b/packages/app/src/app/pages/dashboard.tsx @@ -93,6 +93,10 @@ export type DashboardViewProps = { updateOpenworkServerSettings: (next: OpenworkServerSettings) => void; resetOpenworkServerSettings: () => void; testOpenworkServerConnection: (next: OpenworkServerSettings) => Promise; + canReloadWorkspace: boolean; + reloadWorkspaceEngine: () => Promise; + reloadBusy: boolean; + reloadError: string | null; keybindItems: KeybindSetting[]; onOverrideKeybind: (id: string, keybind: string | null) => void; onResetKeybind: (id: string) => void; @@ -975,6 +979,11 @@ export default function DashboardView(props: DashboardViewProps) { openworkServerCapabilities={props.openworkServerCapabilities} openworkServerDiagnostics={props.openworkServerDiagnostics} openworkServerWorkspaceId={props.openworkServerWorkspaceId} + clientConnected={props.clientConnected} + canReloadWorkspace={props.canReloadWorkspace} + reloadWorkspaceEngine={props.reloadWorkspaceEngine} + reloadBusy={props.reloadBusy} + reloadError={props.reloadError} openworkAuditEntries={props.openworkAuditEntries} openworkAuditStatus={props.openworkAuditStatus} openworkAuditError={props.openworkAuditError} diff --git a/packages/app/src/app/pages/settings.tsx b/packages/app/src/app/pages/settings.tsx index dec3b949..cd891af9 100644 --- a/packages/app/src/app/pages/settings.tsx +++ b/packages/app/src/app/pages/settings.tsx @@ -58,6 +58,8 @@ export type SettingsViewProps = { openworkServerCapabilities: OpenworkServerCapabilities | null; openworkServerDiagnostics: OpenworkServerDiagnostics | null; openworkServerWorkspaceId: string | null; + clientConnected: boolean; + canReloadWorkspace: boolean; openworkAuditEntries: OpenworkAuditEntry[]; openworkAuditStatus: "idle" | "loading" | "error"; openworkAuditError: string | null; @@ -65,6 +67,9 @@ export type SettingsViewProps = { engineInfo: EngineInfo | null; openwrkStatus: OpenwrkStatus | null; owpenbotInfo: OwpenbotInfo | null; + reloadWorkspaceEngine: () => Promise; + reloadBusy: boolean; + reloadError: string | null; updateOpenworkServerSettings: (next: OpenworkServerSettings) => void; resetOpenworkServerSettings: () => void; testOpenworkServerConnection: (next: OpenworkServerSettings) => Promise; @@ -941,6 +946,18 @@ export default function SettingsView(props: SettingsViewProps) { } }); + const reloadAvailabilityReason = createMemo(() => { + if (!props.clientConnected) return "Connect to this workspace to reload."; + if (!props.canReloadWorkspace) { + return "Reloading is only available for local workspaces or connected OpenWork servers."; + } + return null; + }); + + const reloadButtonLabel = createMemo(() => (props.reloadBusy ? "Reloading..." : "Reload engine")); + const reloadButtonTone = createMemo(() => (props.anyActiveRuns ? "danger" : "secondary")); + const reloadButtonDisabled = createMemo(() => props.reloadBusy || Boolean(reloadAvailabilityReason())); + const engineStatusLabel = createMemo(() => { if (!isTauriRuntime()) return "Unavailable"; return props.engineInfo?.running ? "Running" : "Offline"; @@ -1927,6 +1944,38 @@ export default function SettingsView(props: SettingsViewProps) { + +
+
+
Engine reload
+
Restart the OpenCode server for this workspace.
+
+ +
+
+
Reload now
+
Applies config updates and reconnects your session.
+ +
Reloading will stop active tasks.
+
+ +
{props.reloadError}
+
+ +
{reloadAvailabilityReason()}
+
+
+ +
+