From 65153f7fc36d5f87b0fe434fde2c1c179adfafb3 Mon Sep 17 00:00:00 2001 From: Gustavo Madeira Santana Date: Mon, 9 Mar 2026 05:02:21 -0400 Subject: [PATCH] Matrix: share room config normalization --- .../matrix/src/channel.directory.test.ts | 28 +++++++++++++++++++ extensions/matrix/src/group-mentions.ts | 17 ++--------- .../matrix/src/matrix/monitor/handler.ts | 1 - .../matrix/src/matrix/monitor/rooms.test.ts | 3 -- extensions/matrix/src/matrix/monitor/rooms.ts | 1 - 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/extensions/matrix/src/channel.directory.test.ts b/extensions/matrix/src/channel.directory.test.ts index a5c907b32c1..6af9283d77f 100644 --- a/extensions/matrix/src/channel.directory.test.ts +++ b/extensions/matrix/src/channel.directory.test.ts @@ -205,6 +205,34 @@ describe("matrix directory", () => { groupId: "!room:example.org", }), ).toBe(false); + + expect( + matrixPlugin.groups!.resolveRequireMention!({ + cfg, + accountId: "assistant", + groupId: "matrix:room:!room:example.org", + }), + ).toBe(false); + }); + + it("matches prefixed Matrix aliases in group context", () => { + const cfg = { + channels: { + matrix: { + groups: { + "#ops:example.org": { requireMention: false }, + }, + }, + }, + } as unknown as CoreConfig; + + expect( + matrixPlugin.groups!.resolveRequireMention!({ + cfg, + groupId: "matrix:room:!room:example.org", + groupChannel: "matrix:channel:#ops:example.org", + }), + ).toBe(false); }); it("reports room access warnings against the active Matrix config path", () => { diff --git a/extensions/matrix/src/group-mentions.ts b/extensions/matrix/src/group-mentions.ts index 71b49f59b20..debbdf2d0a1 100644 --- a/extensions/matrix/src/group-mentions.ts +++ b/extensions/matrix/src/group-mentions.ts @@ -1,30 +1,19 @@ import type { ChannelGroupContext, GroupToolPolicyConfig } from "openclaw/plugin-sdk/matrix"; import { resolveMatrixAccountConfig } from "./matrix/accounts.js"; import { resolveMatrixRoomConfig } from "./matrix/monitor/rooms.js"; +import { normalizeMatrixResolvableTarget } from "./matrix/target-ids.js"; import type { CoreConfig } from "./types.js"; -function stripLeadingPrefixCaseInsensitive(value: string, prefix: string): string { - return value.toLowerCase().startsWith(prefix.toLowerCase()) - ? value.slice(prefix.length).trim() - : value; -} - function resolveMatrixRoomConfigForGroup(params: ChannelGroupContext) { - const rawGroupId = params.groupId?.trim() ?? ""; - let roomId = rawGroupId; - roomId = stripLeadingPrefixCaseInsensitive(roomId, "matrix:"); - roomId = stripLeadingPrefixCaseInsensitive(roomId, "channel:"); - roomId = stripLeadingPrefixCaseInsensitive(roomId, "room:"); - + const roomId = normalizeMatrixResolvableTarget(params.groupId?.trim() ?? ""); const groupChannel = params.groupChannel?.trim() ?? ""; - const aliases = groupChannel ? [groupChannel] : []; + const aliases = groupChannel ? [normalizeMatrixResolvableTarget(groupChannel)] : []; const cfg = params.cfg as CoreConfig; const matrixConfig = resolveMatrixAccountConfig({ cfg, accountId: params.accountId }); return resolveMatrixRoomConfig({ rooms: matrixConfig.groups ?? matrixConfig.rooms, roomId, aliases, - name: groupChannel || undefined, }).config; } diff --git a/extensions/matrix/src/matrix/monitor/handler.ts b/extensions/matrix/src/matrix/monitor/handler.ts index 07b20d95b48..ffc1a3c0312 100644 --- a/extensions/matrix/src/matrix/monitor/handler.ts +++ b/extensions/matrix/src/matrix/monitor/handler.ts @@ -259,7 +259,6 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam rooms: roomsConfig, roomId, aliases: roomAliases, - name: roomName, }) : undefined; const roomConfig = roomConfigInfo?.config; diff --git a/extensions/matrix/src/matrix/monitor/rooms.test.ts b/extensions/matrix/src/matrix/monitor/rooms.test.ts index 9c94dc49ce0..6ee158cd302 100644 --- a/extensions/matrix/src/matrix/monitor/rooms.test.ts +++ b/extensions/matrix/src/matrix/monitor/rooms.test.ts @@ -13,7 +13,6 @@ describe("resolveMatrixRoomConfig", () => { rooms, roomId: "!room:example.org", aliases: [], - name: "Project Room", }); expect(byId.allowed).toBe(true); expect(byId.matchKey).toBe("!room:example.org"); @@ -22,7 +21,6 @@ describe("resolveMatrixRoomConfig", () => { rooms, roomId: "!other:example.org", aliases: ["#alias:example.org"], - name: "Other Room", }); expect(byAlias.allowed).toBe(true); expect(byAlias.matchKey).toBe("#alias:example.org"); @@ -31,7 +29,6 @@ describe("resolveMatrixRoomConfig", () => { rooms: { "Project Room": { allow: true } }, roomId: "!different:example.org", aliases: [], - name: "Project Room", }); expect(byName.allowed).toBe(false); expect(byName.config).toBeUndefined(); diff --git a/extensions/matrix/src/matrix/monitor/rooms.ts b/extensions/matrix/src/matrix/monitor/rooms.ts index 215a3f3811e..828a1f56955 100644 --- a/extensions/matrix/src/matrix/monitor/rooms.ts +++ b/extensions/matrix/src/matrix/monitor/rooms.ts @@ -13,7 +13,6 @@ export function resolveMatrixRoomConfig(params: { rooms?: Record; roomId: string; aliases: string[]; - name?: string | null; }): MatrixRoomConfigResolved { const rooms = params.rooms ?? {}; const keys = Object.keys(rooms);