openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
171 lines (170 loc) • 6.61 kB
JavaScript
import { n as defineKeyMoveMigration, s as isRecord } from "./runtime-doctor-migrations-DJDQaWC5.js";
import { c as hasLegacyAccountStreamingAliases, i as stripRetiredChannelKeys, r as normalizeChannelConfigEntries } from "./channel-doctor-helpers-CKvCIMDR.js";
import { t as defineChannelAliasMigration } from "./channel-alias-migration-Du1swkf7.js";
import { n as hasLegacyFlatAllowPrivateNetworkAlias, r as migrateLegacyFlatAllowPrivateNetworkAlias } from "./legacy-private-network-migration-B0PImCud.js";
import "./string-coerce-runtime-B3dXyeph.js";
//#region extensions/matrix/src/doctor-contract.ts
function parseMatrixStreamingMode(value) {
if (typeof value !== "string") return null;
const normalized = value.trim().toLowerCase();
return normalized === "partial" || normalized === "quiet" || normalized === "progress" || normalized === "off" ? normalized : null;
}
const streamingAliasMigration = defineChannelAliasMigration({
channelId: "matrix",
streaming: {
defaultMode: "off",
resolveMode: (entry) => {
const streaming = isRecord(entry.streaming) ? entry.streaming : null;
const parsed = parseMatrixStreamingMode(streaming ? streaming.mode : entry.streaming);
if (parsed) return parsed;
return entry.streaming === true ? "partial" : "off";
}
},
accountStreamingReplacesRoot: true
});
const roomAllowMigration = defineKeyMoveMigration({
scope: ["*"],
from: ["allow"],
to: ["enabled"],
sourceOwn: false,
match: (value) => typeof value === "boolean",
targetIsSet: (value) => typeof value === "boolean",
movedMessage: ({ sourcePath, targetPath, mappedValue }) => `Moved ${sourcePath} → ${targetPath} (${String(mappedValue)}).`,
existingMessage: ({ sourcePath, targetPath, targetValue }) => `Moved ${sourcePath} → ${targetPath} (${String(targetValue)}).`
});
function hasLegacyTrustedDmPolicy(value) {
const root = isRecord(value) ? value : null;
if (!root) return false;
return (isRecord(root.dm) ? root.dm : null)?.policy === "trusted";
}
function migrateLegacyTrustedDmPolicy(params) {
const dm = isRecord(params.entry.dm) ? params.entry.dm : null;
if (!dm || dm.policy !== "trusted") return {
entry: params.entry,
changed: false
};
const allowFromRaw = dm.allowFrom;
const allowFromEntries = Array.isArray(allowFromRaw) ? allowFromRaw.filter((entry) => typeof entry === "string" && entry.trim().length > 0).length : 0;
const nextPolicy = allowFromEntries > 0 ? "allowlist" : "pairing";
const nextDm = {
...dm,
policy: nextPolicy
};
params.changes.push(`Migrated ${params.pathPrefix}.dm.policy "trusted" → "${nextPolicy}" (legacy alias removed; ${allowFromEntries > 0 ? `preserved ${allowFromEntries} ${params.pathPrefix}.dm.allowFrom ${allowFromEntries === 1 ? "entry" : "entries"}` : "no allowFrom entries present, defaulting to pairing for safety"}).`);
return {
entry: {
...params.entry,
dm: nextDm
},
changed: true
};
}
const legacyConfigRules = [
...streamingAliasMigration.legacyConfigRules,
{
path: ["channels", "matrix"],
message: "channels.matrix.allowPrivateNetwork is legacy; use channels.matrix.network.dangerouslyAllowPrivateNetwork instead. Run \"openclaw doctor --fix\".",
match: (value) => hasLegacyFlatAllowPrivateNetworkAlias(isRecord(value) ? value : {})
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.allowPrivateNetwork is legacy; use channels.matrix.accounts.<id>.network.dangerouslyAllowPrivateNetwork instead. Run \"openclaw doctor --fix\".",
match: (value) => hasLegacyAccountStreamingAliases(value, (account) => hasLegacyFlatAllowPrivateNetworkAlias(isRecord(account) ? account : {}))
},
{
path: [
"channels",
"matrix",
"groups"
],
message: "channels.matrix.groups.<room>.allow is legacy; use channels.matrix.groups.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: roomAllowMigration.hasLegacy
},
{
path: [
"channels",
"matrix",
"rooms"
],
message: "channels.matrix.rooms.<room>.allow is legacy; use channels.matrix.rooms.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: roomAllowMigration.hasLegacy
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.{groups,rooms}.<room>.allow is legacy; use channels.matrix.accounts.<id>.{groups,rooms}.<room>.enabled instead. Run \"openclaw doctor --fix\".",
match: (value) => hasLegacyAccountStreamingAliases(value, (account) => {
if (!isRecord(account)) return false;
return roomAllowMigration.hasLegacy(account.groups) || roomAllowMigration.hasLegacy(account.rooms);
})
},
{
path: ["channels", "matrix"],
message: "channels.matrix.dm.policy \"trusted\" is legacy; use \"allowlist\" (with allowFrom entries) or \"pairing\" instead. Run \"openclaw doctor --fix\".",
match: hasLegacyTrustedDmPolicy
},
{
path: [
"channels",
"matrix",
"accounts"
],
message: "channels.matrix.accounts.<id>.dm.policy \"trusted\" is legacy; use \"allowlist\" (with allowFrom entries) or \"pairing\" instead. Run \"openclaw doctor --fix\".",
match: (value) => hasLegacyAccountStreamingAliases(value, hasLegacyTrustedDmPolicy)
}
];
function normalizeMatrixEntry(params) {
const network = migrateLegacyFlatAllowPrivateNetworkAlias(params);
const dmPolicy = migrateLegacyTrustedDmPolicy({
...params,
entry: network.entry
});
let entry = dmPolicy.entry;
let changed = network.changed || dmPolicy.changed;
for (const section of ["groups", "rooms"]) {
const roomMap = isRecord(entry[section]) ? entry[section] : null;
if (!roomMap) continue;
const normalized = roomAllowMigration.normalize({
entry: roomMap,
pathPrefix: `${params.pathPrefix}.${section}`,
changes: params.changes
});
if (normalized.changed) {
entry = Object.assign({}, entry, { [section]: normalized.entry });
changed = true;
}
}
return {
entry,
changed
};
}
function normalizeCompatibilityConfig({ cfg }) {
const changes = [];
const withoutJunkStreamMode = stripRetiredChannelKeys({
cfg,
channelId: "matrix",
keys: /* @__PURE__ */ new Set(["streamMode"]),
scope: "root-and-accounts",
onRemove: ({ key, pathPrefix }) => changes.push(`Removed ${pathPrefix}.${key} (never read by the Matrix runtime).`)
}).config;
const aliases = streamingAliasMigration.normalizeChannelConfig({
cfg: withoutJunkStreamMode,
changes
});
return normalizeChannelConfigEntries({
cfg: aliases.config,
channelId: "matrix",
changes,
normalizeEntry: normalizeMatrixEntry
});
}
//#endregion
export { legacyConfigRules, normalizeCompatibilityConfig };