Spaces:
Configuration error
Configuration error
| import fs from 'fs'; | |
| import path from 'path'; | |
| import os from 'os'; | |
| import inquirer from 'inquirer'; | |
| const CREDS_DIR = path.join(os.homedir(), '.iniclaw'); | |
| const CREDS_FILE = path.join(CREDS_DIR, 'credentials.json'); | |
| const PROVIDERS = [ | |
| { | |
| name: 'NVIDIA Nemotron', | |
| url: 'https://build.nvidia.com/settings/api-keys', | |
| prefix: 'nvapi-', | |
| envVar: 'NVIDIA_API_KEY' | |
| }, | |
| { | |
| name: 'Groq', | |
| url: 'https://console.groq.com/keys', | |
| prefix: 'gsk_', | |
| envVar: 'GROQ_API_KEY' | |
| }, | |
| { | |
| name: 'Google Gemini', | |
| url: 'https://aistudio.google.com/app/apikey', | |
| prefix: '', | |
| envVar: 'GOOGLE_API_KEY' | |
| }, | |
| { | |
| name: 'OpenAI', | |
| url: 'https://platform.openai.com/api-keys', | |
| prefix: 'sk-', | |
| envVar: 'OPENAI_API_KEY' | |
| } | |
| ]; | |
| async function runSetup() { | |
| console.log("\nini_claw by Inmodel Labs — Setup Wizard\n"); | |
| const { providerName } = await inquirer.prompt([ | |
| { | |
| type: 'list', | |
| name: 'providerName', | |
| message: 'Choose your AI provider:', | |
| choices: PROVIDERS.map(p => p.name) | |
| } | |
| ]); | |
| const provider = PROVIDERS.find(p => p.name === providerName); | |
| console.log(`\nTo get your ${provider.name} API key, visit:`); | |
| console.log(`\x1b[36m${provider.url}\x1b[0m\n`); | |
| const { apiKey } = await inquirer.prompt([ | |
| { | |
| type: 'input', | |
| name: 'apiKey', | |
| message: `Paste your ${provider.name} API key:`, | |
| validate: (input) => { | |
| if (!input) return 'API key cannot be empty'; | |
| if (provider.prefix && !input.startsWith(provider.prefix)) { | |
| return `Invalid key format. Should start with "${provider.prefix}"`; | |
| } | |
| return true; | |
| } | |
| } | |
| ]); | |
| // Ensure credentials directory exists | |
| if (!fs.existsSync(CREDS_DIR)) { | |
| fs.mkdirSync(CREDS_DIR, { recursive: true, mode: 0o700 }); | |
| } | |
| // Load existing credentials if any | |
| let creds = {}; | |
| if (fs.existsSync(CREDS_FILE)) { | |
| try { | |
| creds = JSON.parse(fs.readFileSync(CREDS_FILE, 'utf8')); | |
| } catch (e) { | |
| // Ignore parse errors, start fresh | |
| } | |
| } | |
| // Save new credential | |
| creds[provider.envVar] = apiKey; | |
| // Also set as generic INICLAW_API_KEY for convenience | |
| creds['INICLAW_API_KEY'] = apiKey; | |
| fs.writeFileSync(CREDS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 }); | |
| console.log(`\n\x1b[32mSUCCESS:\x1b[0m Credentials saved to ${CREDS_FILE}`); | |
| console.log("\nNext steps:"); | |
| console.log("1. Run `iniclaw onboard` to create your first sandbox."); | |
| console.log("2. Use `iniclaw status` to check your setup.\n"); | |
| } | |
| if (import.meta.url === `file://${process.argv[1]}`) { | |
| runSetup().catch(err => { | |
| console.error("\nSetup failed:", err.message); | |
| process.exit(1); | |
| }); | |
| } | |
| export { runSetup }; | |