openclaw/extensions/matrix/src/setup-config.ts
2026-03-19 23:24:50 -04:00

95 lines
3.0 KiB
TypeScript

import { resolveMatrixEnvAuthReadiness } from "./matrix/client.js";
import { updateMatrixAccountConfig } from "./matrix/config-update.js";
import {
applyAccountNameToChannelSection,
DEFAULT_ACCOUNT_ID,
moveSingleAccountChannelSectionToDefaultAccount,
normalizeAccountId,
normalizeSecretInputString,
type ChannelSetupInput,
} from "./runtime-api.js";
import type { CoreConfig } from "./types.js";
const channel = "matrix" as const;
export function validateMatrixSetupInput(params: {
accountId: string;
input: ChannelSetupInput;
}): string | null {
if (params.input.useEnv) {
const envReadiness = resolveMatrixEnvAuthReadiness(params.accountId, process.env);
return envReadiness.ready ? null : envReadiness.missingMessage;
}
if (!params.input.homeserver?.trim()) {
return "Matrix requires --homeserver";
}
const accessToken = params.input.accessToken?.trim();
const password = normalizeSecretInputString(params.input.password);
const userId = params.input.userId?.trim();
if (!accessToken && !password) {
return "Matrix requires --access-token or --password";
}
if (!accessToken) {
if (!userId) {
return "Matrix requires --user-id when using --password";
}
if (!password) {
return "Matrix requires --password when using --user-id";
}
}
return null;
}
export function applyMatrixSetupAccountConfig(params: {
cfg: CoreConfig;
accountId: string;
input: ChannelSetupInput;
avatarUrl?: string;
}): CoreConfig {
const normalizedAccountId = normalizeAccountId(params.accountId);
const migratedCfg =
normalizedAccountId !== DEFAULT_ACCOUNT_ID
? (moveSingleAccountChannelSectionToDefaultAccount({
cfg: params.cfg,
channelKey: channel,
}) as CoreConfig)
: params.cfg;
const next = applyAccountNameToChannelSection({
cfg: migratedCfg,
channelKey: channel,
accountId: normalizedAccountId,
name: params.input.name,
}) as CoreConfig;
if (params.input.useEnv) {
return updateMatrixAccountConfig(next, normalizedAccountId, {
enabled: true,
homeserver: null,
allowPrivateNetwork: null,
userId: null,
accessToken: null,
password: null,
deviceId: null,
deviceName: null,
});
}
const accessToken = params.input.accessToken?.trim();
const password = normalizeSecretInputString(params.input.password);
const userId = params.input.userId?.trim();
return updateMatrixAccountConfig(next, normalizedAccountId, {
enabled: true,
homeserver: params.input.homeserver?.trim(),
allowPrivateNetwork:
typeof params.input.allowPrivateNetwork === "boolean"
? params.input.allowPrivateNetwork
: undefined,
userId: password && !userId ? null : userId,
accessToken: accessToken || (password ? null : undefined),
password: password || (accessToken ? null : undefined),
deviceName: params.input.deviceName?.trim(),
avatarUrl: params.avatarUrl,
initialSyncLimit: params.input.initialSyncLimit,
});
}