fix: normalize blank agent session ids

This commit is contained in:
Frank Yang
2026-04-24 15:41:17 +08:00
parent ead7c97c3b
commit a0f4fb2c15
2 changed files with 28 additions and 8 deletions

View File

@@ -143,9 +143,10 @@ export function resolveSessionKeyForRequest(opts: {
const scope = sessionCfg?.scope ?? "per-sender";
const mainKey = normalizeMainKey(sessionCfg?.mainKey);
const requestedAgentId = opts.agentId?.trim() ? normalizeAgentId(opts.agentId) : undefined;
const requestedSessionId = opts.sessionId?.trim() || undefined;
const explicitSessionKey =
opts.sessionKey?.trim() ||
(!opts.sessionId
(!requestedSessionId
? resolveExplicitAgentSessionKey({
cfg: opts.cfg,
agentId: requestedAgentId,
@@ -168,23 +169,23 @@ export function resolveSessionKeyForRequest(opts: {
// by the shared gateway/session resolver helpers instead of whichever store happens to be scanned
// first.
if (
opts.sessionId &&
requestedSessionId &&
!explicitSessionKey &&
(!sessionKey || sessionStore[sessionKey]?.sessionId !== opts.sessionId)
(!sessionKey || sessionStore[sessionKey]?.sessionId !== requestedSessionId)
) {
const { matches, primaryStoreMatches, storeByKey } = collectSessionIdMatchesForRequest({
cfg: opts.cfg,
sessionStore,
storePath,
storeAgentId,
sessionId: opts.sessionId,
sessionId: requestedSessionId,
searchOtherAgentStores: requestedAgentId === undefined,
});
const preferredSelection = resolveSessionIdMatchSelection(matches, opts.sessionId);
const preferredSelection = resolveSessionIdMatchSelection(matches, requestedSessionId);
const currentStoreSelection =
preferredSelection.kind === "selected"
? preferredSelection
: resolveSessionIdMatchSelection(primaryStoreMatches, opts.sessionId);
: resolveSessionIdMatchSelection(primaryStoreMatches, requestedSessionId);
if (currentStoreSelection.kind === "selected") {
const preferred = storeByKey.get(currentStoreSelection.sessionKey);
if (preferred) {
@@ -194,9 +195,9 @@ export function resolveSessionKeyForRequest(opts: {
}
}
if (opts.sessionId && !sessionKey) {
if (requestedSessionId && !sessionKey) {
sessionKey = buildExplicitSessionIdSessionKey({
sessionId: opts.sessionId,
sessionId: requestedSessionId,
agentId: opts.agentId,
});
}

View File

@@ -126,6 +126,25 @@ describe("resolveSessionKeyForRequest", () => {
expect(result.storePath).toBe(MYBOT_STORE_PATH);
});
it("treats whitespace --session-id as absent when resolving --agent", async () => {
setupMainAndMybotStorePaths();
mocks.resolveExplicitAgentSessionKey.mockReturnValue("agent:mybot:main");
mockStoresByPath({
[MYBOT_STORE_PATH]: {
"agent:mybot:main": { sessionId: "existing-session-id", updatedAt: 1 },
},
});
const result = resolveSessionKeyForRequest({
cfg: baseCfg,
agentId: "mybot",
sessionId: " ",
});
expect(result.sessionKey).toBe("agent:mybot:main");
expect(result.storePath).toBe(MYBOT_STORE_PATH);
});
it("does not search other agent stores when --agent scopes --session-id", async () => {
setupMainAndMybotStorePaths();
mockStoresByPath({