feat(tui): reload command restarts the service

This commit is contained in:
Dax Raad
2026-07-03 14:01:01 -04:00
parent 1401901529
commit 2ff19171dc
4 changed files with 51 additions and 3 deletions
+22 -1
View File
@@ -139,6 +139,7 @@ export type TuiInput = {
client: OpencodeClient
api: OpenCodeClient
discover?: () => Promise<{ client: OpencodeClient; api: OpenCodeClient }>
reload?: () => Promise<void>
args: Args
config: TuiConfig.Resolved
onSnapshot?: () => Promise<string[]>
@@ -301,7 +302,7 @@ export const run = Effect.fn("Tui.run")(function* (input: TuiInput) {
>
<TuiConfigProvider config={input.config}>
<PluginRuntimeProvider value={pluginRuntime}>
<SDKProvider client={input.client} api={input.api} discover={input.discover}>
<SDKProvider client={input.client} api={input.api} discover={input.discover} reload={input.reload}>
<PermissionProvider>
<ProjectProvider>
<SyncProvider>
@@ -800,6 +801,26 @@ function App(props: { onSnapshot?: () => Promise<string[]>; pluginHost: TuiPlugi
},
category: "System",
},
...(sdk.reload
? [
{
name: "server.reload",
title: "Reload server",
slashName: "reload",
run: async () => {
dialog.clear()
toast.show({ variant: "info", message: "Reloading server...", duration: 30000 })
// reload resolves once the replacement service is healthy; the
// event stream reattaches through the reconnect loop.
await sdk
.reload!()
.then(() => toast.show({ variant: "success", message: "Server reloaded" }))
.catch(toast.error)
},
category: "System",
},
]
: []),
{
name: "theme.switch",
title: "Switch theme",
+3
View File
@@ -16,6 +16,8 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
client: OpencodeClient
api: OpenCodeClient
discover?: () => Promise<{ client: OpencodeClient; api: OpenCodeClient }>
// Stops and starts the managed service; present only in service mode.
reload?: () => Promise<void>
}) => {
const abort = new AbortController()
let client = props.client
@@ -138,6 +140,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
return connection.connectedOnce
},
},
reload: props.reload,
}
},
})