From dadf3367c11cd677780e947fc8c8e35cf3c4702f Mon Sep 17 00:00:00 2001 From: jifan Date: Fri, 30 Jan 2026 01:54:42 +0800 Subject: [PATCH] gateway: hot-reload heartbeat when agents.list changes When agents are added or removed via config changes, the heartbeat scheduler now restarts automatically. This ensures newly added agents get their heartbeat tasks scheduled without requiring a full gateway restart. --- src/gateway/config-reload.test.ts | 6 ++++++ src/gateway/config-reload.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/src/gateway/config-reload.test.ts b/src/gateway/config-reload.test.ts index 3ad545855..913a92324 100644 --- a/src/gateway/config-reload.test.ts +++ b/src/gateway/config-reload.test.ts @@ -85,6 +85,12 @@ describe("buildGatewayReloadPlan", () => { expect(plan.reloadHooks).toBe(true); }); + it("restarts heartbeat when agents.list changes", () => { + const plan = buildGatewayReloadPlan(["agents.list"]); + expect(plan.restartGateway).toBe(false); + expect(plan.restartHeartbeat).toBe(true); + }); + it("restarts providers when provider config prefixes change", () => { const changedPaths = ["web.enabled", "channels.telegram.botToken"]; const plan = buildGatewayReloadPlan(changedPaths); diff --git a/src/gateway/config-reload.ts b/src/gateway/config-reload.ts index e9d6448d0..966199ba1 100644 --- a/src/gateway/config-reload.ts +++ b/src/gateway/config-reload.ts @@ -53,6 +53,7 @@ const BASE_RELOAD_RULES: ReloadRule[] = [ kind: "hot", actions: ["restart-heartbeat"], }, + { prefix: "agents.list", kind: "hot", actions: ["restart-heartbeat"] }, { prefix: "agent.heartbeat", kind: "hot", actions: ["restart-heartbeat"] }, { prefix: "cron", kind: "hot", actions: ["restart-cron"] }, {