fix(discord): preserve channel session keys via channel_id fallbacks (#17622)

* fix(discord): preserve channel session keys via channel_id fallbacks

* docs(changelog): add discord session continuity note

* Tests: cover discord channel_id fallback

---------

Co-authored-by: Shadow <hi@shadowing.dev>
This commit is contained in:
Shakker
2026-02-16 02:30:17 +00:00
committed by GitHub
parent 39d5590230
commit 09566b1693
16 changed files with 235 additions and 49 deletions

View File

@@ -56,10 +56,20 @@ function resolveSessionKey({ sessionKey, sessionId }: SessionRef) {
return sessionKey ?? sessionId ?? "unknown";
}
function findStateBySessionId(sessionId: string): SessionState | undefined {
for (const state of diagnosticSessionStates.values()) {
if (state.sessionId === sessionId) {
return state;
}
}
return undefined;
}
export function getDiagnosticSessionState(ref: SessionRef): SessionState {
pruneDiagnosticSessionStates();
const key = resolveSessionKey(ref);
const existing = diagnosticSessionStates.get(key);
const existing =
diagnosticSessionStates.get(key) ?? (ref.sessionId && findStateBySessionId(ref.sessionId));
if (existing) {
if (ref.sessionId) {
existing.sessionId = ref.sessionId;

View File

@@ -34,6 +34,18 @@ describe("diagnostic session state pruning", () => {
expect(getDiagnosticSessionStateCountForTest()).toBe(2000);
});
it("reuses keyed session state when later looked up by sessionId", () => {
const keyed = getDiagnosticSessionState({
sessionId: "s1",
sessionKey: "agent:main:discord:channel:c1",
});
const bySessionId = getDiagnosticSessionState({ sessionId: "s1" });
expect(bySessionId).toBe(keyed);
expect(bySessionId.sessionKey).toBe("agent:main:discord:channel:c1");
expect(getDiagnosticSessionStateCountForTest()).toBe(1);
});
});
describe("logger import side effects", () => {