openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
620 lines (619 loc) • 26.4 kB
JavaScript
import { d as resolveGatewayPort } from "./paths-mvMm5bYV.js";
import { i as formatErrorMessage } from "./errors-BXgSefBE.js";
import { t as formatCliCommand } from "./command-format-CKGmlpAQ.js";
import { p as resolveUserPath } from "./utils-CCC-BEJH.js";
import { d as normalizeSecretInputString } from "./types.secrets-_0JOMGE5.js";
import { n as defaultRuntime } from "./runtime-B4lgFmsS.js";
import { i as normalizeProviderId } from "./provider-id-Dq06Bcx6.js";
import { r as createConfigIO } from "./io-Gi7-pyU-.js";
import { i as replaceConfigFile } from "./config-C9RxTsn1.js";
import { t as WizardCancelledError } from "./prompts-E0FayNjJ.js";
import { n as t } from "./i18n-7g_f4oaD.js";
import { c as formatPluginCompatibilityNotice, r as buildPluginCompatibilitySnapshotNotices } from "./status-TB29O9XH.js";
import { a as stripPendingPluginInstallRecords, i as hasPendingPluginInstallRecords, n as commitConfigWriteWithPendingPluginInstalls, s as unchangedPendingPluginInstallRecordIds } from "./plugins-install-record-commit--Zbbdxlm.js";
import { t as resolveSetupSecretInputString } from "./setup.secret-input-BOdMUWYa.js";
import { r as runSetupMigrationImport, t as detectSetupMigrationSources } from "./setup.migration-import-BDOIEt-x.js";
import chalk from "chalk";
//#region src/wizard/setup.security-note.ts
const heading = (text) => chalk.bold(text);
function getSecurityNoteTitle() {
return t("wizard.security.title");
}
function getSecurityConfirmMessage() {
return t("wizard.security.confirm");
}
function getSecurityNoteMessage() {
return [
t("wizard.security.beta"),
t("wizard.security.personalAgent"),
t("wizard.security.toolAccess"),
t("wizard.security.promptRisk"),
"",
t("wizard.security.notMultitenant"),
t("wizard.security.sharedAuthority"),
"",
t("wizard.security.hardeningRequired"),
t("wizard.security.askForHelp"),
"",
heading(t("wizard.security.recommendedBaseline")),
`- ${t("wizard.security.baselinePairing")}`,
`- ${t("wizard.security.baselineSharedInbox")}`,
`- ${t("wizard.security.baselineSandbox")}`,
`- ${t("wizard.security.baselineDmSessions")}`,
`- ${t("wizard.security.baselineSecrets")}`,
`- ${t("wizard.security.baselineStrongModel")}`,
"",
heading(t("wizard.security.runRegularly")),
formatCliCommand("openclaw security audit --deep"),
formatCliCommand("openclaw security audit --fix"),
"",
heading(t("wizard.security.learnMore")),
"- https://docs.openclaw.ai/gateway/security"
].join("\n");
}
//#endregion
//#region src/wizard/setup.ts
let authChoiceModulePromise;
let configLoggingModulePromise;
let modelPickerModulePromise;
let onboardConfigModulePromise;
function loadAuthChoiceModule() {
authChoiceModulePromise ??= import("./auth-choice-OmtCoovh.js");
return authChoiceModulePromise;
}
function loadConfigLoggingModule() {
configLoggingModulePromise ??= import("./logging-vb-o7PUC.js");
return configLoggingModulePromise;
}
function loadModelPickerModule() {
modelPickerModulePromise ??= import("./model-picker-BZmss4Jz.js");
return modelPickerModulePromise;
}
function loadOnboardConfigModule() {
onboardConfigModulePromise ??= import("./onboard-config-DEBBvu7H.js");
return onboardConfigModulePromise;
}
async function writeWizardConfigFile(configInput, opts = {}) {
let config = configInput;
const allowConfigSizeDrop = opts.allowConfigSizeDrop === true;
if (!allowConfigSizeDrop && hasPendingPluginInstallRecords(config)) {
const migrationBaseConfig = opts.migrationBaseConfig;
if (migrationBaseConfig && hasPendingPluginInstallRecords(migrationBaseConfig)) {
await commitConfigWriteWithPendingPluginInstalls({
nextConfig: migrationBaseConfig,
writeOptions: { allowConfigSizeDrop: true },
commit: async (nextConfig, writeOptions) => {
return await replaceConfigFile({
nextConfig,
...writeOptions ? { writeOptions } : {},
afterWrite: { mode: "auto" }
});
}
});
config = stripPendingPluginInstallRecords(config, unchangedPendingPluginInstallRecordIds(config, migrationBaseConfig));
opts.onPendingPluginInstallMigration?.();
}
}
return (await commitConfigWriteWithPendingPluginInstalls({
nextConfig: config,
writeOptions: { allowConfigSizeDrop },
commit: async (nextConfig, writeOptions) => {
return await replaceConfigFile({
nextConfig,
...writeOptions ? { writeOptions } : {},
afterWrite: { mode: "auto" }
});
}
})).config;
}
async function readSetupConfigFileSnapshot() {
return await createConfigIO({ pluginValidation: "skip" }).readConfigFileSnapshot();
}
async function resolveAuthChoiceModelSelectionPolicy(params) {
const preferredProvider = await params.resolvePreferredProviderForAuthChoice({
choice: params.authChoice,
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env
});
const [{ resolveManifestProviderAuthChoice }, { resolvePluginSetupProvider }] = await Promise.all([import("./provider-auth-choices-C_eGCfHU.js"), import("./setup-registry-DyLXXJU7.js")]);
const manifestChoice = resolveManifestProviderAuthChoice(params.authChoice, {
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
includeUntrustedWorkspacePlugins: false
});
if (manifestChoice) {
const setupProvider = resolvePluginSetupProvider({
provider: manifestChoice.providerId,
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
pluginIds: [manifestChoice.pluginId]
});
const setupPolicy = (setupProvider?.auth.find((method) => normalizeProviderId(method.id) === normalizeProviderId(manifestChoice.methodId)))?.wizard?.modelSelection ?? setupProvider?.wizard?.setup?.modelSelection;
return {
preferredProvider,
promptWhenAuthChoiceProvided: setupPolicy?.promptWhenAuthChoiceProvided === true,
allowKeepCurrent: setupPolicy?.allowKeepCurrent ?? true
};
}
const { resolvePluginProviders, resolveProviderPluginChoice } = await import("./provider-auth-choice.runtime.js");
const providers = resolvePluginProviders({
config: params.config,
workspaceDir: params.workspaceDir,
env: params.env,
mode: "setup"
});
const resolvedChoice = resolveProviderPluginChoice({
providers,
choice: params.authChoice
});
const matchedProvider = resolvedChoice?.provider ?? (() => {
const preferredId = preferredProvider?.trim();
if (!preferredId) return;
return providers.find((provider) => typeof provider.id === "string" && provider.id.trim() === preferredId);
})();
const setupPolicy = resolvedChoice?.wizard?.modelSelection ?? matchedProvider?.wizard?.setup?.modelSelection;
return {
preferredProvider,
promptWhenAuthChoiceProvided: setupPolicy?.promptWhenAuthChoiceProvided === true,
allowKeepCurrent: setupPolicy?.allowKeepCurrent ?? true
};
}
async function requireRiskAcknowledgement(params) {
if (params.opts.acceptRisk === true) return;
await params.prompter.note(getSecurityNoteMessage(), getSecurityNoteTitle());
if (!await params.prompter.confirm({
message: getSecurityConfirmMessage(),
initialValue: false
})) throw new WizardCancelledError(t("wizard.setup.riskNotAccepted"));
}
async function runSetupWizard(opts, runtimeInput, prompter) {
let runtime = runtimeInput;
runtime ??= defaultRuntime;
const onboardHelpers = await import("./onboard-helpers-CfAsmV3U.js");
onboardHelpers.printWizardHeader(runtime);
await prompter.intro(t("wizard.setup.intro"));
await requireRiskAcknowledgement({
opts,
prompter
});
const snapshot = await readSetupConfigFileSnapshot();
let baseConfig = snapshot.valid ? snapshot.exists ? snapshot.sourceConfig ?? snapshot.config : {} : {};
let configResetPerformed = false;
let pendingPluginInstallMigrationBaseConfig = baseConfig;
const writeSetupConfigFile = async (config, optsLocal = {}) => await writeWizardConfigFile(config, {
...optsLocal,
migrationBaseConfig: pendingPluginInstallMigrationBaseConfig,
onPendingPluginInstallMigration: () => {
pendingPluginInstallMigrationBaseConfig = void 0;
}
});
if (snapshot.exists && !snapshot.valid) {
await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig), t("wizard.setup.invalidConfigTitle"));
if (snapshot.issues.length > 0) await prompter.note([
...snapshot.issues.map((iss) => `- ${iss.path}: ${iss.message}`),
"",
"Docs: https://docs.openclaw.ai/gateway/configuration"
].join("\n"), "Config issues");
await prompter.outro(`Config invalid. Run \`${formatCliCommand("openclaw doctor")}\` to repair it, then re-run setup.`);
runtime.exit(1);
return;
}
const compatibilityNotices = snapshot.valid ? buildPluginCompatibilitySnapshotNotices({ config: baseConfig }) : [];
if (compatibilityNotices.length > 0) await prompter.note([
`Detected ${compatibilityNotices.length} plugin compatibility notice${compatibilityNotices.length === 1 ? "" : "s"} in the current config.`,
...compatibilityNotices.slice(0, 4).map((notice) => `- ${formatPluginCompatibilityNotice(notice)}`),
...compatibilityNotices.length > 4 ? [`- ... +${compatibilityNotices.length - 4} more`] : [],
"",
`Review: ${formatCliCommand("openclaw doctor")}`,
`Inspect: ${formatCliCommand("openclaw plugins inspect --all")}`
].join("\n"), t("wizard.setup.pluginCompatibilityTitle"));
const quickstartHint = t("wizard.setup.flowQuickstartHint", { command: formatCliCommand("openclaw configure") });
const manualHint = t("wizard.setup.flowAdvancedHint");
const migrationDetections = await detectSetupMigrationSources({
config: baseConfig,
runtime
});
const firstMigrationDetection = migrationDetections[0];
const importOption = firstMigrationDetection ? {
value: "import",
label: `Import from ${firstMigrationDetection.label}`,
...firstMigrationDetection.source ? { hint: firstMigrationDetection.source } : {}
} : void 0;
const explicitFlowRaw = opts.flow?.trim();
const normalizedExplicitFlow = explicitFlowRaw === "manual" ? "advanced" : explicitFlowRaw;
if (normalizedExplicitFlow && normalizedExplicitFlow !== "quickstart" && normalizedExplicitFlow !== "advanced" && normalizedExplicitFlow !== "import") {
runtime.error("Invalid --flow. Use quickstart, manual, advanced, or import. Example: openclaw onboard --flow quickstart");
runtime.exit(1);
return;
}
let flow = (normalizedExplicitFlow === "quickstart" || normalizedExplicitFlow === "advanced" || normalizedExplicitFlow === "import" ? normalizedExplicitFlow : void 0) ?? await prompter.select({
message: t("wizard.setup.setupMode"),
options: [
{
value: "quickstart",
label: t("wizard.setup.flowQuickstart"),
hint: quickstartHint
},
{
value: "advanced",
label: t("wizard.setup.flowAdvanced"),
hint: manualHint
},
...importOption ? [importOption] : []
],
initialValue: "quickstart"
});
if (opts.mode === "remote" && flow === "quickstart") {
await prompter.note(t("wizard.setup.quickstartOnlyLocal"), t("wizard.setup.quickstartTitle"));
flow = "advanced";
}
if (snapshot.exists) {
await prompter.note(onboardHelpers.summarizeExistingConfig(baseConfig), t("wizard.setup.existingConfigTitle"));
if (await prompter.select({
message: t("wizard.setup.configHandling"),
options: [
{
value: "keep",
label: t("wizard.setup.keepCurrent")
},
{
value: "modify",
label: t("wizard.setup.modifyCurrent")
},
{
value: "reset",
label: t("wizard.setup.resetBefore")
}
]
}) === "reset") {
const workspaceDefault = baseConfig.agents?.defaults?.workspace ?? onboardHelpers.DEFAULT_WORKSPACE;
const resetScope = await prompter.select({
message: t("wizard.setup.resetScope"),
options: [
{
value: "config",
label: t("wizard.setup.resetConfig")
},
{
value: "config+creds+sessions",
label: t("wizard.setup.resetConfigCredsSessions")
},
{
value: "full",
label: t("wizard.setup.resetFull")
}
]
});
await onboardHelpers.handleReset(resetScope, resolveUserPath(workspaceDefault), runtime);
baseConfig = {};
pendingPluginInstallMigrationBaseConfig = baseConfig;
configResetPerformed = true;
}
}
if (opts.importFrom || flow === "import") {
await runSetupMigrationImport({
opts,
baseConfig,
detections: migrationDetections,
prompter,
runtime,
commitConfigFile: (cfg) => writeWizardConfigFile(cfg, { allowConfigSizeDrop: true })
});
return;
}
const wizardFlow = flow;
const quickstartGateway = (() => {
const hasExisting = typeof baseConfig.gateway?.port === "number" || baseConfig.gateway?.bind !== void 0 || baseConfig.gateway?.auth?.mode !== void 0 || baseConfig.gateway?.auth?.token !== void 0 || baseConfig.gateway?.auth?.password !== void 0 || baseConfig.gateway?.customBindHost !== void 0 || baseConfig.gateway?.tailscale?.mode !== void 0;
const bindRaw = baseConfig.gateway?.bind;
const bind = bindRaw === "loopback" || bindRaw === "lan" || bindRaw === "auto" || bindRaw === "custom" || bindRaw === "tailnet" ? bindRaw : "loopback";
let authMode = "token";
if (baseConfig.gateway?.auth?.mode === "token" || baseConfig.gateway?.auth?.mode === "password") authMode = baseConfig.gateway.auth.mode;
else if (baseConfig.gateway?.auth?.token) authMode = "token";
else if (baseConfig.gateway?.auth?.password) authMode = "password";
const tailscaleRaw = baseConfig.gateway?.tailscale?.mode;
const tailscaleMode = tailscaleRaw === "off" || tailscaleRaw === "serve" || tailscaleRaw === "funnel" ? tailscaleRaw : "off";
return {
hasExisting,
port: resolveGatewayPort(baseConfig),
bind,
authMode,
tailscaleMode,
token: baseConfig.gateway?.auth?.token,
password: baseConfig.gateway?.auth?.password,
customBindHost: baseConfig.gateway?.customBindHost,
tailscaleResetOnExit: baseConfig.gateway?.tailscale?.resetOnExit ?? false
};
})();
if (flow === "quickstart") {
const formatBind = (value) => {
if (value === "loopback") return t("wizard.gateway.bindLoopback");
if (value === "lan") return t("wizard.gateway.bindLan");
if (value === "custom") return t("wizard.gateway.bindCustom");
if (value === "tailnet") return t("wizard.gateway.bindTailnet");
return t("wizard.gateway.bindAuto");
};
const formatAuth = (value) => {
if (value === "token") return t("wizard.setup.quickstartAuthTokenDefault");
return t("common.password");
};
const formatTailscale = (value) => {
return t(`wizard.gatewayTailscale.${value}`);
};
const quickstartLines = quickstartGateway.hasExisting ? [
t("wizard.setup.quickstartKeepSettings"),
t("wizard.setup.quickstartGatewayPort", { port: quickstartGateway.port }),
t("wizard.setup.quickstartGatewayBind", { bind: formatBind(quickstartGateway.bind) }),
...quickstartGateway.bind === "custom" && quickstartGateway.customBindHost ? [t("wizard.setup.quickstartGatewayCustomIp", { host: quickstartGateway.customBindHost })] : [],
t("wizard.setup.quickstartGatewayAuth", { auth: formatAuth(quickstartGateway.authMode) }),
t("wizard.setup.quickstartTailscaleExposure", { exposure: formatTailscale(quickstartGateway.tailscaleMode) }),
t("wizard.setup.quickstartDirectChannels")
] : [
t("wizard.setup.quickstartGatewayPort", { port: quickstartGateway.port }),
t("wizard.setup.quickstartGatewayBind", { bind: t("wizard.gateway.bindLoopback") }),
t("wizard.setup.quickstartGatewayAuth", { auth: t("wizard.setup.quickstartAuthTokenDefault") }),
t("wizard.setup.quickstartTailscaleExposure", { exposure: t("wizard.gatewayTailscale.off") }),
t("wizard.setup.quickstartDirectChannels")
];
await prompter.note(quickstartLines.join("\n"), "QuickStart");
}
const localPort = resolveGatewayPort(baseConfig);
const localUrl = `ws://127.0.0.1:${localPort}`;
let localGatewayToken = process.env.OPENCLAW_GATEWAY_TOKEN;
try {
const resolvedGatewayToken = await resolveSetupSecretInputString({
config: baseConfig,
value: baseConfig.gateway?.auth?.token,
path: "gateway.auth.token",
env: process.env
});
if (resolvedGatewayToken) localGatewayToken = resolvedGatewayToken;
} catch (error) {
await prompter.note([t("wizard.setup.secretRefProbeFailed", { field: "gateway.auth.token" }), formatErrorMessage(error)].join("\n"), t("wizard.gateway.auth"));
}
let localGatewayPassword = process.env.OPENCLAW_GATEWAY_PASSWORD;
try {
const resolvedGatewayPassword = await resolveSetupSecretInputString({
config: baseConfig,
value: baseConfig.gateway?.auth?.password,
path: "gateway.auth.password",
env: process.env
});
if (resolvedGatewayPassword) localGatewayPassword = resolvedGatewayPassword;
} catch (error) {
await prompter.note([t("wizard.setup.secretRefProbeFailed", { field: "gateway.auth.password" }), formatErrorMessage(error)].join("\n"), t("wizard.gateway.auth"));
}
const localProbe = await onboardHelpers.probeGatewayReachable({
url: localUrl,
token: localGatewayToken,
password: localGatewayPassword
});
const remoteUrl = baseConfig.gateway?.remote?.url?.trim() ?? "";
let remoteGatewayToken = normalizeSecretInputString(baseConfig.gateway?.remote?.token);
try {
const resolvedRemoteGatewayToken = await resolveSetupSecretInputString({
config: baseConfig,
value: baseConfig.gateway?.remote?.token,
path: "gateway.remote.token",
env: process.env
});
if (resolvedRemoteGatewayToken) remoteGatewayToken = resolvedRemoteGatewayToken;
} catch (error) {
await prompter.note(["Could not resolve gateway.remote.token SecretRef for setup probe.", formatErrorMessage(error)].join("\n"), "Gateway auth");
}
const remoteProbe = remoteUrl ? await onboardHelpers.probeGatewayReachable({
url: remoteUrl,
token: remoteGatewayToken
}) : null;
const mode = opts.mode ?? (flow === "quickstart" ? "local" : await prompter.select({
message: t("wizard.setup.whatSetup"),
options: [{
value: "local",
label: t("wizard.setup.localGateway"),
hint: localProbe.ok ? t("wizard.setup.localGatewayReachable", { url: localUrl }) : t("wizard.setup.localGatewayMissing", { url: localUrl })
}, {
value: "remote",
label: t("wizard.setup.remoteGateway"),
hint: !remoteUrl ? t("wizard.setup.remoteGatewayMissing") : remoteProbe?.ok ? t("wizard.setup.remoteGatewayReachable", { url: remoteUrl }) : t("wizard.setup.remoteGatewayUnreachable", { url: remoteUrl })
}]
}));
if (mode === "remote") {
const { promptRemoteGatewayConfig } = await import("./onboard-remote-Cg_BhxW8.js");
const { applySkipBootstrapConfig } = await loadOnboardConfigModule();
const { logConfigUpdated } = await loadConfigLoggingModule();
let nextConfig = await promptRemoteGatewayConfig(baseConfig, prompter, { secretInputMode: opts.secretInputMode });
if (opts.skipBootstrap) nextConfig = applySkipBootstrapConfig(nextConfig);
nextConfig = onboardHelpers.applyWizardMetadata(nextConfig, {
command: "onboard",
mode
});
await writeSetupConfigFile(nextConfig, { allowConfigSizeDrop: configResetPerformed });
logConfigUpdated(runtime);
await prompter.outro(t("wizard.setup.remoteConfigured"));
return;
}
const workspaceDir = resolveUserPath((opts.workspace ?? (flow === "quickstart" ? baseConfig.agents?.defaults?.workspace ?? onboardHelpers.DEFAULT_WORKSPACE : await prompter.text({
message: t("wizard.setup.workspaceDirectory"),
initialValue: baseConfig.agents?.defaults?.workspace ?? onboardHelpers.DEFAULT_WORKSPACE
}))).trim() || onboardHelpers.DEFAULT_WORKSPACE);
const { applyLocalSetupWorkspaceConfig, applySkipBootstrapConfig } = await loadOnboardConfigModule();
let nextConfig = applyLocalSetupWorkspaceConfig(baseConfig, workspaceDir);
if (opts.skipBootstrap) nextConfig = applySkipBootstrapConfig(nextConfig);
const authChoiceFromPrompt = opts.authChoice === void 0;
let authChoice = opts.authChoice;
let authStore;
let promptAuthChoiceGrouped;
if (authChoiceFromPrompt) {
const { ensureAuthProfileStore } = await import("./agents/auth-profiles.runtime.js");
({promptAuthChoiceGrouped} = await import("./auth-choice-prompt-B0CaAwQ7.js"));
authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
}
while (true) {
if (authChoiceFromPrompt) authChoice = await promptAuthChoiceGrouped({
prompter,
store: authStore,
includeSkip: true,
config: nextConfig,
workspaceDir
});
if (authChoice === void 0) throw new WizardCancelledError(t("wizard.setup.authChoiceRequired"));
if (authChoice === "custom-api-key") {
const { promptCustomApiConfig } = await import("./onboard-custom-C09Zz7lK.js");
nextConfig = (await promptCustomApiConfig({
prompter,
runtime,
config: nextConfig,
secretInputMode: opts.secretInputMode
})).config;
break;
}
if (authChoice === "skip") {
if (authChoiceFromPrompt) {
const { applyPrimaryModel, promptDefaultModel } = await loadModelPickerModule();
const modelSelection = await promptDefaultModel({
config: nextConfig,
prompter,
allowKeep: true,
ignoreAllowlist: true,
includeProviderPluginSetups: false,
loadCatalog: false,
workspaceDir,
runtime
});
if (modelSelection.config) nextConfig = modelSelection.config;
if (modelSelection.model) nextConfig = applyPrimaryModel(nextConfig, modelSelection.model);
const { warnIfModelConfigLooksOff } = await loadAuthChoiceModule();
await warnIfModelConfigLooksOff(nextConfig, prompter, { validateCatalog: false });
}
break;
}
const [{ applyAuthChoice, resolvePreferredProviderForAuthChoice, warnIfModelConfigLooksOff }, { applyPrimaryModel, promptDefaultModel }] = await Promise.all([loadAuthChoiceModule(), loadModelPickerModule()]);
const authResult = await applyAuthChoice({
authChoice,
config: nextConfig,
prompter,
runtime,
setDefaultModel: true,
opts: {
...opts,
token: opts.authChoice === "apiKey" && opts.token ? opts.token : void 0
}
});
nextConfig = authResult.config;
if (authResult.retrySelection) {
if (authChoiceFromPrompt) continue;
break;
}
if (authResult.agentModelOverride) nextConfig = applyPrimaryModel(nextConfig, authResult.agentModelOverride);
const authChoiceModelSelectionPolicy = await resolveAuthChoiceModelSelectionPolicy({
authChoice,
config: nextConfig,
workspaceDir,
resolvePreferredProviderForAuthChoice
});
if (authChoiceFromPrompt || authChoiceModelSelectionPolicy?.promptWhenAuthChoiceProvided) {
const modelSelection = await promptDefaultModel({
config: nextConfig,
prompter,
allowKeep: authChoiceModelSelectionPolicy?.allowKeepCurrent ?? true,
ignoreAllowlist: true,
includeProviderPluginSetups: true,
preferredProvider: authChoiceModelSelectionPolicy?.preferredProvider,
browseCatalogOnDemand: true,
workspaceDir,
runtime
});
if (modelSelection.config) nextConfig = modelSelection.config;
if (modelSelection.model) nextConfig = applyPrimaryModel(nextConfig, modelSelection.model);
}
await warnIfModelConfigLooksOff(nextConfig, prompter, { validateCatalog: false });
break;
}
const { configureGatewayForSetup } = await import("./setup.gateway-config-DUvvEe8z.js");
const gateway = await configureGatewayForSetup({
flow: wizardFlow,
baseConfig,
nextConfig,
localPort,
quickstartGateway,
secretInputMode: opts.secretInputMode,
prompter,
runtime
});
nextConfig = gateway.nextConfig;
const settings = gateway.settings;
if (opts.skipChannels ?? opts.skipProviders) await prompter.note(t("wizard.setup.skipChannels"), t("wizard.setup.channelsTitle"));
else {
const { listChannelPlugins } = await import("./plugins-DktKuCnn.js");
const { setupChannels } = await import("./onboard-channels-BQbbJqOI.js");
const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
nextConfig = await setupChannels(nextConfig, runtime, prompter, {
allowSignalInstall: true,
deferStatusUntilSelection: flow === "quickstart",
forceAllowFromChannels: quickstartAllowFromChannels,
skipDmPolicyPrompt: flow === "quickstart",
skipConfirm: flow === "quickstart",
quickstartDefaults: flow === "quickstart",
secretInputMode: opts.secretInputMode
});
}
nextConfig = await writeSetupConfigFile(nextConfig, { allowConfigSizeDrop: configResetPerformed });
const { logConfigUpdated } = await loadConfigLoggingModule();
logConfigUpdated(runtime);
await onboardHelpers.ensureWorkspaceAndSessions(workspaceDir, runtime, {
skipBootstrap: Boolean(nextConfig.agents?.defaults?.skipBootstrap),
skipOptionalBootstrapFiles: nextConfig.agents?.defaults?.skipOptionalBootstrapFiles
});
if (opts.skipSearch) await prompter.note(t("wizard.setup.skipSearch"), t("wizard.setup.searchTitle"));
else {
const { setupSearch } = await import("./onboard-search-BaCIbWUO.js");
nextConfig = await setupSearch(nextConfig, runtime, prompter, {
quickstartDefaults: flow === "quickstart",
secretInputMode: opts.secretInputMode
});
}
if (opts.skipSkills) await prompter.note(t("wizard.setup.skipSkills"), t("wizard.setup.skillsTitle"));
else {
const { setupSkills } = await import("./onboard-skills-CjFTXzrv.js");
nextConfig = await setupSkills(nextConfig, workspaceDir, runtime, prompter);
}
if (flow !== "quickstart") {
const { setupOfficialPluginInstalls } = await import("./setup.official-plugins-QNpM7jai.js");
nextConfig = await setupOfficialPluginInstalls({
config: nextConfig,
prompter,
runtime,
workspaceDir
});
const { setupPluginConfig } = await import("./setup.plugin-config-BjGF-JLz.js");
nextConfig = await setupPluginConfig({
config: nextConfig,
prompter,
workspaceDir
});
}
if (!opts.skipHooks) {
const { setupInternalHooks } = await import("./onboard-hooks-CuCvKqum.js");
nextConfig = await setupInternalHooks(nextConfig, runtime, prompter);
}
nextConfig = onboardHelpers.applyWizardMetadata(nextConfig, {
command: "onboard",
mode
});
nextConfig = await writeSetupConfigFile(nextConfig, { allowConfigSizeDrop: configResetPerformed });
const { finalizeSetupWizard } = await import("./setup.finalize-aY2mAEyg.js");
await finalizeSetupWizard({
flow: wizardFlow,
opts,
baseConfig,
nextConfig,
workspaceDir,
settings,
prompter,
runtime
});
}
//#endregion
export { runSetupWizard as t };