openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
108 lines (107 loc) • 3.42 kB
JavaScript
import { n as compareAuthChoiceGroups, t as buildAuthChoiceGroups } from "./auth-choice-options-pEqDVWxi.js";
//#region src/commands/auth-choice-prompt.ts
const BACK_VALUE = "__back";
const MORE_VALUE = "__more";
function isGroupFeatured(group) {
return group.options.some((option) => option.onboardingFeatured);
}
function groupToOption(group) {
return {
value: group.value,
label: group.label,
hint: group.hint
};
}
/** Prompt for a provider group and auth method, with fallback flat selection when needed. */
async function promptAuthChoiceGrouped(params) {
const { groups, skipOption } = buildAuthChoiceGroups(params);
const availableGroups = groups.filter((group) => group.options.length > 0);
const groupById = new Map(availableGroups.map((group) => [group.value, group]));
const featuredGroups = availableGroups.filter(isGroupFeatured).toSorted(compareAuthChoiceGroups);
const moreGroups = [...availableGroups].toSorted(compareAuthChoiceGroups);
const pickMethod = async (group) => {
if (group.options.length === 1) return group.options[0].value;
return await params.prompter.select({
message: `${group.label} auth method`,
options: [...group.options, {
value: BACK_VALUE,
label: "Back"
}]
});
};
const pickFromMore = async () => {
while (true) {
const options = moreGroups.map(groupToOption);
options.push({
value: BACK_VALUE,
label: "Back"
});
const selection = await params.prompter.select({
message: "Model/auth provider",
options,
searchable: true
});
if (selection === BACK_VALUE) return BACK_VALUE;
const group = groupById.get(selection);
if (!group) continue;
const method = await pickMethod(group);
if (method === BACK_VALUE) continue;
return method;
}
};
const runFlat = async () => {
while (true) {
const flatOptions = moreGroups.map(groupToOption);
if (skipOption) flatOptions.push({
value: skipOption.value,
label: skipOption.label
});
const selection = await params.prompter.select({
message: "Model/auth provider",
options: flatOptions,
searchable: true
});
if (selection === "skip") return "skip";
const group = groupById.get(selection);
if (!group || group.options.length === 0) {
await params.prompter.note("No auth methods available for that provider.", "Model/auth choice");
continue;
}
const method = await pickMethod(group);
if (method === BACK_VALUE) continue;
return method;
}
};
if (featuredGroups.length === 0) return runFlat();
while (true) {
const topTier = featuredGroups.map(groupToOption);
topTier.push({
value: MORE_VALUE,
label: "More…"
});
if (skipOption) topTier.push({
value: skipOption.value,
label: skipOption.label
});
const topSelection = await params.prompter.select({
message: "Model/auth provider",
options: topTier
});
if (topSelection === "skip") return "skip";
if (topSelection === MORE_VALUE) {
const more = await pickFromMore();
if (more === BACK_VALUE) continue;
return more;
}
const group = groupById.get(topSelection);
if (!group || group.options.length === 0) {
await params.prompter.note("No auth methods available for that provider.", "Model/auth choice");
continue;
}
const method = await pickMethod(group);
if (method === BACK_VALUE) continue;
return method;
}
}
//#endregion
export { promptAuthChoiceGrouped as t };