openclaw/src/cli/message-secret-scope.ts

84 lines
2.2 KiB
TypeScript

import { normalizeAccountId } from "../routing/session-key.js";
import { isDeliverableMessageChannel, normalizeMessageChannel } from "../utils/message-channel.js";
function resolveScopedChannelCandidate(value: unknown): string | undefined {
if (typeof value !== "string") {
return undefined;
}
const normalized = normalizeMessageChannel(value);
if (!normalized || !isDeliverableMessageChannel(normalized)) {
return undefined;
}
return normalized;
}
function resolveChannelFromTargetValue(target: unknown): string | undefined {
if (typeof target !== "string") {
return undefined;
}
const trimmed = target.trim();
if (!trimmed) {
return undefined;
}
const separator = trimmed.indexOf(":");
if (separator <= 0) {
return undefined;
}
return resolveScopedChannelCandidate(trimmed.slice(0, separator));
}
function resolveChannelFromTargets(targets: unknown): string | undefined {
if (!Array.isArray(targets)) {
return undefined;
}
const seen = new Set<string>();
for (const target of targets) {
const channel = resolveChannelFromTargetValue(target);
if (channel) {
seen.add(channel);
}
}
if (seen.size !== 1) {
return undefined;
}
return [...seen][0];
}
function resolveScopedAccountId(value: unknown): string | undefined {
if (typeof value !== "string") {
return undefined;
}
const trimmed = value.trim();
if (!trimmed) {
return undefined;
}
return normalizeAccountId(trimmed);
}
export function resolveMessageSecretScope(params: {
channel?: unknown;
target?: unknown;
targets?: unknown;
fallbackChannel?: string | null;
accountId?: unknown;
fallbackAccountId?: string | null;
}): {
channel?: string;
accountId?: string;
} {
const channel =
resolveScopedChannelCandidate(params.channel) ??
resolveChannelFromTargetValue(params.target) ??
resolveChannelFromTargets(params.targets) ??
resolveScopedChannelCandidate(params.fallbackChannel);
const accountId =
resolveScopedAccountId(params.accountId) ??
resolveScopedAccountId(params.fallbackAccountId ?? undefined);
return {
...(channel ? { channel } : {}),
...(accountId ? { accountId } : {}),
};
}