openclaw/src/infra/exec-approval-command-displ...

41 lines
1.3 KiB
TypeScript

import type { ExecApprovalRequestPayload } from "./exec-approvals.js";
const UNICODE_FORMAT_CHAR_REGEX = /\p{Cf}/gu;
function formatCodePointEscape(char: string): string {
return `\\u{${char.codePointAt(0)?.toString(16).toUpperCase() ?? "FFFD"}}`;
}
export function sanitizeExecApprovalDisplayText(commandText: string): string {
return commandText.replace(UNICODE_FORMAT_CHAR_REGEX, formatCodePointEscape);
}
function normalizePreview(commandText: string, commandPreview?: string | null): string | null {
const previewRaw = commandPreview?.trim() ?? "";
if (!previewRaw) {
return null;
}
const preview = sanitizeExecApprovalDisplayText(previewRaw);
if (preview === commandText) {
return null;
}
return preview;
}
export function resolveExecApprovalCommandDisplay(request: ExecApprovalRequestPayload): {
commandText: string;
commandPreview: string | null;
} {
const commandTextSource =
request.command ||
(request.host === "node" && request.systemRunPlan ? request.systemRunPlan.commandText : "");
const commandText = sanitizeExecApprovalDisplayText(commandTextSource);
const previewSource =
request.commandPreview ??
(request.host === "node" ? (request.systemRunPlan?.commandPreview ?? null) : null);
return {
commandText,
commandPreview: normalizePreview(commandText, previewSource),
};
}