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 { 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 { 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 }; }