UNPKG

giga-code

Version:

A personal AI CLI assistant powered by Grok for local development.

180 lines 9.78 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importStar(require("react")); const ink_1 = require("ink"); const giga_agent_1 = require("../../agent/giga-agent"); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const os = __importStar(require("os")); function ApiKeyInput({ onApiKeySet }) { const [input, setInput] = (0, react_1.useState)(""); const [groqInput, setGroqInput] = (0, react_1.useState)(""); const [anthropicInput, setAnthropicInput] = (0, react_1.useState)(""); const [openRouterInput, setOpenRouterInput] = (0, react_1.useState)(""); const [currentField, setCurrentField] = (0, react_1.useState)("grok"); const [error, setError] = (0, react_1.useState)(""); const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false); const { exit } = (0, ink_1.useApp)(); (0, ink_1.useInput)((inputChar, key) => { if (isSubmitting) return; if (key.ctrl && inputChar === "c") { exit(); return; } if (key.return) { if (currentField === "grok") { setCurrentField("groq"); } else if (currentField === "groq") { setCurrentField("anthropic"); } else if (currentField === "anthropic") { setCurrentField("openrouter"); } else { handleSubmit(); } return; } if (key.backspace || key.delete) { if (currentField === "grok") { setInput((prev) => prev.slice(0, -1)); } else if (currentField === "groq") { setGroqInput((prev) => prev.slice(0, -1)); } else if (currentField === "anthropic") { setAnthropicInput((prev) => prev.slice(0, -1)); } else if (currentField === "openrouter") { setOpenRouterInput((prev) => prev.slice(0, -1)); } setError(""); return; } if (inputChar && !key.ctrl && !key.meta) { if (currentField === "grok") { setInput((prev) => prev + inputChar); } else if (currentField === "groq") { setGroqInput((prev) => prev + inputChar); } else if (currentField === "anthropic") { setAnthropicInput((prev) => prev + inputChar); } else if (currentField === "openrouter") { setOpenRouterInput((prev) => prev + inputChar); } setError(""); } }); const handleSubmit = async () => { // Check for API keys in input fields or environment variables const xaiKey = input.trim() || process.env.XAI_API_KEY; const groqKey = groqInput.trim() || process.env.GROQ_API_KEY; const anthropicKey = anthropicInput.trim() || process.env.ANTHROPIC_API_KEY || process.env.CLAUDE_API_KEY; const openRouterKey = openRouterInput.trim() || process.env.OPENROUTER_API_KEY; if (!xaiKey && !groqKey && !anthropicKey && !openRouterKey) { setError("At least one API key is required (via input or environment variable)"); return; } setIsSubmitting(true); try { const apiKey = xaiKey; const groqApiKey = groqKey; const agent = new giga_agent_1.GigaAgent(apiKey, groqApiKey); // Set environment variable for current process process.env.XAI_API_KEY = apiKey; // Save to .grok/user-settings.json try { const homeDir = os.homedir(); const gigaDir = path.join(homeDir, '.giga'); const settingsFile = path.join(gigaDir, 'user-settings.json'); // Create .giga directory if it doesn't exist if (!fs.existsSync(gigaDir)) { fs.mkdirSync(gigaDir, { mode: 0o700 }); } // Load existing settings or create new let settings = {}; if (fs.existsSync(settingsFile)) { try { settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8')); } catch { settings = {}; } } // Update API key settings.apiKey = apiKey; // Save settings fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2), { mode: 0o600 }); console.log(`\n✅ API key saved to ~/.giga/user-settings.json`); } catch (error) { console.log('\n⚠️ Could not save API key to settings file'); console.log('API key set for current session only'); } onApiKeySet(agent); } catch (error) { setError("Invalid API key format"); setIsSubmitting(false); } }; const displayText = input.length > 0 ? (isSubmitting ? "*".repeat(input.length) : "*".repeat(input.length) + "█") : (isSubmitting ? " " : "█"); return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 }, react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\uD83D\uDD11 API Keys Required"), react_1.default.createElement(ink_1.Box, { marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray" }, "Please enter your API keys to continue:")), react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 }, react_1.default.createElement(ink_1.Box, { borderStyle: "round", borderColor: currentField === "grok" ? "blue" : "gray", paddingX: 1, marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray" }, "xAI API Key \u276F "), react_1.default.createElement(ink_1.Text, null, input.length > 0 ? (isSubmitting ? "*".repeat(input.length) : "*".repeat(input.length) + "█") : (isSubmitting ? "..." : "█"))), react_1.default.createElement(ink_1.Box, { borderStyle: "round", borderColor: currentField === "groq" ? "blue" : "gray", paddingX: 1, marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray" }, "Groq API Key \u276F "), react_1.default.createElement(ink_1.Text, null, groqInput.length > 0 ? (isSubmitting ? "*".repeat(groqInput.length) : "*".repeat(groqInput.length) + "█") : (isSubmitting ? "..." : "█"))), react_1.default.createElement(ink_1.Box, { borderStyle: "round", borderColor: currentField === "anthropic" ? "blue" : "gray", paddingX: 1, marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray" }, "Anthropic API Key \u276F "), react_1.default.createElement(ink_1.Text, null, anthropicInput.length > 0 ? (isSubmitting ? "*".repeat(anthropicInput.length) : "*".repeat(anthropicInput.length) + "█") : (isSubmitting ? "..." : "█"))), react_1.default.createElement(ink_1.Box, { borderStyle: "round", borderColor: currentField === "openrouter" ? "blue" : "gray", paddingX: 1, marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray" }, "OpenRouter API Key \u276F "), react_1.default.createElement(ink_1.Text, null, openRouterInput.length > 0 ? (isSubmitting ? "*".repeat(openRouterInput.length) : "*".repeat(openRouterInput.length) + "█") : (isSubmitting ? "..." : "█")))), error ? (react_1.default.createElement(ink_1.Box, { marginBottom: 1 }, react_1.default.createElement(ink_1.Text, { color: "red" }, "\u274C ", error))) : null, react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginTop: 1 }, react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Enter to move to next field or submit"), react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "\u2022 Press Ctrl+C to exit"), react_1.default.createElement(ink_1.Text, { color: "gray", dimColor: true }, "Note: API keys will be saved to ~/.giga/user-settings.json")), isSubmitting ? (react_1.default.createElement(ink_1.Box, { marginTop: 1 }, react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\uD83D\uDD04 Validating API keys..."))) : null)); } exports.default = ApiKeyInput; //# sourceMappingURL=api-key-input.js.map