mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-19 22:10:51 +00:00
103 lines
3.1 KiB
TypeScript
103 lines
3.1 KiB
TypeScript
import type { WizardPrompter } from "../../wizard/prompts.js";
|
|
import { splitSetupEntries } from "./setup-wizard-helpers.js";
|
|
|
|
export type ChannelAccessPolicy = "allowlist" | "open" | "disabled";
|
|
|
|
export function parseAllowlistEntries(raw: string): string[] {
|
|
return splitSetupEntries(String(raw ?? ""));
|
|
}
|
|
|
|
export function formatAllowlistEntries(entries: string[]): string {
|
|
return entries
|
|
.map((entry) => entry.trim())
|
|
.filter(Boolean)
|
|
.join(", ");
|
|
}
|
|
|
|
export async function promptChannelAccessPolicy(params: {
|
|
prompter: WizardPrompter;
|
|
label: string;
|
|
currentPolicy?: ChannelAccessPolicy;
|
|
allowOpen?: boolean;
|
|
allowDisabled?: boolean;
|
|
}): Promise<ChannelAccessPolicy> {
|
|
const options: Array<{ value: ChannelAccessPolicy; label: string }> = [
|
|
{ value: "allowlist", label: "Allowlist (recommended)" },
|
|
];
|
|
if (params.allowOpen !== false) {
|
|
options.push({ value: "open", label: "Open (allow all channels)" });
|
|
}
|
|
if (params.allowDisabled !== false) {
|
|
options.push({ value: "disabled", label: "Disabled (block all channels)" });
|
|
}
|
|
const initialValue = params.currentPolicy ?? "allowlist";
|
|
return await params.prompter.select({
|
|
message: `${params.label} access`,
|
|
options,
|
|
initialValue,
|
|
});
|
|
}
|
|
|
|
export async function promptChannelAllowlist(params: {
|
|
prompter: WizardPrompter;
|
|
label: string;
|
|
currentEntries?: string[];
|
|
placeholder?: string;
|
|
}): Promise<string[]> {
|
|
const initialValue =
|
|
params.currentEntries && params.currentEntries.length > 0
|
|
? formatAllowlistEntries(params.currentEntries)
|
|
: undefined;
|
|
const raw = await params.prompter.text({
|
|
message: `${params.label} allowlist (comma-separated)`,
|
|
placeholder: params.placeholder,
|
|
initialValue,
|
|
});
|
|
return parseAllowlistEntries(raw);
|
|
}
|
|
|
|
export async function promptChannelAccessConfig(params: {
|
|
prompter: WizardPrompter;
|
|
label: string;
|
|
currentPolicy?: ChannelAccessPolicy;
|
|
currentEntries?: string[];
|
|
placeholder?: string;
|
|
allowOpen?: boolean;
|
|
allowDisabled?: boolean;
|
|
skipAllowlistEntries?: boolean;
|
|
defaultPrompt?: boolean;
|
|
updatePrompt?: boolean;
|
|
}): Promise<{ policy: ChannelAccessPolicy; entries: string[] } | null> {
|
|
const hasEntries = (params.currentEntries ?? []).length > 0;
|
|
const shouldPrompt = params.defaultPrompt ?? !hasEntries;
|
|
const wants = await params.prompter.confirm({
|
|
message: params.updatePrompt
|
|
? `Update ${params.label} access?`
|
|
: `Configure ${params.label} access?`,
|
|
initialValue: shouldPrompt,
|
|
});
|
|
if (!wants) {
|
|
return null;
|
|
}
|
|
const policy = await promptChannelAccessPolicy({
|
|
prompter: params.prompter,
|
|
label: params.label,
|
|
currentPolicy: params.currentPolicy,
|
|
allowOpen: params.allowOpen,
|
|
allowDisabled: params.allowDisabled,
|
|
});
|
|
if (policy !== "allowlist") {
|
|
return { policy, entries: [] };
|
|
}
|
|
if (params.skipAllowlistEntries) {
|
|
return { policy, entries: [] };
|
|
}
|
|
const entries = await promptChannelAllowlist({
|
|
prompter: params.prompter,
|
|
label: params.label,
|
|
currentEntries: params.currentEntries,
|
|
placeholder: params.placeholder,
|
|
});
|
|
return { policy, entries };
|
|
}
|