@openclaw/matrix 2026.5.10-beta.3 → 2026.5.10-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/api.js +4 -4
  2. package/dist/{approval-handler.runtime-DE2Egg6C.js → approval-handler.runtime-DiA6Zj9R.js} +3 -3
  3. package/dist/{channel-BLDnDlNh.js → channel-FJw9FfCE.js} +8 -8
  4. package/dist/channel-plugin-api.js +1 -1
  5. package/dist/{channel.runtime-CZJX7t-i.js → channel.runtime-pmZaN3dM.js} +1 -1
  6. package/dist/{cli-713YQ4Cn.js → cli-Bto_9kZ8.js} +7 -7
  7. package/dist/{cli-metadata-Dp6eBA-x.js → cli-metadata-BHARQqCV.js} +1 -1
  8. package/dist/cli-metadata.js +1 -1
  9. package/dist/{client-CzwbYhJp.js → client-Dm7mu-C8.js} +1 -1
  10. package/dist/{config-schema-BxhuVElv.js → config-schema-B975BYl0.js} +5 -0
  11. package/dist/contract-api.js +4 -4
  12. package/dist/{direct-management-DMMMgtTB.js → direct-management--Y8ypgLv.js} +14 -12
  13. package/dist/{draft-stream-CfbJ1hZT.js → draft-stream-BY3Rr2XT.js} +2 -2
  14. package/dist/index.js +1 -1
  15. package/dist/{media-text-COrb-tbz.js → media-text-BsC0CZlM.js} +1 -1
  16. package/dist/{messages-DhSzWb05.js → messages-D_Y6efK2.js} +3 -3
  17. package/dist/{monitor-Ft48sw1H.js → monitor-DgrYos8M.js} +147 -26
  18. package/dist/plugin-entry.handlers.runtime.js +1 -1
  19. package/dist/{profile-update-VfHL5bGn.js → profile-update-BIkLEvFv.js} +1 -1
  20. package/dist/{send-CxbikeHx.js → send-BEmVVhTJ.js} +1 -1
  21. package/dist/{setup-bootstrap-2bH7sf6H.js → setup-bootstrap-BYLBeJJ4.js} +1 -1
  22. package/dist/{setup-core-DtxS62ef.js → setup-core-DW8XlYqw.js} +2 -2
  23. package/dist/{setup-dm-policy-2-r1FrQh.js → setup-dm-policy-Ca3jA4YW.js} +1 -0
  24. package/dist/setup-plugin-api.js +3 -3
  25. package/dist/{setup-surface-BpIVJ14E.js → setup-surface-Dk7piW_w.js} +2 -2
  26. package/dist/test-api.js +1 -1
  27. package/dist/{thread-bindings-CbW2O2hP.js → thread-bindings-Dowu8M5c.js} +1 -1
  28. package/dist/{tool-actions.runtime-BlsvzKgH.js → tool-actions.runtime-DVQT_L6o.js} +5 -5
  29. package/dist/{verification-D6KOTfn2.js → verification-XL53YYMw.js} +1 -1
  30. package/openclaw.plugin.json +7 -0
  31. package/package.json +4 -4
package/dist/api.js CHANGED
@@ -2,10 +2,10 @@ import { d as setMatrixThreadBindingIdleTimeoutBySessionKey, n as getMatrixThrea
2
2
  import { a as resolveMatrixDefaultOrOnlyAccountId, i as resolveMatrixChannelConfig, n as requiresExplicitMatrixDefaultAccount, r as resolveConfiguredMatrixAccountIds, t as findMatrixAccountEntry } from "./account-selection-BWwIruri.js";
3
3
  import { n as listMatrixEnvAccountIds, r as resolveMatrixEnvAccountToken, t as getMatrixScopedEnvVarNames } from "./env-vars-C7uQCTKn.js";
4
4
  import { a as resolveMatrixCredentialsPath, c as resolveMatrixLegacyFlatStoreRoot, i as resolveMatrixCredentialsFilename, l as sanitizeMatrixPathSegment, n as resolveMatrixAccountStorageRoot, o as resolveMatrixHomeserverKey, r as resolveMatrixCredentialsDir, s as resolveMatrixLegacyFlatStoragePaths, t as hashMatrixAccessToken } from "./storage-paths-BJLdnCjV.js";
5
- import { t as matrixPlugin } from "./channel-BLDnDlNh.js";
6
- import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DtxS62ef.js";
7
- import { n as matrixOnboardingAdapter } from "./setup-surface-BpIVJ14E.js";
8
- import { t as createMatrixThreadBindingManager } from "./thread-bindings-CbW2O2hP.js";
5
+ import { t as matrixPlugin } from "./channel-FJw9FfCE.js";
6
+ import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DW8XlYqw.js";
7
+ import { n as matrixOnboardingAdapter } from "./setup-surface-Dk7piW_w.js";
8
+ import { t as createMatrixThreadBindingManager } from "./thread-bindings-Dowu8M5c.js";
9
9
  //#region extensions/matrix/api.ts
10
10
  const matrixSessionBindingAdapterChannels = ["matrix"];
11
11
  //#endregion
@@ -1,10 +1,10 @@
1
1
  import { a as resolveMatrixTargetIdentity } from "./target-ids-80nQ2gql.js";
2
2
  import { i as resolveMatrixAccount } from "./accounts-Bm90Rzvp.js";
3
3
  import { c as shouldHandleMatrixApprovalRequest, r as isMatrixAnyApprovalClientEnabled } from "./exec-approvals-Crnh543m.js";
4
- import { a as sendMessageMatrix, i as reactMatrixMessage, s as sendSingleTextMessageMatrix } from "./send-CxbikeHx.js";
5
- import { a as repairMatrixDirectRooms } from "./direct-management-DMMMgtTB.js";
4
+ import { a as sendMessageMatrix, i as reactMatrixMessage, s as sendSingleTextMessageMatrix } from "./send-BEmVVhTJ.js";
5
+ import { a as repairMatrixDirectRooms } from "./direct-management--Y8ypgLv.js";
6
6
  import { a as unregisterMatrixApprovalReactionTarget, n as listMatrixApprovalReactionBindings, r as registerMatrixApprovalReactionTarget, t as buildMatrixApprovalReactionHint } from "./approval-reactions-o2_tuH8D.js";
7
- import { n as editMatrixMessage, t as deleteMatrixMessage } from "./messages-DhSzWb05.js";
7
+ import { n as editMatrixMessage, t as deleteMatrixMessage } from "./messages-D_Y6efK2.js";
8
8
  import { listMessageReceiptPlatformIds, resolveMessageReceiptPrimaryId } from "openclaw/plugin-sdk/channel-message";
9
9
  import { buildChannelApprovalNativeTargetKey } from "openclaw/plugin-sdk/approval-native-runtime";
10
10
  import { setTimeout } from "node:timers/promises";
@@ -7,12 +7,12 @@ import { n as normalizeMatrixUserId } from "./allowlist-sTzpCn5d.js";
7
7
  import { t as normalizeMatrixApproverId } from "./approval-ids-DoC2z7tR.js";
8
8
  import { a as isMatrixExecApprovalAuthorizedSender, c as shouldHandleMatrixApprovalRequest, d as matrixApprovalAuth, i as isMatrixApprovalClientEnabled, l as shouldSuppressLocalMatrixExecApprovalPrompt, n as getMatrixExecApprovalApprovers, o as isMatrixExecApprovalClientEnabled, r as isMatrixAnyApprovalClientEnabled, s as resolveMatrixExecApprovalTarget, t as getMatrixApprovalApprovers, u as getMatrixApprovalAuthApprovers } from "./exec-approvals-Crnh543m.js";
9
9
  import { t as formatMatrixErrorMessage } from "./errors-CTcpEDq-.js";
10
- import { n as DEFAULT_ACCOUNT_ID$2, r as matrixConfigAdapter, t as MatrixChannelConfigSchema } from "./config-schema-BxhuVElv.js";
10
+ import { n as DEFAULT_ACCOUNT_ID$2, r as matrixConfigAdapter, t as MatrixChannelConfigSchema } from "./config-schema-B975BYl0.js";
11
11
  import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-D4-64QuJ.js";
12
12
  import { n as resolveMatrixRoomConfig, t as resolveMatrixStoredSessionMeta } from "./session-store-metadata-DQXjgNLt.js";
13
13
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-DcrJWCQI.js";
14
- import { a as namedAccountPromotionKeys, o as resolveSingleAccountPromotionTarget, s as singleAccountKeysToMove } from "./setup-dm-policy-2-r1FrQh.js";
15
- import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DtxS62ef.js";
14
+ import { a as namedAccountPromotionKeys, o as resolveSingleAccountPromotionTarget, s as singleAccountKeysToMove } from "./setup-dm-policy-Ca3jA4YW.js";
15
+ import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DW8XlYqw.js";
16
16
  import { i as autoPrepareLegacyMatrixCrypto, o as autoMigrateLegacyMatrixState, r as resolveMatrixMigrationStatus } from "./matrix-migration.runtime-WY6ffcrf.js";
17
17
  import { t as maybeCreateMatrixMigrationSnapshot } from "./migration-snapshot-backup-DaCHTp8C.js";
18
18
  import { n as resolveMatrixInboundConversation } from "./thread-binding-api-Cq_E-E1K.js";
@@ -129,7 +129,7 @@ const matrixMessageActions = {
129
129
  return extractToolSend(args, "sendMessage");
130
130
  },
131
131
  handleAction: async (ctx) => {
132
- const { handleMatrixAction } = await import("./tool-actions.runtime-BlsvzKgH.js");
132
+ const { handleMatrixAction } = await import("./tool-actions.runtime-DVQT_L6o.js");
133
133
  const { action, params, cfg, accountId, mediaLocalRoots } = ctx;
134
134
  const dispatch = async (actionParams) => await handleMatrixAction({
135
135
  ...actionParams,
@@ -405,7 +405,7 @@ const matrixNativeApprovalCapability = createApproverRestrictedNativeApprovalCap
405
405
  accountId,
406
406
  request
407
407
  }),
408
- load: async () => (await import("./approval-handler.runtime-DE2Egg6C.js")).matrixApprovalNativeRuntime
408
+ load: async () => (await import("./approval-handler.runtime-DiA6Zj9R.js")).matrixApprovalNativeRuntime
409
409
  })
410
410
  });
411
411
  const splitMatrixApprovalCapability = splitChannelApprovalCapability(matrixNativeApprovalCapability);
@@ -688,8 +688,8 @@ async function runMatrixStartupMaintenance(params) {
688
688
  //#endregion
689
689
  //#region extensions/matrix/src/channel.ts
690
690
  let matrixStartupLock = Promise.resolve();
691
- const loadMatrixSetupWizard = createLazyRuntimeNamedExport(() => import("./setup-surface-BpIVJ14E.js").then((n) => n.t), "matrixSetupWizard");
692
- const loadMatrixChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-CZJX7t-i.js"), "matrixChannelRuntime");
691
+ const loadMatrixSetupWizard = createLazyRuntimeNamedExport(() => import("./setup-surface-Dk7piW_w.js").then((n) => n.t), "matrixSetupWizard");
692
+ const loadMatrixChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-pmZaN3dM.js"), "matrixChannelRuntime");
693
693
  const meta = {
694
694
  id: "matrix",
695
695
  label: "Matrix",
@@ -1054,7 +1054,7 @@ const matrixPlugin = createChatChannelPlugin({
1054
1054
  await previousLock;
1055
1055
  let monitorMatrixProvider;
1056
1056
  try {
1057
- monitorMatrixProvider = (await import("./monitor-Ft48sw1H.js")).monitorMatrixProvider;
1057
+ monitorMatrixProvider = (await import("./monitor-DgrYos8M.js")).monitorMatrixProvider;
1058
1058
  } finally {
1059
1059
  releaseLock();
1060
1060
  }
@@ -1,2 +1,2 @@
1
- import { t as matrixPlugin } from "./channel-BLDnDlNh.js";
1
+ import { t as matrixPlugin } from "./channel-FJw9FfCE.js";
2
2
  export { matrixPlugin };
@@ -1,4 +1,4 @@
1
- import { a as sendMessageMatrix, c as sendTypingMatrix, o as sendPollMatrix } from "./send-CxbikeHx.js";
1
+ import { a as sendMessageMatrix, c as sendTypingMatrix, o as sendPollMatrix } from "./send-BEmVVhTJ.js";
2
2
  import { t as isBunRuntime } from "./runtime-C6X4h_SJ.js";
3
3
  import { n as resolveMatrixAuth } from "./config-DvF87-p1.js";
4
4
  import "./client-wTkencoF.js";
@@ -3,16 +3,16 @@ import { t as getMatrixRuntime } from "./runtime-Dog86njy.js";
3
3
  import { i as resolveMatrixAccount } from "./accounts-Bm90Rzvp.js";
4
4
  import { t as formatMatrixErrorMessage } from "./errors-CTcpEDq-.js";
5
5
  import { n as resolveMatrixConfigPath, r as updateMatrixAccountConfig } from "./config-update-wZX-HLMn.js";
6
- import { n as matrixSetupAdapter } from "./setup-core-DtxS62ef.js";
6
+ import { n as matrixSetupAdapter } from "./setup-core-DW8XlYqw.js";
7
7
  import { t as resolveMatrixRoomKeyBackupIssue } from "./backup-health-Cabu_WQC.js";
8
8
  import { i as setMatrixSdkLogMode, r as setMatrixSdkConsoleLogging } from "./logging-DZHSPP5N.js";
9
- import { n as withResolvedActionClient } from "./client-CzwbYhJp.js";
9
+ import { n as withResolvedActionClient } from "./client-Dm7mu-C8.js";
10
10
  import { r as resolveMatrixAuthContext } from "./config-DvF87-p1.js";
11
11
  import "./client-wTkencoF.js";
12
12
  import { i as formatZonedTimestamp } from "./runtime-api-DTKcXOhp.js";
13
13
  import { isOpenClawManagedMatrixDevice, summarizeMatrixDeviceHealth } from "./device-health-UVYpbA_W.js";
14
- import { n as updateMatrixOwnProfile, t as applyMatrixProfileUpdate } from "./profile-update-VfHL5bGn.js";
15
- import { a as confirmMatrixVerificationSas, b as verifyMatrixRecoveryKey, c as getMatrixRoomKeyBackupStatus, d as listMatrixVerifications, f as mismatchMatrixVerificationSas, g as runMatrixSelfVerification, h as restoreMatrixRoomKeyBackup, l as getMatrixVerificationSas, m as resetMatrixRoomKeyBackup, n as bootstrapMatrixVerification, p as requestMatrixVerification, r as cancelMatrixVerification, t as acceptMatrixVerification, u as getMatrixVerificationStatus, v as startMatrixVerification } from "./verification-D6KOTfn2.js";
14
+ import { n as updateMatrixOwnProfile, t as applyMatrixProfileUpdate } from "./profile-update-BIkLEvFv.js";
15
+ import { a as confirmMatrixVerificationSas, b as verifyMatrixRecoveryKey, c as getMatrixRoomKeyBackupStatus, d as listMatrixVerifications, f as mismatchMatrixVerificationSas, g as runMatrixSelfVerification, h as restoreMatrixRoomKeyBackup, l as getMatrixVerificationSas, m as resetMatrixRoomKeyBackup, n as bootstrapMatrixVerification, p as requestMatrixVerification, r as cancelMatrixVerification, t as acceptMatrixVerification, u as getMatrixVerificationStatus, v as startMatrixVerification } from "./verification-XL53YYMw.js";
16
16
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-id";
17
17
  //#region extensions/matrix/src/matrix/actions/devices.ts
18
18
  async function listMatrixOwnDevices(opts = {}) {
@@ -39,11 +39,11 @@ let matrixCliExitScheduled = false;
39
39
  let matrixActionClientModulePromise;
40
40
  let matrixDirectManagementModulePromise;
41
41
  function loadMatrixActionClientModule() {
42
- matrixActionClientModulePromise ??= import("./client-CzwbYhJp.js").then((n) => n.t);
42
+ matrixActionClientModulePromise ??= import("./client-Dm7mu-C8.js").then((n) => n.t);
43
43
  return matrixActionClientModulePromise;
44
44
  }
45
45
  function loadMatrixDirectManagementModule() {
46
- matrixDirectManagementModulePromise ??= import("./direct-management-DMMMgtTB.js").then((n) => n.t);
46
+ matrixDirectManagementModulePromise ??= import("./direct-management--Y8ypgLv.js").then((n) => n.t);
47
47
  return matrixDirectManagementModulePromise;
48
48
  }
49
49
  function scheduleMatrixCliExit() {
@@ -209,7 +209,7 @@ async function addMatrixAccount(params) {
209
209
  backupVersion: null
210
210
  };
211
211
  if (accountConfig.encryption === true) {
212
- const { maybeBootstrapNewEncryptedMatrixAccount } = await import("./setup-bootstrap-2bH7sf6H.js");
212
+ const { maybeBootstrapNewEncryptedMatrixAccount } = await import("./setup-bootstrap-BYLBeJJ4.js");
213
213
  verificationBootstrap = await maybeBootstrapNewEncryptedMatrixAccount({
214
214
  previousCfg: cfg,
215
215
  cfg: updated,
@@ -2,7 +2,7 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
2
2
  //#region extensions/matrix/src/cli-metadata.ts
3
3
  function registerMatrixCliMetadata(api) {
4
4
  api.registerCli(async ({ program }) => {
5
- const { registerMatrixCli } = await import("./cli-713YQ4Cn.js");
5
+ const { registerMatrixCli } = await import("./cli-Bto_9kZ8.js");
6
6
  registerMatrixCli({ program });
7
7
  }, { descriptors: [{
8
8
  name: "matrix",
@@ -1,2 +1,2 @@
1
- import { n as registerMatrixCliMetadata, t as cli_metadata_default } from "./cli-metadata-Dp6eBA-x.js";
1
+ import { n as registerMatrixCliMetadata, t as cli_metadata_default } from "./cli-metadata-BHARQqCV.js";
2
2
  export { cli_metadata_default as default, registerMatrixCliMetadata };
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-DUslC3ob.js";
2
- import { u as resolveMatrixRoomId } from "./send-CxbikeHx.js";
2
+ import { u as resolveMatrixRoomId } from "./send-BEmVVhTJ.js";
3
3
  import { n as withResolvedRuntimeMatrixClient } from "./client-bootstrap-CVht4US6.js";
4
4
  //#region extensions/matrix/src/matrix/actions/client.ts
5
5
  var client_exports = /* @__PURE__ */ __exportAll({
@@ -36,6 +36,10 @@ const matrixConfigAdapter = createScopedChannelConfigAdapter({
36
36
  //#endregion
37
37
  //#region extensions/matrix/src/config-ui-hints.ts
38
38
  const matrixChannelConfigUiHints = {
39
+ dangerouslyAllowNameMatching: {
40
+ label: "Matrix Display Name Matching",
41
+ help: "Compatibility opt-in for resolving Matrix display names and joined room names in allowlists. Prefer full @user:server IDs and room IDs or aliases because names are mutable."
42
+ },
39
43
  "streaming.progress.label": {
40
44
  label: "Matrix Progress Label",
41
45
  help: "Initial progress draft title. Use \"auto\" for built-in single-word labels, a custom string, or false to hide the title."
@@ -133,6 +137,7 @@ const MatrixChannelConfigSchema = buildChannelConfigSchema(z.object({
133
137
  initialSyncLimit: z.number().optional(),
134
138
  encryption: z.boolean().optional(),
135
139
  allowlistOnly: z.boolean().optional(),
140
+ dangerouslyAllowNameMatching: z.boolean().optional(),
136
141
  allowBots: z.union([z.boolean(), z.literal("mentions")]).optional(),
137
142
  groupPolicy: GroupPolicySchema.optional(),
138
143
  contextVisibility: ContextVisibilityModeSchema.optional(),
@@ -2,8 +2,8 @@ import { s as resetMatrixThreadBindingsForTests } from "./thread-bindings-shared
2
2
  import { r as setMatrixRuntime } from "./runtime-Dog86njy.js";
3
3
  import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-D4-64QuJ.js";
4
4
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-DcrJWCQI.js";
5
- import { a as namedAccountPromotionKeys, o as resolveSingleAccountPromotionTarget, s as singleAccountKeysToMove } from "./setup-dm-policy-2-r1FrQh.js";
6
- import { n as matrixSetupAdapter } from "./setup-core-DtxS62ef.js";
7
- import { n as matrixOnboardingAdapter } from "./setup-surface-BpIVJ14E.js";
8
- import { t as createMatrixThreadBindingManager } from "./thread-bindings-CbW2O2hP.js";
5
+ import { a as namedAccountPromotionKeys, o as resolveSingleAccountPromotionTarget, s as singleAccountKeysToMove } from "./setup-dm-policy-Ca3jA4YW.js";
6
+ import { n as matrixSetupAdapter } from "./setup-core-DW8XlYqw.js";
7
+ import { n as matrixOnboardingAdapter } from "./setup-surface-Dk7piW_w.js";
8
+ import { t as createMatrixThreadBindingManager } from "./thread-bindings-Dowu8M5c.js";
9
9
  export { collectRuntimeConfigAssignments, createMatrixThreadBindingManager, legacyConfigRules, matrixSetupAdapter, matrixOnboardingAdapter as matrixSetupWizard, namedAccountPromotionKeys, normalizeCompatibilityConfig, resetMatrixThreadBindingsForTests, resolveSingleAccountPromotionTarget, secretTargetRegistryEntries, setMatrixRuntime, singleAccountKeysToMove };
@@ -80,8 +80,10 @@ function normalizeRoomIdList(values) {
80
80
  }
81
81
  return normalized;
82
82
  }
83
- function hasPrimaryMatrixDirectRoomMapping(params) {
84
- return normalizeMappedRoomIds(params.directContent, params.remoteUserId)[0] === params.roomId;
83
+ function hasMatrixDirectRoomMappings(params) {
84
+ const current = normalizeMappedRoomIds(params.directContent, params.remoteUserId);
85
+ const next = normalizeRoomIdList([...params.roomIds, ...current]);
86
+ return current.length === next.length && current.every((roomId, index) => roomId === next[index]);
85
87
  }
86
88
  function resolveDirectAccountDataWriteQueue(client) {
87
89
  const existing = directAccountDataWriteQueues.get(client);
@@ -90,18 +92,18 @@ function resolveDirectAccountDataWriteQueue(client) {
90
92
  directAccountDataWriteQueues.set(client, created);
91
93
  return created;
92
94
  }
93
- async function writeMatrixDirectRoomMapping(params) {
95
+ async function writeMatrixDirectRoomMappings(params) {
94
96
  return await resolveDirectAccountDataWriteQueue(params.client).enqueue(DIRECT_ACCOUNT_DATA_QUEUE_KEY, async () => {
95
97
  const directContentBefore = await readMatrixDirectAccountData(params.client);
96
98
  const directContentAfter = buildNextDirectContent({
97
99
  directContent: directContentBefore,
98
100
  remoteUserId: params.remoteUserId,
99
- roomId: params.roomId
101
+ roomIds: params.roomIds
100
102
  });
101
- const changed = !hasPrimaryMatrixDirectRoomMapping({
103
+ const changed = !hasMatrixDirectRoomMappings({
102
104
  directContent: directContentBefore,
103
105
  remoteUserId: params.remoteUserId,
104
- roomId: params.roomId
106
+ roomIds: params.roomIds
105
107
  });
106
108
  if (changed) await params.client.setAccountData(EventType.Direct, directContentAfter);
107
109
  return {
@@ -128,7 +130,7 @@ async function classifyDirectRoomCandidate(params) {
128
130
  }
129
131
  function buildNextDirectContent(params) {
130
132
  const current = normalizeMappedRoomIds(params.directContent, params.remoteUserId);
131
- const nextRooms = normalizeRoomIdList([params.roomId, ...current]);
133
+ const nextRooms = normalizeRoomIdList([...params.roomIds, ...current]);
132
134
  return {
133
135
  ...params.directContent,
134
136
  [params.remoteUserId]: nextRooms
@@ -136,10 +138,10 @@ function buildNextDirectContent(params) {
136
138
  }
137
139
  async function persistMatrixDirectRoomMapping(params) {
138
140
  const remoteUserId = normalizeRemoteUserId(params.remoteUserId);
139
- return (await writeMatrixDirectRoomMapping({
141
+ return (await writeMatrixDirectRoomMappings({
140
142
  client: params.client,
141
143
  remoteUserId,
142
- roomId: params.roomId
144
+ roomIds: [params.roomId]
143
145
  })).changed;
144
146
  }
145
147
  async function promoteMatrixDirectRoomCandidate(params) {
@@ -194,7 +196,7 @@ async function inspectMatrixDirectRooms(params) {
194
196
  })));
195
197
  const mappedStrict = mappedRooms.find((room) => room.strict);
196
198
  let joinedRooms = [];
197
- if (!mappedStrict && typeof params.client.getJoinedRooms === "function") try {
199
+ if (typeof params.client.getJoinedRooms === "function") try {
198
200
  const resolved = await params.client.getJoinedRooms();
199
201
  joinedRooms = Array.isArray(resolved) ? resolved : [];
200
202
  } catch {
@@ -231,10 +233,10 @@ async function repairMatrixDirectRooms(params) {
231
233
  });
232
234
  const activeRoomId = inspected.activeRoomId ?? await params.client.createDirectRoom(remoteUserId, { encrypted: params.encrypted === true });
233
235
  const createdRoomId = inspected.activeRoomId ? null : activeRoomId;
234
- const mappingWrite = await writeMatrixDirectRoomMapping({
236
+ const mappingWrite = await writeMatrixDirectRoomMappings({
235
237
  client: params.client,
236
238
  remoteUserId,
237
- roomId: activeRoomId
239
+ roomIds: [activeRoomId, ...inspected.discoveredStrictRoomIds]
238
240
  });
239
241
  return {
240
242
  ...inspected,
@@ -1,5 +1,5 @@
1
- import { n as editMessageMatrix, r as prepareMatrixSingleText, s as sendSingleTextMessageMatrix } from "./send-CxbikeHx.js";
2
- import { l as MsgType } from "./direct-management-DMMMgtTB.js";
1
+ import { n as editMessageMatrix, r as prepareMatrixSingleText, s as sendSingleTextMessageMatrix } from "./send-BEmVVhTJ.js";
2
+ import { l as MsgType } from "./direct-management--Y8ypgLv.js";
3
3
  import { createDraftStreamLoop } from "openclaw/plugin-sdk/channel-lifecycle";
4
4
  //#region extensions/matrix/src/matrix/draft-stream.ts
5
5
  const DEFAULT_THROTTLE_MS = 1e3;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as registerMatrixCliMetadata } from "./cli-metadata-Dp6eBA-x.js";
1
+ import { n as registerMatrixCliMetadata } from "./cli-metadata-BHARQqCV.js";
2
2
  import { registerMatrixSubagentHooks } from "./subagent-hooks-api.js";
3
3
  import { defineBundledChannelEntry } from "openclaw/plugin-sdk/channel-entry-contract";
4
4
  //#region extensions/matrix/index.ts
@@ -1,4 +1,4 @@
1
- import { f as buildPollResultsSummary, g as isPollStartType, h as isPollEventType, m as formatPollResultsAsText, p as formatPollAsText, v as parsePollStartContent, y as resolvePollReferenceEventId } from "./send-CxbikeHx.js";
1
+ import { f as buildPollResultsSummary, g as isPollStartType, h as isPollEventType, m as formatPollResultsAsText, p as formatPollAsText, v as parsePollStartContent, y as resolvePollReferenceEventId } from "./send-BEmVVhTJ.js";
2
2
  import path from "node:path";
3
3
  //#region extensions/matrix/src/matrix/poll-summary.ts
4
4
  function resolveMatrixPollRootEventId(event) {
@@ -1,8 +1,8 @@
1
1
  import { r as isMatrixNotFoundError } from "./errors-CTcpEDq-.js";
2
- import { a as sendMessageMatrix, h as isPollEventType, n as editMessageMatrix } from "./send-CxbikeHx.js";
2
+ import { a as sendMessageMatrix, h as isPollEventType, n as editMessageMatrix } from "./send-BEmVVhTJ.js";
3
3
  import { n as MATRIX_REACTION_EVENT_TYPE } from "./reaction-common-ejrL19w-.js";
4
- import { a as resolveMatrixMessageBody, c as resolveMatrixPollRootEventId, i as resolveMatrixMessageAttachment, o as fetchMatrixPollMessageSummary } from "./media-text-COrb-tbz.js";
5
- import { r as withResolvedRoomAction } from "./client-CzwbYhJp.js";
4
+ import { a as resolveMatrixMessageBody, c as resolveMatrixPollRootEventId, i as resolveMatrixMessageAttachment, o as fetchMatrixPollMessageSummary } from "./media-text-BsC0CZlM.js";
5
+ import { r as withResolvedRoomAction } from "./client-Dm7mu-C8.js";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  //#region extensions/matrix/src/matrix/actions/limits.ts
8
8
  function resolveMatrixActionLimit(raw, fallback) {
@@ -6,16 +6,16 @@ import { n as normalizeMatrixUserId, r as resolveMatrixAllowListMatch, t as norm
6
6
  import { r as isMatrixNotFoundError, t as formatMatrixErrorMessage } from "./errors-CTcpEDq-.js";
7
7
  import { a as canonicalizeAllowlistWithResolvedIds, c as formatLocationText, d as logTypingFailure, f as patchAllowlistUsersInConfigEntries, i as buildAllowlistResolutionSummary, l as getAgentScopedMediaLocalRoots, m as toLocationContext, n as resolveMatrixRoomConfig, o as createReplyPrefixOptions, p as summarizeMapping, r as addAllowlistUserEntriesFromConfigEntry, s as createTypingCallbacks, t as resolveMatrixStoredSessionMeta, u as logInboundDrop } from "./session-store-metadata-DQXjgNLt.js";
8
8
  import { i as resolveMatrixStateFilePath } from "./storage-tC3ujLiW.js";
9
- import { a as sendMessageMatrix, g as isPollStartType, h as isPollEventType, p as formatPollAsText, t as chunkMatrixText, v as parsePollStartContent } from "./send-CxbikeHx.js";
10
- import { i as promoteMatrixDirectRoomCandidate, s as MATRIX_OPENCLAW_FINALIZED_PREVIEW_KEY } from "./direct-management-DMMMgtTB.js";
9
+ import { a as sendMessageMatrix, g as isPollStartType, h as isPollEventType, p as formatPollAsText, t as chunkMatrixText, v as parsePollStartContent } from "./send-BEmVVhTJ.js";
10
+ import { i as promoteMatrixDirectRoomCandidate, s as MATRIX_OPENCLAW_FINALIZED_PREVIEW_KEY } from "./direct-management--Y8ypgLv.js";
11
11
  import { i as isStrictDirectMembership, n as hasDirectMatrixMemberFlag, o as readJoinedMatrixMembers } from "./direct-room-XkutHjES.js";
12
- import { t as createMatrixThreadBindingManager } from "./thread-bindings-CbW2O2hP.js";
12
+ import { t as createMatrixThreadBindingManager } from "./thread-bindings-Dowu8M5c.js";
13
13
  import { t as createAsyncLock } from "./async-lock-uQfhfQIY.js";
14
14
  import { n as LogService } from "./logger-CnZRVrux.js";
15
15
  import { i as isMatrixMediaSizeLimitError, r as MatrixMediaSizeLimitError } from "./http-client-C7AeVJay.js";
16
16
  import { i as throwIfMatrixStartupAborted, r as isMatrixStartupAbortError } from "./startup-abort-56edvmbM.js";
17
17
  import { n as isMatrixReadySyncState, r as isMatrixTerminalSyncState, t as isMatrixDisconnectedSyncState } from "./sync-state-C_beeevA.js";
18
- import { a as resolveMatrixMessageBody, i as resolveMatrixMessageAttachment, n as formatMatrixMediaUnavailableText, r as formatMatrixMessageText, s as fetchMatrixPollSnapshot, t as formatMatrixMediaTooLargeText } from "./media-text-COrb-tbz.js";
18
+ import { a as resolveMatrixMessageBody, i as resolveMatrixMessageAttachment, n as formatMatrixMediaUnavailableText, r as formatMatrixMessageText, s as fetchMatrixPollSnapshot, t as formatMatrixMediaTooLargeText } from "./media-text-BsC0CZlM.js";
19
19
  import { n as setActiveMatrixClient } from "./active-client-uhlxdhEy.js";
20
20
  import { t as isBunRuntime } from "./runtime-C6X4h_SJ.js";
21
21
  import { n as resolveMatrixAuth, r as resolveMatrixAuthContext, t as backfillMatrixAuthDeviceIdAfterStartup } from "./config-DvF87-p1.js";
@@ -35,6 +35,7 @@ import { resolveAckReaction } from "openclaw/plugin-sdk/channel-feedback";
35
35
  import { hasFinalInboundReplyDispatch } from "openclaw/plugin-sdk/inbound-reply-dispatch";
36
36
  import { waitUntilAbort } from "openclaw/plugin-sdk/channel-lifecycle";
37
37
  import { registerChannelRuntimeContext } from "openclaw/plugin-sdk/channel-runtime-context";
38
+ import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime";
38
39
  import { createChannelIngressResolver, defineStableChannelIngressIdentity } from "openclaw/plugin-sdk/channel-ingress-runtime";
39
40
  import { createChannelProgressDraftGate, formatChannelProgressDraftLine, formatChannelProgressDraftLineForEntry, formatChannelProgressDraftText, isChannelProgressDraftWorkToolName, resolveChannelProgressDraftMaxLines } from "openclaw/plugin-sdk/channel-streaming";
40
41
  import { evaluateSupplementalContextVisibility, resolveChannelContextVisibilityMode } from "openclaw/plugin-sdk/context-visibility-runtime";
@@ -106,6 +107,9 @@ function filterResolvedMatrixAllowlistEntries(entries) {
106
107
  return isMatrixQualifiedUserId(normalizeMatrixUserLookupEntry(trimmed));
107
108
  });
108
109
  }
110
+ function filterFailClosedMatrixAllowlistEntries(entries) {
111
+ return entries.filter((entry) => entry.trim().length > 0);
112
+ }
109
113
  function listResolvedMatrixAllowlistEntries(params) {
110
114
  const resolvedEntries = [];
111
115
  const seen = /* @__PURE__ */ new Set();
@@ -131,6 +135,12 @@ function normalizeConfiguredMatrixAllowlistEntries(entries) {
131
135
  }
132
136
  return normalized;
133
137
  }
138
+ function isMatrixDangerousNameMatchingEnabled(params) {
139
+ return isDangerousNameMatchingEnabled(resolveMatrixAccountConfig({
140
+ cfg: params.cfg,
141
+ accountId: params.accountId
142
+ }));
143
+ }
134
144
  function addUniqueMatrixAllowlistEntry(params) {
135
145
  const trimmed = params.entry.trim();
136
146
  if (!trimmed) return;
@@ -139,17 +149,48 @@ function addUniqueMatrixAllowlistEntry(params) {
139
149
  params.seen.add(key);
140
150
  params.entries.push(trimmed);
141
151
  }
142
- function sanitizeMatrixRoomUserAllowlists(entries) {
143
- const nextEntries = { ...entries };
144
- for (const [roomKey, roomConfig] of Object.entries(entries)) {
145
- const users = roomConfig?.users;
146
- if (!Array.isArray(users)) continue;
147
- nextEntries[roomKey] = {
148
- ...roomConfig,
149
- users: filterResolvedMatrixAllowlistEntries(users.map(String))
150
- };
152
+ function resolveStableMatrixMonitorUserEntries(entries) {
153
+ const directMatches = [];
154
+ for (const entry of entries) {
155
+ const input = String(entry).trim();
156
+ if (!input) continue;
157
+ const query = normalizeMatrixUserLookupEntry(input);
158
+ if (!query || query === "*") continue;
159
+ directMatches.push(isMatrixQualifiedUserId(query) ? {
160
+ input,
161
+ resolved: true,
162
+ id: normalizeMatrixUserId(query)
163
+ } : {
164
+ input,
165
+ resolved: false
166
+ });
151
167
  }
152
- return nextEntries;
168
+ return buildAllowlistResolutionSummary(directMatches);
169
+ }
170
+ function logStableMatrixAllowlistUnresolved(params) {
171
+ if (params.unresolved.length === 0) return;
172
+ summarizeMapping(params.label, [], params.unresolved, params.runtime);
173
+ params.runtime.log?.(`${params.label} entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender. To match Matrix display names, set channels.matrix.dangerouslyAllowNameMatching=true.`);
174
+ }
175
+ function resolveStableMatrixMonitorUserAllowlist(params) {
176
+ const allowList = params.allowList;
177
+ const resolution = resolveStableMatrixMonitorUserEntries(allowList);
178
+ const canonicalized = canonicalizeAllowlistWithResolvedIds({
179
+ existing: allowList,
180
+ resolvedMap: resolution.resolvedMap
181
+ });
182
+ logStableMatrixAllowlistUnresolved({
183
+ label: params.label,
184
+ unresolved: resolution.unresolved,
185
+ runtime: params.runtime
186
+ });
187
+ return {
188
+ entries: params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized),
189
+ resolvedEntries: listResolvedMatrixAllowlistEntries({
190
+ entries: allowList,
191
+ resolvedMap: resolution.resolvedMap
192
+ })
193
+ };
153
194
  }
154
195
  async function resolveMatrixMonitorUserEntries(params) {
155
196
  const directMatches = [];
@@ -195,6 +236,15 @@ async function resolveMatrixMonitorUserAllowlist(params) {
195
236
  entries: allowList,
196
237
  resolvedEntries: []
197
238
  };
239
+ if (!isMatrixDangerousNameMatchingEnabled({
240
+ cfg: params.cfg,
241
+ accountId: params.accountId
242
+ })) return resolveStableMatrixMonitorUserAllowlist({
243
+ allowList,
244
+ failClosedOnUnresolved: params.failClosedOnUnresolved,
245
+ label: params.label,
246
+ runtime: params.runtime
247
+ });
198
248
  const resolution = await resolveMatrixMonitorUserEntries({
199
249
  cfg: params.cfg,
200
250
  accountId: params.accountId,
@@ -207,9 +257,9 @@ async function resolveMatrixMonitorUserAllowlist(params) {
207
257
  resolvedMap: resolution.resolvedMap
208
258
  });
209
259
  summarizeMapping(params.label, resolution.mapping, resolution.unresolved, params.runtime);
210
- if (resolution.unresolved.length > 0) params.runtime.log?.(`${params.label} entries must be full Matrix IDs (example: @user:server). Unresolved entries are ignored.`);
260
+ if (resolution.unresolved.length > 0) params.runtime.log?.(`${params.label} entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender.`);
211
261
  return {
212
- entries: filterResolvedMatrixAllowlistEntries(canonicalized),
262
+ entries: params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized),
213
263
  resolvedEntries: listResolvedMatrixAllowlistEntries({
214
264
  entries: allowList,
215
265
  resolvedMap: resolution.resolvedMap
@@ -219,6 +269,10 @@ async function resolveMatrixMonitorUserAllowlist(params) {
219
269
  async function resolveMatrixMonitorLiveUserAllowlist(params) {
220
270
  const liveEntries = normalizeConfiguredMatrixAllowlistEntries(params.entries);
221
271
  if (liveEntries.length === 0) return [];
272
+ const allowNameMatching = isMatrixDangerousNameMatchingEnabled({
273
+ cfg: params.cfg,
274
+ accountId: params.accountId
275
+ });
222
276
  const effective = [];
223
277
  const seen = /* @__PURE__ */ new Set();
224
278
  const startupByInput = new Map((params.startupResolvedEntries ?? []).map((entry) => [entry.input, entry.id]));
@@ -242,7 +296,7 @@ async function resolveMatrixMonitorLiveUserAllowlist(params) {
242
296
  continue;
243
297
  }
244
298
  const startupId = startupByInput.get(entry);
245
- if (startupId) {
299
+ if (allowNameMatching && startupId) {
246
300
  addUniqueMatrixAllowlistEntry({
247
301
  entries: effective,
248
302
  seen,
@@ -250,7 +304,15 @@ async function resolveMatrixMonitorLiveUserAllowlist(params) {
250
304
  });
251
305
  continue;
252
306
  }
253
- pending.push(entry);
307
+ if (allowNameMatching) {
308
+ pending.push(entry);
309
+ continue;
310
+ }
311
+ if (params.failClosedOnUnresolved) addUniqueMatrixAllowlistEntry({
312
+ entries: effective,
313
+ seen,
314
+ entry
315
+ });
254
316
  }
255
317
  if (pending.length === 0) return effective;
256
318
  const canonicalized = canonicalizeAllowlistWithResolvedIds({
@@ -263,7 +325,8 @@ async function resolveMatrixMonitorLiveUserAllowlist(params) {
263
325
  resolveTargets: params.resolveTargets ?? resolveMatrixTargets
264
326
  })).resolvedMap
265
327
  });
266
- for (const entry of filterResolvedMatrixAllowlistEntries(canonicalized)) addUniqueMatrixAllowlistEntry({
328
+ const resolvedEntries = params.failClosedOnUnresolved ? filterFailClosedMatrixAllowlistEntries(canonicalized) : filterResolvedMatrixAllowlistEntries(canonicalized);
329
+ for (const entry of resolvedEntries) addUniqueMatrixAllowlistEntry({
267
330
  entries: effective,
268
331
  seen,
269
332
  entry
@@ -276,6 +339,10 @@ async function resolveMatrixMonitorRoomsConfig(params) {
276
339
  const mapping = [];
277
340
  const unresolved = [];
278
341
  const nextRooms = {};
342
+ const allowNameMatching = isMatrixDangerousNameMatchingEnabled({
343
+ cfg: params.cfg,
344
+ accountId: params.accountId
345
+ });
279
346
  if (roomsConfig["*"]) nextRooms["*"] = roomsConfig["*"];
280
347
  const pending = [];
281
348
  for (const [entry, roomConfig] of Object.entries(roomsConfig)) {
@@ -292,6 +359,10 @@ async function resolveMatrixMonitorRoomsConfig(params) {
292
359
  if (cleaned !== input) mapping.push(`${input}→${cleaned}`);
293
360
  continue;
294
361
  }
362
+ if (!cleaned.startsWith("#") && !allowNameMatching) {
363
+ unresolved.push(input);
364
+ continue;
365
+ }
295
366
  pending.push({
296
367
  input,
297
368
  query: cleaned,
@@ -318,6 +389,19 @@ async function resolveMatrixMonitorRoomsConfig(params) {
318
389
  const roomUsers = /* @__PURE__ */ new Set();
319
390
  for (const roomConfig of Object.values(nextRooms)) addAllowlistUserEntriesFromConfigEntry(roomUsers, roomConfig);
320
391
  if (roomUsers.size === 0) return nextRooms;
392
+ if (!allowNameMatching) {
393
+ const resolution = resolveStableMatrixMonitorUserEntries(Array.from(roomUsers));
394
+ logStableMatrixAllowlistUnresolved({
395
+ label: "matrix room users",
396
+ unresolved: resolution.unresolved,
397
+ runtime: params.runtime
398
+ });
399
+ return patchAllowlistUsersInConfigEntries({
400
+ entries: nextRooms,
401
+ resolvedMap: resolution.resolvedMap,
402
+ strategy: "canonicalize"
403
+ });
404
+ }
321
405
  const resolution = await resolveMatrixMonitorUserEntries({
322
406
  cfg: params.cfg,
323
407
  accountId: params.accountId,
@@ -326,12 +410,12 @@ async function resolveMatrixMonitorRoomsConfig(params) {
326
410
  resolveTargets: params.resolveTargets
327
411
  });
328
412
  summarizeMapping("matrix room users", resolution.mapping, resolution.unresolved, params.runtime);
329
- if (resolution.unresolved.length > 0) params.runtime.log?.("matrix room users entries must be full Matrix IDs (example: @user:server). Unresolved entries are ignored.");
330
- return sanitizeMatrixRoomUserAllowlists(patchAllowlistUsersInConfigEntries({
413
+ if (resolution.unresolved.length > 0) params.runtime.log?.("matrix room users entries must be full Matrix IDs (example: @user:server). Unresolved entries will not match any sender.");
414
+ return patchAllowlistUsersInConfigEntries({
331
415
  entries: nextRooms,
332
416
  resolvedMap: resolution.resolvedMap,
333
417
  strategy: "canonicalize"
334
- }));
418
+ });
335
419
  }
336
420
  async function resolveMatrixMonitorConfig(params) {
337
421
  const resolveTargets = params.resolveTargets ?? resolveMatrixTargets;
@@ -349,6 +433,7 @@ async function resolveMatrixMonitorConfig(params) {
349
433
  accountId: params.accountId,
350
434
  label: "matrix group allowlist",
351
435
  list: params.groupAllowFrom,
436
+ failClosedOnUnresolved: true,
352
437
  runtime: params.runtime,
353
438
  resolveTargets
354
439
  }),
@@ -455,6 +540,14 @@ function createDirectRoomTracker(client, opts = {}) {
455
540
  return false;
456
541
  }
457
542
  };
543
+ const canPromoteUnmappedStrictRoom = async (roomId) => {
544
+ try {
545
+ return await opts.canPromoteUnmappedStrictRoom?.(roomId) ?? false;
546
+ } catch (err) {
547
+ log(`matrix: unmapped strict room promotion veto failed room=${roomId} (${String(err)})`);
548
+ return false;
549
+ }
550
+ };
458
551
  const shouldKeepLocallyPromotedDirectRoom = async (roomId) => {
459
552
  try {
460
553
  return await opts.shouldKeepLocallyPromotedDirectRoom?.(roomId);
@@ -545,6 +638,19 @@ function createDirectRoomTracker(client, opts = {}) {
545
638
  return true;
546
639
  }
547
640
  }
641
+ if (await canPromoteUnmappedStrictRoom(roomId)) {
642
+ const promotion = await promoteMatrixDirectRoomCandidate({
643
+ client,
644
+ remoteUserId: senderId ?? "",
645
+ roomId,
646
+ selfUserId
647
+ });
648
+ if (promotion.classifyAsDirect) {
649
+ rememberLocallyPromotedDirectRoom(roomId, senderId ?? "");
650
+ log(`matrix: dm detected via per-room strict fallback room=${roomId} reason=${promotion.reason} repaired=${String(promotion.repaired)}`);
651
+ return true;
652
+ }
653
+ }
548
654
  }
549
655
  log(`matrix: dm check room=${roomId} result=group members=${joinedMembers?.length ?? "unknown"}`);
550
656
  return false;
@@ -693,7 +799,7 @@ const SAS_NOTICE_RETRY_DELAY_MS = 750;
693
799
  const VERIFICATION_EVENT_STARTUP_GRACE_MS = 3e4;
694
800
  let matrixDirectRoomDepsPromise;
695
801
  async function loadMatrixDirectRoomDeps() {
696
- matrixDirectRoomDepsPromise ??= Promise.all([import("./direct-management-DMMMgtTB.js").then((n) => n.t), import("./direct-room-XkutHjES.js").then((n) => n.t)]).then(([directManagementModule, directRoomModule]) => ({
802
+ matrixDirectRoomDepsPromise ??= Promise.all([import("./direct-management--Y8ypgLv.js").then((n) => n.t), import("./direct-room-XkutHjES.js").then((n) => n.t)]).then(([directManagementModule, directRoomModule]) => ({
697
803
  inspectMatrixDirectRooms: directManagementModule.inspectMatrixDirectRooms,
698
804
  isStrictDirectRoom: directRoomModule.isStrictDirectRoom
699
805
  }));
@@ -1895,7 +2001,7 @@ let sessionBindingRuntimePromise;
1895
2001
  let matrixReactionEventsPromise;
1896
2002
  let matrixDraftStreamPromise;
1897
2003
  function loadMatrixSendModule() {
1898
- matrixSendModulePromise ??= import("./send-CxbikeHx.js").then((n) => n.l);
2004
+ matrixSendModulePromise ??= import("./send-BEmVVhTJ.js").then((n) => n.l);
1899
2005
  return matrixSendModulePromise;
1900
2006
  }
1901
2007
  function loadAcpBindingRuntime() {
@@ -1911,7 +2017,7 @@ function loadMatrixReactionEvents() {
1911
2017
  return matrixReactionEventsPromise;
1912
2018
  }
1913
2019
  function loadMatrixDraftStream() {
1914
- matrixDraftStreamPromise ??= import("./draft-stream-CfbJ1hZT.js");
2020
+ matrixDraftStreamPromise ??= import("./draft-stream-BY3Rr2XT.js");
1915
2021
  return matrixDraftStreamPromise;
1916
2022
  }
1917
2023
  const MAX_TRACKED_PAIRING_REPLY_SENDERS = 512;
@@ -2026,12 +2132,21 @@ function createMatrixRoomMessageHandler(params) {
2026
2132
  let liveDmAllowlistCache = null;
2027
2133
  let liveGroupAllowlistCache = null;
2028
2134
  const resolveCachedLiveAllowlist = async (params) => {
2029
- const signature = JSON.stringify((params.entries ?? []).map((entry) => String(entry).trim()));
2135
+ const accountConfig = resolveMatrixAccountConfig({
2136
+ cfg: params.cfg,
2137
+ accountId
2138
+ });
2139
+ const signature = JSON.stringify({
2140
+ entries: (params.entries ?? []).map((entry) => String(entry).trim()),
2141
+ failClosedOnUnresolved: params.failClosedOnUnresolved === true,
2142
+ dangerouslyAllowNameMatching: isDangerousNameMatchingEnabled(accountConfig)
2143
+ });
2030
2144
  if (params.cache?.signature === signature) return params.cache.entries;
2031
2145
  const entries = await resolveLiveUserAllowlist({
2032
2146
  cfg: params.cfg,
2033
2147
  accountId,
2034
2148
  entries: params.entries,
2149
+ failClosedOnUnresolved: params.failClosedOnUnresolved,
2035
2150
  startupResolvedEntries: params.startupResolvedEntries,
2036
2151
  runtime
2037
2152
  });
@@ -2241,6 +2356,7 @@ function createMatrixRoomMessageHandler(params) {
2241
2356
  groupAllowFrom: await resolveCachedLiveAllowlist({
2242
2357
  cfg: liveCfg,
2243
2358
  entries: liveAccountAllowlists.groupAllowFrom,
2359
+ failClosedOnUnresolved: true,
2244
2360
  startupResolvedEntries: groupAllowFromResolvedEntries,
2245
2361
  cache: liveGroupAllowlistCache,
2246
2362
  updateCache: (next) => {
@@ -4018,6 +4134,11 @@ async function monitorMatrixProvider(opts = {}) {
4018
4134
  roomInfo: await getRoomInfo(roomId, { includeAliases: true }),
4019
4135
  rooms: roomsConfig
4020
4136
  }),
4137
+ ...dmSessionScope === "per-room" ? { canPromoteUnmappedStrictRoom: async (roomId) => shouldPromoteRecentInviteRoom({
4138
+ roomId,
4139
+ roomInfo: await getRoomInfo(roomId, { includeAliases: true }),
4140
+ rooms: roomsConfig
4141
+ }) } : {},
4021
4142
  shouldKeepLocallyPromotedDirectRoom: async (roomId) => {
4022
4143
  try {
4023
4144
  const roomInfo = await getRoomInfo(roomId, { includeAliases: true });
@@ -3,7 +3,7 @@ import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runti
3
3
  //#region extensions/matrix/src/plugin-entry.runtime.ts
4
4
  let matrixVerificationRuntimePromise;
5
5
  function loadMatrixVerificationRuntime() {
6
- matrixVerificationRuntimePromise ??= import("./verification-D6KOTfn2.js").then((n) => n.y);
6
+ matrixVerificationRuntimePromise ??= import("./verification-XL53YYMw.js").then((n) => n.y);
7
7
  return matrixVerificationRuntimePromise;
8
8
  }
9
9
  function sendError(respond, err) {
@@ -1,7 +1,7 @@
1
1
  import { t as getMatrixRuntime } from "./runtime-Dog86njy.js";
2
2
  import { n as resolveMatrixConfigPath, r as updateMatrixAccountConfig } from "./config-update-wZX-HLMn.js";
3
3
  import { r as syncMatrixOwnProfile } from "./profile-BlHu0wDX.js";
4
- import { n as withResolvedActionClient } from "./client-CzwbYhJp.js";
4
+ import { n as withResolvedActionClient } from "./client-Dm7mu-C8.js";
5
5
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-id";
6
6
  //#region extensions/matrix/src/matrix/actions/profile.ts
7
7
  async function updateMatrixOwnProfile(opts = {}) {
@@ -3,7 +3,7 @@ import { r as normalizeMatrixResolvableTarget, t as isMatrixQualifiedUserId } fr
3
3
  import { a as resolveMatrixAccountConfig } from "./account-config-D2W-V1eQ.js";
4
4
  import { t as getMatrixRuntime } from "./runtime-Dog86njy.js";
5
5
  import { r as buildMatrixReactionContent } from "./reaction-common-ejrL19w-.js";
6
- import { c as MSC4357_LIVE_KEY, l as MsgType, n as inspectMatrixDirectRooms, o as EventType, r as persistMatrixDirectRoomMapping, u as RelationType } from "./direct-management-DMMMgtTB.js";
6
+ import { c as MSC4357_LIVE_KEY, l as MsgType, n as inspectMatrixDirectRooms, o as EventType, r as persistMatrixDirectRoomMapping, u as RelationType } from "./direct-management--Y8ypgLv.js";
7
7
  import { a as isStrictDirectRoom } from "./direct-room-XkutHjES.js";
8
8
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeOptionalStringifiedId } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-message";
@@ -1,7 +1,7 @@
1
1
  import { a as resolveMatrixAccountConfig, n as hasExplicitMatrixAccountConfig } from "./account-config-D2W-V1eQ.js";
2
2
  import "./accounts-Bm90Rzvp.js";
3
3
  import { t as formatMatrixErrorMessage } from "./errors-CTcpEDq-.js";
4
- import { n as bootstrapMatrixVerification } from "./verification-D6KOTfn2.js";
4
+ import { n as bootstrapMatrixVerification } from "./verification-XL53YYMw.js";
5
5
  //#region extensions/matrix/src/setup-bootstrap.ts
6
6
  async function maybeBootstrapNewEncryptedMatrixAccount(params) {
7
7
  const accountConfig = resolveMatrixAccountConfig({
@@ -1,6 +1,6 @@
1
1
  import { a as resolveMatrixAccountConfig } from "./account-config-D2W-V1eQ.js";
2
2
  import { r as resolveDefaultMatrixAccountId } from "./accounts-Bm90Rzvp.js";
3
- import { i as validateMatrixSetupInput, n as applyMatrixSetupAccountConfig, t as resolveMatrixSetupDmAllowFrom } from "./setup-dm-policy-2-r1FrQh.js";
3
+ import { i as validateMatrixSetupInput, n as applyMatrixSetupAccountConfig, t as resolveMatrixSetupDmAllowFrom } from "./setup-dm-policy-Ca3jA4YW.js";
4
4
  import { t as resolveMatrixConfigFieldPath } from "./config-paths-nsVaysCu.js";
5
5
  import { r as updateMatrixAccountConfig } from "./config-update-wZX-HLMn.js";
6
6
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId, prepareScopedSetupConfig } from "openclaw/plugin-sdk/setup";
@@ -103,7 +103,7 @@ const matrixSetupAdapter = {
103
103
  input
104
104
  }),
105
105
  afterAccountConfigWritten: async ({ previousCfg, cfg, accountId, runtime }) => {
106
- const { runMatrixSetupBootstrapAfterConfigWrite } = await import("./setup-bootstrap-2bH7sf6H.js");
106
+ const { runMatrixSetupBootstrapAfterConfigWrite } = await import("./setup-bootstrap-BYLBeJJ4.js");
107
107
  await runMatrixSetupBootstrapAfterConfigWrite({
108
108
  previousCfg,
109
109
  cfg,
@@ -11,6 +11,7 @@ const matrixSingleAccountKeysToMove = [
11
11
  "initialSyncLimit",
12
12
  "encryption",
13
13
  "allowlistOnly",
14
+ "dangerouslyAllowNameMatching",
14
15
  "allowBots",
15
16
  "blockStreaming",
16
17
  "replyToMode",
@@ -1,6 +1,6 @@
1
1
  import { i as resolveMatrixAccount } from "./accounts-Bm90Rzvp.js";
2
- import { r as matrixConfigAdapter, t as MatrixChannelConfigSchema } from "./config-schema-BxhuVElv.js";
3
- import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DtxS62ef.js";
2
+ import { r as matrixConfigAdapter, t as MatrixChannelConfigSchema } from "./config-schema-B975BYl0.js";
3
+ import { n as matrixSetupAdapter, t as createMatrixSetupWizardProxy } from "./setup-core-DW8XlYqw.js";
4
4
  import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
5
5
  const matrixSetupPlugin = {
6
6
  id: "matrix",
@@ -14,7 +14,7 @@ const matrixSetupPlugin = {
14
14
  order: 70,
15
15
  quickstartAllowFrom: true
16
16
  },
17
- setupWizard: createMatrixSetupWizardProxy(async () => ({ matrixSetupWizard: (await import("./setup-surface-BpIVJ14E.js").then((n) => n.t)).matrixSetupWizard })),
17
+ setupWizard: createMatrixSetupWizardProxy(async () => ({ matrixSetupWizard: (await import("./setup-surface-Dk7piW_w.js").then((n) => n.t)).matrixSetupWizard })),
18
18
  setup: matrixSetupAdapter,
19
19
  capabilities: {
20
20
  chatTypes: [
@@ -3,7 +3,7 @@ import { n as requiresExplicitMatrixDefaultAccount } from "./account-selection-B
3
3
  import { a as resolveMatrixAccountConfig } from "./account-config-D2W-V1eQ.js";
4
4
  import { r as resolveMatrixEnvAuthReadiness } from "./env-auth-BJqGI8M6.js";
5
5
  import { i as resolveMatrixAccount, r as resolveDefaultMatrixAccountId, t as listMatrixAccountIds } from "./accounts-Bm90Rzvp.js";
6
- import { r as moveSingleMatrixAccountConfigToNamedAccount, t as resolveMatrixSetupDmAllowFrom } from "./setup-dm-policy-2-r1FrQh.js";
6
+ import { r as moveSingleMatrixAccountConfigToNamedAccount, t as resolveMatrixSetupDmAllowFrom } from "./setup-dm-policy-Ca3jA4YW.js";
7
7
  import { t as resolveMatrixConfigFieldPath } from "./config-paths-nsVaysCu.js";
8
8
  import { r as updateMatrixAccountConfig } from "./config-update-wZX-HLMn.js";
9
9
  import { n as validateMatrixHomeserverUrl, r as isPrivateOrLoopbackHost, t as resolveValidatedMatrixHomeserverUrl } from "./url-validation-DiK9j7jz.js";
@@ -510,7 +510,7 @@ const matrixOnboardingAdapter = {
510
510
  });
511
511
  },
512
512
  afterConfigWritten: async ({ previousCfg, cfg, accountId, runtime }) => {
513
- const { runMatrixSetupBootstrapAfterConfigWrite } = await import("./setup-bootstrap-2bH7sf6H.js");
513
+ const { runMatrixSetupBootstrapAfterConfigWrite } = await import("./setup-bootstrap-BYLBeJJ4.js");
514
514
  await runMatrixSetupBootstrapAfterConfigWrite({
515
515
  previousCfg,
516
516
  cfg,
package/dist/test-api.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { r as setMatrixRuntime } from "./runtime-Dog86njy.js";
2
- import { t as matrixPlugin } from "./channel-BLDnDlNh.js";
2
+ import { t as matrixPlugin } from "./channel-FJw9FfCE.js";
3
3
  import { t as MatrixClient } from "./sdk-CwxmHlgN.js";
4
4
  export { MatrixClient, matrixPlugin, setMatrixRuntime };
@@ -1,6 +1,6 @@
1
1
  import { a as listBindingsForAccount, c as resolveBindingKey, f as setMatrixThreadBindingManagerEntry, h as toSessionBindingRecord, l as resolveEffectiveBindingExpiry, m as toMatrixBindingTargetKind, o as removeBindingRecord, r as getMatrixThreadBindingManagerEntry, t as deleteMatrixThreadBindingManagerEntry, u as setBindingRecord } from "./thread-bindings-shared-DK-d-oYX.js";
2
2
  import { i as resolveMatrixStateFilePath, t as claimCurrentTokenStorageState } from "./storage-tC3ujLiW.js";
3
- import { a as sendMessageMatrix } from "./send-CxbikeHx.js";
3
+ import { a as sendMessageMatrix } from "./send-BEmVVhTJ.js";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { registerSessionBindingAdapter, resolveThreadBindingFarewellText, unregisterSessionBindingAdapter } from "openclaw/plugin-sdk/thread-bindings-session-runtime";
6
6
  import path from "node:path";
@@ -1,12 +1,12 @@
1
1
  import { a as resolveMatrixAccountConfig } from "./account-config-D2W-V1eQ.js";
2
2
  import "./accounts-Bm90Rzvp.js";
3
- import { _ as parsePollStart, d as buildPollResponseContent, g as isPollStartType, i as reactMatrixMessage, u as resolveMatrixRoomId } from "./send-CxbikeHx.js";
3
+ import { _ as parsePollStart, d as buildPollResponseContent, g as isPollStartType, i as reactMatrixMessage, u as resolveMatrixRoomId } from "./send-BEmVVhTJ.js";
4
4
  import { i as buildMatrixReactionRelationsPath, o as selectOwnMatrixReactionEventIds, s as summarizeMatrixReactionEvents } from "./reaction-common-ejrL19w-.js";
5
- import { n as withResolvedActionClient, r as withResolvedRoomAction } from "./client-CzwbYhJp.js";
6
- import { a as fetchEventSummary, c as resolveMatrixActionLimit, i as sendMatrixMessage, n as editMatrixMessage, o as readPinnedEvents, r as readMatrixMessages, s as EventType, t as deleteMatrixMessage } from "./messages-DhSzWb05.js";
5
+ import { n as withResolvedActionClient, r as withResolvedRoomAction } from "./client-Dm7mu-C8.js";
6
+ import { a as fetchEventSummary, c as resolveMatrixActionLimit, i as sendMatrixMessage, n as editMatrixMessage, o as readPinnedEvents, r as readMatrixMessages, s as EventType, t as deleteMatrixMessage } from "./messages-D_Y6efK2.js";
7
7
  import { a as jsonResult, c as readStringArrayParam, l as readStringParam, o as readNumberParam, r as createActionGate, s as readReactionParams } from "./runtime-api-DTKcXOhp.js";
8
- import { t as applyMatrixProfileUpdate } from "./profile-update-VfHL5bGn.js";
9
- import { _ as scanMatrixVerificationQr, a as confirmMatrixVerificationSas, b as verifyMatrixRecoveryKey, c as getMatrixRoomKeyBackupStatus, d as listMatrixVerifications, f as mismatchMatrixVerificationSas, h as restoreMatrixRoomKeyBackup, i as confirmMatrixVerificationReciprocateQr, l as getMatrixVerificationSas, n as bootstrapMatrixVerification, o as generateMatrixVerificationQr, p as requestMatrixVerification, r as cancelMatrixVerification, s as getMatrixEncryptionStatus, t as acceptMatrixVerification, u as getMatrixVerificationStatus, v as startMatrixVerification } from "./verification-D6KOTfn2.js";
8
+ import { t as applyMatrixProfileUpdate } from "./profile-update-BIkLEvFv.js";
9
+ import { _ as scanMatrixVerificationQr, a as confirmMatrixVerificationSas, b as verifyMatrixRecoveryKey, c as getMatrixRoomKeyBackupStatus, d as listMatrixVerifications, f as mismatchMatrixVerificationSas, h as restoreMatrixRoomKeyBackup, i as confirmMatrixVerificationReciprocateQr, l as getMatrixVerificationSas, n as bootstrapMatrixVerification, o as generateMatrixVerificationQr, p as requestMatrixVerification, r as cancelMatrixVerification, s as getMatrixEncryptionStatus, t as acceptMatrixVerification, u as getMatrixVerificationStatus, v as startMatrixVerification } from "./verification-XL53YYMw.js";
10
10
  import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
11
11
  //#region extensions/matrix/src/matrix/actions/polls.ts
12
12
  function normalizeOptionIndexes(indexes) {
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-DUslC3ob.js";
2
- import { i as withStartedActionClient, n as withResolvedActionClient } from "./client-CzwbYhJp.js";
2
+ import { i as withStartedActionClient, n as withResolvedActionClient } from "./client-Dm7mu-C8.js";
3
3
  import { n as formatMatrixEncryptionUnavailableError } from "./encryption-guidance-BPi3A_m3.js";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
@@ -262,6 +262,9 @@
262
262
  "allowlistOnly": {
263
263
  "type": "boolean"
264
264
  },
265
+ "dangerouslyAllowNameMatching": {
266
+ "type": "boolean"
267
+ },
265
268
  "allowBots": {
266
269
  "anyOf": [
267
270
  {
@@ -778,6 +781,10 @@
778
781
  "label": "Matrix",
779
782
  "description": "open protocol; install the plugin to enable.",
780
783
  "uiHints": {
784
+ "dangerouslyAllowNameMatching": {
785
+ "label": "Matrix Display Name Matching",
786
+ "help": "Compatibility opt-in for resolving Matrix display names and joined room names in allowlists. Prefer full @user:server IDs and room IDs or aliases because names are mutable."
787
+ },
781
788
  "streaming.progress.label": {
782
789
  "label": "Matrix Progress Label",
783
790
  "help": "Initial progress draft title. Use \"auto\" for built-in single-word labels, a custom string, or false to hide the title."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/matrix",
3
- "version": "2026.5.10-beta.3",
3
+ "version": "2026.5.10-beta.4",
4
4
  "description": "OpenClaw Matrix channel plugin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,7 +22,7 @@
22
22
  "openclaw": "workspace:*"
23
23
  },
24
24
  "peerDependencies": {
25
- "openclaw": ">=2026.5.10-beta.3"
25
+ "openclaw": ">=2026.5.10-beta.4"
26
26
  },
27
27
  "peerDependenciesMeta": {
28
28
  "openclaw": {
@@ -87,10 +87,10 @@
87
87
  "allowInvalidConfigRecovery": true
88
88
  },
89
89
  "compat": {
90
- "pluginApi": ">=2026.5.10-beta.3"
90
+ "pluginApi": ">=2026.5.10-beta.4"
91
91
  },
92
92
  "build": {
93
- "openclawVersion": "2026.5.10-beta.3"
93
+ "openclawVersion": "2026.5.10-beta.4"
94
94
  },
95
95
  "release": {
96
96
  "publishToClawHub": true,