diff --git a/src/acp/runtime/session-meta.ts b/src/acp/runtime/session-meta.ts index 83a525e81101..8d79675c404a 100644 --- a/src/acp/runtime/session-meta.ts +++ b/src/acp/runtime/session-meta.ts @@ -253,6 +253,7 @@ export function writeAcpSessionMetaForMigration(params: { export function repairAcpSessionMetaKeyForMigration(params: { sessionKey: string; + candidateSessionKeys?: Iterable; entry?: Pick; env?: NodeJS.ProcessEnv; databasePath?: string; @@ -272,17 +273,38 @@ export function repairAcpSessionMetaKeyForMigration(params: { } const normalizedSessionKey = normalizeLowercaseStringOrEmpty(sessionKey); - const row = executeSqliteQuerySync( + const candidateKeys = new Set(); + candidateKeys.add(normalizedSessionKey); + for (const candidate of params.candidateSessionKeys ?? []) { + const trimmed = typeof candidate === "string" ? candidate.trim() : ""; + if ( + trimmed && + trimmed !== sessionKey && + normalizeLowercaseStringOrEmpty(trimmed) === normalizedSessionKey + ) { + candidateKeys.add(trimmed); + } + } + + let row: AcpSessionRow | undefined; + for (const candidateKey of candidateKeys) { + const candidateRow = selectAcpSessionRow(database.db, candidateKey); + if (candidateRow && acpSessionRowMatchesEntry(candidateRow, params.entry)) { + row = candidateRow; + break; + } + } + row ??= executeSqliteQuerySync( database.db, getAcpSessionKysely(database.db) .selectFrom("acp_sessions") .selectAll() + .where((eb) => eb.fn("lower", ["session_key"]), "=", normalizedSessionKey) .orderBy("last_activity_at", "desc") .orderBy("session_key", "asc"), ).rows.find( (candidate) => candidate.session_key !== sessionKey && - normalizeLowercaseStringOrEmpty(candidate.session_key) === normalizedSessionKey && acpSessionRowMatchesEntry(candidate, params.entry), ); if (!row) { diff --git a/src/gateway/session-utils.ts b/src/gateway/session-utils.ts index cfb87b4628c7..47d2eabc5964 100644 --- a/src/gateway/session-utils.ts +++ b/src/gateway/session-utils.ts @@ -951,6 +951,7 @@ function readAcpMetaForDeletedAgentCheck(params: { repairAcpSessionMetaKeyForMigration({ sessionKey: params.sessionKey, + candidateSessionKeys: directKeys, entry: params.entry ?? undefined, }); return readAcpSessionMetaForEntry({