From 2b3ddabe9055cf8e7dcbc4a8e332cc4befb62126 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 2 Jan 2026 11:41:01 +0000 Subject: [PATCH] fix(gateway): gate providers by config presence --- src/commands/onboard-providers.ts | 20 +++++++- src/gateway/server.ts | 78 +++++++++++++++++++++++++++---- src/infra/provider-summary.ts | 22 ++++++--- 3 files changed, 102 insertions(+), 18 deletions(-) diff --git a/src/commands/onboard-providers.ts b/src/commands/onboard-providers.ts index 93cdd3a97..a120d66d9 100644 --- a/src/commands/onboard-providers.ts +++ b/src/commands/onboard-providers.ts @@ -301,7 +301,15 @@ export async function setupProviders( }), runtime, ); - if (!keepEnv) { + if (keepEnv) { + next = { + ...next, + telegram: { + ...next.telegram, + enabled: true, + }, + }; + } else { token = String( guardCancel( await text({ @@ -368,7 +376,15 @@ export async function setupProviders( }), runtime, ); - if (!keepEnv) { + if (keepEnv) { + next = { + ...next, + discord: { + ...next.discord, + enabled: true, + }, + }; + } else { token = String( guardCancel( await text({ diff --git a/src/gateway/server.ts b/src/gateway/server.ts index 73c11f5be..6cebf0577 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -2074,6 +2074,15 @@ export async function startGatewayServer( const startTelegramProvider = async () => { if (telegramTask) return; const cfg = loadConfig(); + if (!cfg.telegram) { + telegramRuntime = { + ...telegramRuntime, + running: false, + lastError: "not configured", + }; + logTelegram.info("skipping provider start (telegram not configured)"); + return; + } if (cfg.telegram?.enabled === false) { telegramRuntime = { ...telegramRuntime, @@ -2168,6 +2177,15 @@ export async function startGatewayServer( const startDiscordProvider = async () => { if (discordTask) return; const cfg = loadConfig(); + if (!cfg.discord) { + discordRuntime = { + ...discordRuntime, + running: false, + lastError: "not configured", + }; + logDiscord.info("skipping provider start (discord not configured)"); + return; + } if (cfg.discord?.enabled === false) { discordRuntime = { ...discordRuntime, @@ -2270,6 +2288,26 @@ export async function startGatewayServer( logSignal.info("skipping provider start (signal.enabled=false)"); return; } + const signalCfg = cfg.signal; + const signalMeaningfullyConfigured = Boolean( + signalCfg.account?.trim() || + signalCfg.httpUrl?.trim() || + signalCfg.cliPath?.trim() || + signalCfg.httpHost?.trim() || + typeof signalCfg.httpPort === "number" || + typeof signalCfg.autoStart === "boolean", + ); + if (!signalMeaningfullyConfigured) { + signalRuntime = { + ...signalRuntime, + running: false, + lastError: "not configured", + }; + logSignal.info( + "skipping provider start (signal config present but missing required fields)", + ); + return; + } const host = cfg.signal?.httpHost?.trim() || "127.0.0.1"; const port = cfg.signal?.httpPort ?? 8080; const baseUrl = cfg.signal?.httpUrl?.trim() || `http://${host}:${port}`; @@ -4345,21 +4383,33 @@ export async function startGatewayServer( ? Math.max(1000, timeoutMsRaw) : 10_000; const cfg = loadConfig(); + const telegramCfg = cfg.telegram; + const telegramEnabled = + Boolean(telegramCfg) && telegramCfg?.enabled !== false; const { token: telegramToken, source: tokenSource } = - resolveTelegramToken(cfg); + telegramEnabled + ? resolveTelegramToken(cfg) + : { token: "", source: "none" as const }; let telegramProbe: TelegramProbe | undefined; let lastProbeAt: number | null = null; - if (probe && telegramToken) { + if (probe && telegramToken && telegramEnabled) { telegramProbe = await probeTelegram( telegramToken, timeoutMs, - cfg.telegram?.proxy, + telegramCfg?.proxy, ); lastProbeAt = Date.now(); } - const discordEnvToken = process.env.DISCORD_BOT_TOKEN?.trim(); - const discordConfigToken = cfg.discord?.token?.trim(); + const discordCfg = cfg.discord; + const discordEnabled = + Boolean(discordCfg) && discordCfg?.enabled !== false; + const discordEnvToken = discordEnabled + ? process.env.DISCORD_BOT_TOKEN?.trim() + : ""; + const discordConfigToken = discordEnabled + ? discordCfg?.token?.trim() + : ""; const discordToken = discordEnvToken || discordConfigToken || ""; const discordTokenSource = discordEnvToken ? "env" @@ -4368,7 +4418,7 @@ export async function startGatewayServer( : "none"; let discordProbe: DiscordProbe | undefined; let discordLastProbeAt: number | null = null; - if (probe && discordToken) { + if (probe && discordToken && discordEnabled) { discordProbe = await probeDiscord(discordToken, timeoutMs); discordLastProbeAt = Date.now(); } @@ -4380,7 +4430,17 @@ export async function startGatewayServer( const signalBaseUrl = signalCfg?.httpUrl?.trim() || `http://${signalHost}:${signalPort}`; - const signalConfigured = Boolean(signalCfg) && signalEnabled; + const signalConfigured = + Boolean(signalCfg) && + signalEnabled && + Boolean( + signalCfg?.account?.trim() || + signalCfg?.httpUrl?.trim() || + signalCfg?.cliPath?.trim() || + signalCfg?.httpHost?.trim() || + typeof signalCfg?.httpPort === "number" || + typeof signalCfg?.autoStart === "boolean", + ); let signalProbe: SignalProbe | undefined; let signalLastProbeAt: number | null = null; if (probe && signalConfigured) { @@ -4422,7 +4482,7 @@ export async function startGatewayServer( lastError: whatsappRuntime.lastError ?? null, }, telegram: { - configured: Boolean(telegramToken), + configured: telegramEnabled && Boolean(telegramToken), tokenSource, running: telegramRuntime.running, mode: telegramRuntime.mode ?? null, @@ -4433,7 +4493,7 @@ export async function startGatewayServer( lastProbeAt, }, discord: { - configured: Boolean(discordToken), + configured: discordEnabled && Boolean(discordToken), tokenSource: discordTokenSource, running: discordRuntime.running, lastStartAt: discordRuntime.lastStartAt ?? null, diff --git a/src/infra/provider-summary.ts b/src/infra/provider-summary.ts index 70186d4ef..2645a7fb8 100644 --- a/src/infra/provider-summary.ts +++ b/src/infra/provider-summary.ts @@ -35,8 +35,11 @@ export async function buildProviderSummary( if (!telegramEnabled) { lines.push(chalk.cyan("Telegram: disabled")); } else { - const { token: telegramToken } = resolveTelegramToken(effective); - const telegramConfigured = Boolean(telegramToken); + const { token: telegramToken } = effective.telegram + ? resolveTelegramToken(effective) + : { token: "" }; + const telegramConfigured = + Boolean(effective.telegram) && Boolean(telegramToken); lines.push( telegramConfigured ? chalk.green("Telegram: configured") @@ -48,11 +51,16 @@ export async function buildProviderSummary( if (!signalEnabled) { lines.push(chalk.cyan("Signal: disabled")); } else { - const signalConfigured = Boolean( - effective.signal?.httpUrl || - effective.signal?.cliPath || - effective.signal?.account, - ); + const signalConfigured = + Boolean(effective.signal) && + Boolean( + effective.signal?.account?.trim() || + effective.signal?.httpUrl?.trim() || + effective.signal?.cliPath?.trim() || + effective.signal?.httpHost?.trim() || + typeof effective.signal?.httpPort === "number" || + typeof effective.signal?.autoStart === "boolean", + ); lines.push( signalConfigured ? chalk.green("Signal: configured")