From 9b44929f285b453eafbf3033c18f2f749df94028 Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Fri, 10 Apr 2026 13:15:48 -0400 Subject: [PATCH] fix(gateway): preserve restart sentinel account routing --- src/gateway/server-restart-sentinel.test.ts | 14 +++++++++++--- src/gateway/server-restart-sentinel.ts | 5 ++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/gateway/server-restart-sentinel.test.ts b/src/gateway/server-restart-sentinel.test.ts index ca852a8504c..91a1853e8e1 100644 --- a/src/gateway/server-restart-sentinel.test.ts +++ b/src/gateway/server-restart-sentinel.test.ts @@ -316,7 +316,7 @@ describe("scheduleRestartSentinelWake", () => { expect(mocks.resolveOutboundTarget).not.toHaveBeenCalled(); }); - it("falls back to the base session when the thread entry only has partial route metadata", async () => { + it("merges base session routing into partial thread metadata", async () => { mocks.consumeRestartSentinel.mockResolvedValue({ payload: { sessionKey: "agent:main:matrix:channel:!lowercased:example.org:thread:$thread-event", @@ -329,14 +329,20 @@ describe("scheduleRestartSentinelWake", () => { mocks.loadSessionEntry .mockReturnValueOnce({ cfg: {}, - entry: { origin: { provider: "matrix", threadId: "$thread-event" } }, + entry: { + origin: { provider: "matrix", accountId: "acct-thread", threadId: "$thread-event" }, + }, }) .mockReturnValueOnce({ cfg: {}, entry: { lastChannel: "matrix", lastTo: "room:!MixedCase:example.org" }, }); mocks.deliveryContextFromSession - .mockReturnValueOnce({ channel: "matrix", threadId: "$thread-event" }) + .mockReturnValueOnce({ + channel: "matrix", + accountId: "acct-thread", + threadId: "$thread-event", + }) .mockReturnValueOnce({ channel: "matrix", to: "room:!MixedCase:example.org" }); mocks.resolveOutboundTarget.mockReturnValue({ ok: true as const, @@ -349,12 +355,14 @@ describe("scheduleRestartSentinelWake", () => { expect.objectContaining({ channel: "matrix", to: "room:!MixedCase:example.org", + accountId: "acct-thread", }), ); expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith( expect.objectContaining({ channel: "matrix", to: "room:!MixedCase:example.org", + accountId: "acct-thread", threadId: "$thread-event", }), ); diff --git a/src/gateway/server-restart-sentinel.ts b/src/gateway/server-restart-sentinel.ts index 4c414602f90..01497823cab 100644 --- a/src/gateway/server-restart-sentinel.ts +++ b/src/gateway/server-restart-sentinel.ts @@ -161,7 +161,10 @@ export async function scheduleRestartSentinelWake(params: { deps: CliDeps }) { baseSessionKey !== sessionKey ) { const { entry: baseEntry } = loadSessionEntry(baseSessionKey); - sessionDeliveryContext = deliveryContextFromSession(baseEntry); + sessionDeliveryContext = mergeDeliveryContext( + sessionDeliveryContext, + deliveryContextFromSession(baseEntry), + ); } const origin = mergeDeliveryContext(sentinelContext, sessionDeliveryContext);