diff --git a/electron/api/routes/channels.ts b/electron/api/routes/channels.ts index 29affe2..168c6d5 100644 --- a/electron/api/routes/channels.ts +++ b/electron/api/routes/channels.ts @@ -16,6 +16,14 @@ import { whatsAppLoginManager } from '../../utils/whatsapp-login'; import type { HostApiContext } from '../context'; import { parseJsonBody, sendJson } from '../route-utils'; +function scheduleGatewayChannelRestart(ctx: HostApiContext, reason: string): void { + if (ctx.gatewayManager.getStatus().state === 'stopped') { + return; + } + ctx.gatewayManager.debouncedRestart(); + void reason; +} + async function ensureDingTalkPluginInstalled(): Promise<{ installed: boolean; warning?: string }> { const targetDir = join(homedir(), '.openclaw', 'extensions', 'dingtalk'); const targetManifest = join(targetDir, 'openclaw.plugin.json'); @@ -168,6 +176,7 @@ export async function handleChannelRoutes( } } await saveChannelConfig(body.channelType, body.config); + scheduleGatewayChannelRestart(ctx, `channel:saveConfig:${body.channelType}`); sendJson(res, 200, { success: true }); } catch (error) { sendJson(res, 500, { success: false, error: String(error) }); @@ -179,6 +188,7 @@ export async function handleChannelRoutes( try { const body = await parseJsonBody<{ channelType: string; enabled: boolean }>(req); await setChannelEnabled(body.channelType, body.enabled); + scheduleGatewayChannelRestart(ctx, `channel:setEnabled:${body.channelType}`); sendJson(res, 200, { success: true }); } catch (error) { sendJson(res, 500, { success: false, error: String(error) }); @@ -203,6 +213,7 @@ export async function handleChannelRoutes( try { const channelType = decodeURIComponent(url.pathname.slice('/api/channels/config/'.length)); await deleteChannelConfig(channelType); + scheduleGatewayChannelRestart(ctx, `channel:deleteConfig:${channelType}`); sendJson(res, 200, { success: true }); } catch (error) { sendJson(res, 500, { success: false, error: String(error) }); diff --git a/electron/main/ipc-handlers.ts b/electron/main/ipc-handlers.ts index 58912c9..1322995 100644 --- a/electron/main/ipc-handlers.ts +++ b/electron/main/ipc-handlers.ts @@ -1323,6 +1323,15 @@ function registerGatewayHandlers( * For checking package status and channel configuration */ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { + const scheduleGatewayChannelRestart = (reason: string): void => { + if (gatewayManager.getStatus().state !== 'stopped') { + logger.info(`Scheduling Gateway restart after ${reason}`); + gatewayManager.debouncedRestart(); + } else { + logger.info(`Gateway is stopped; skip immediate restart after ${reason}`); + } + }; + async function ensureDingTalkPluginInstalled(): Promise<{ installed: boolean; warning?: string }> { const targetDir = join(homedir(), '.openclaw', 'extensions', 'dingtalk'); const targetManifest = join(targetDir, 'openclaw.plugin.json'); @@ -1485,12 +1494,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { }; } await saveChannelConfig(channelType, config); - if (gatewayManager.getStatus().state !== 'stopped') { - logger.info(`Scheduling Gateway reload after channel:saveConfig (${channelType})`); - gatewayManager.debouncedReload(); - } else { - logger.info(`Gateway is stopped; skip immediate reload after channel:saveConfig (${channelType})`); - } + scheduleGatewayChannelRestart(`channel:saveConfig (${channelType})`); return { success: true, pluginInstalled: installResult.installed, @@ -1506,12 +1510,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { }; } await saveChannelConfig(channelType, config); - if (gatewayManager.getStatus().state !== 'stopped') { - logger.info(`Scheduling Gateway reload after channel:saveConfig (${channelType})`); - gatewayManager.debouncedReload(); - } else { - logger.info(`Gateway is stopped; skip immediate reload after channel:saveConfig (${channelType})`); - } + scheduleGatewayChannelRestart(`channel:saveConfig (${channelType})`); return { success: true, pluginInstalled: installResult.installed, @@ -1519,12 +1518,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { }; } await saveChannelConfig(channelType, config); - if (gatewayManager.getStatus().state !== 'stopped') { - logger.info(`Scheduling Gateway reload after channel:saveConfig (${channelType})`); - gatewayManager.debouncedReload(); - } else { - logger.info(`Gateway is stopped; skip immediate reload after channel:saveConfig (${channelType})`); - } + scheduleGatewayChannelRestart(`channel:saveConfig (${channelType})`); return { success: true }; } catch (error) { console.error('Failed to save channel config:', error); @@ -1558,12 +1552,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { ipcMain.handle('channel:deleteConfig', async (_, channelType: string) => { try { await deleteChannelConfig(channelType); - if (gatewayManager.getStatus().state !== 'stopped') { - logger.info(`Scheduling Gateway reload after channel:deleteConfig (${channelType})`); - gatewayManager.debouncedReload(); - } else { - logger.info(`Gateway is stopped; skip immediate reload after channel:deleteConfig (${channelType})`); - } + scheduleGatewayChannelRestart(`channel:deleteConfig (${channelType})`); return { success: true }; } catch (error) { console.error('Failed to delete channel config:', error); @@ -1586,12 +1575,7 @@ function registerOpenClawHandlers(gatewayManager: GatewayManager): void { ipcMain.handle('channel:setEnabled', async (_, channelType: string, enabled: boolean) => { try { await setChannelEnabled(channelType, enabled); - if (gatewayManager.getStatus().state !== 'stopped') { - logger.info(`Scheduling Gateway reload after channel:setEnabled (${channelType}, enabled=${enabled})`); - gatewayManager.debouncedReload(); - } else { - logger.info(`Gateway is stopped; skip immediate reload after channel:setEnabled (${channelType})`); - } + scheduleGatewayChannelRestart(`channel:setEnabled (${channelType}, enabled=${enabled})`); return { success: true }; } catch (error) { console.error('Failed to set channel enabled:', error);