feat(setup): add contextual help text to all wizard flows

Each setup section now explains what's needed before prompting:
- Providers: links to API key consoles (Anthropic, OpenAI, Gemini, etc.)
- Channels: step-by-step bot creation (Telegram @BotFather, Discord dev
  portal, Slack app setup, WhatsApp QR)
- Gmail: Google Cloud Console OAuth setup walkthrough
- Memory: explains what vector search does and key reuse
- Security: describes each option (sandbox, pairing, tool profiles)
- Gateway: explains auth token, Tailscale Serve, lock mode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
William Valentin
2026-02-10 10:08:44 -08:00
parent f9446a4d67
commit f4b9c850ab
6 changed files with 60 additions and 2 deletions
+14
View File
@@ -26,9 +26,23 @@ const SECOND_TIER: ProviderDef[] = [
{ name: 'GitHub Models', provider: 'github', defaultModel: 'claude-sonnet-4-20250514', needsApiKey: false, needsEndpoint: false },
];
const PROVIDER_HELP: Record<string, string> = {
anthropic: 'Get your API key at https://console.anthropic.com/settings/keys',
openai: 'Get your API key at https://platform.openai.com/api-keys',
ollama: 'Ollama runs locally — install from https://ollama.com and run: ollama serve',
gemini: 'Get your API key at https://aistudio.google.com/apikey',
openrouter: 'Get your API key at https://openrouter.ai/keys (supports 200+ models)',
xai: 'Get your API key at https://console.x.ai',
bedrock: 'Uses AWS credentials from environment (~/.aws/credentials or IAM role)',
github: 'Uses GitHub Copilot — authenticate via OAuth device flow on first use',
};
async function configureProvider(p: Prompter, def: ProviderDef): Promise<{
provider: string; model: string; api_key?: string; endpoint?: string;
}> {
const help = PROVIDER_HELP[def.provider];
if (help) p.println(` ${help}`);
const config: Record<string, string> = { provider: def.provider };
if (def.needsApiKey) config.api_key = await p.password(def.apiKeyLabel ?? 'API key');
if (def.needsEndpoint) config.endpoint = await p.ask('Host', def.defaultEndpoint);