diff --git a/CHANGELOG.md b/CHANGELOG.md index baff0ddb5ee..8a5ae172c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ Docs: https://docs.openclaw.ai ### Fixes - Discord/Agent component interactions: accept Components v2 `cid` payloads alongside legacy `componentId`, and safely decode percent-encoded IDs without throwing on malformed `%` sequences. Landed from contributor PR #29013 by @Jacky1n7. Thanks @Jacky1n7. +- Matrix/Directory room IDs: preserve original room-ID casing for direct `!roomId` group lookups (without `:server`) so allowlist checks do not fail on case-sensitive IDs. Landed from contributor PR #31201 by @williamos-dev. Thanks @williamos-dev. - Discord/Inbound media fallback: preserve attachment and sticker metadata when Discord CDN fetch/save fails by keeping URL-based media entries in context, with regression coverage for save failures and mixed success/failure ordering. Landed from contributor PR #28906 by @Sid-Qin. Thanks @Sid-Qin. - Docs/Docker images: clarify the official GHCR image source and tag guidance (`main`, `latest`, ``), and document that `OPENCLAW_IMAGE` skips local image builds but still uses the repo-local compose/setup flow. (#27214, #31180) Fixes #15655. Thanks @ipl31. - Agents/Model fallback: classify additional network transport errors (`ECONNREFUSED`, `ENETUNREACH`, `EHOSTUNREACH`, `ENETRESET`, `EAI_AGAIN`) as failover-worthy so fallback chains advance when primary providers are unreachable. Landed from contributor PR #19077 by @ayanesakura. Thanks @ayanesakura. diff --git a/extensions/matrix/src/directory-live.test.ts b/extensions/matrix/src/directory-live.test.ts index d499574bc8d..bc0b1202005 100644 --- a/extensions/matrix/src/directory-live.test.ts +++ b/extensions/matrix/src/directory-live.test.ts @@ -71,4 +71,15 @@ describe("matrix directory live", () => { expect(result).toEqual([]); expect(resolveMatrixAuth).not.toHaveBeenCalled(); }); + + it("preserves original casing for room IDs without :server suffix", async () => { + const mixedCaseId = "!EonMPPbOuhntHEHgZ2dnBO-c_EglMaXlIh2kdo8cgiA"; + const result = await listMatrixDirectoryGroupsLive({ + cfg, + query: mixedCaseId, + }); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe(mixedCaseId); + }); }); diff --git a/extensions/matrix/src/directory-live.ts b/extensions/matrix/src/directory-live.ts index e7c8fd45920..6ac2fc26c6a 100644 --- a/extensions/matrix/src/directory-live.ts +++ b/extensions/matrix/src/directory-live.ts @@ -174,7 +174,8 @@ export async function listMatrixDirectoryGroupsLive( } if (query.startsWith("!")) { - return [createGroupDirectoryEntry({ id: query, name: query })]; + const originalId = params.query?.trim() ?? query; + return [createGroupDirectoryEntry({ id: originalId, name: originalId })]; } const joined = await fetchMatrixJson({