giga-code
Version:
A personal AI CLI assistant powered by Grok for local development.
210 lines • 9.08 kB
JavaScript
;
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 });
exports.loadApiKeys = exports.saveExaApiKey = exports.refreshGlobalSharedInfo = void 0;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const os = __importStar(require("os"));
function checkShellFiles() {
const homeDir = os.homedir();
const shellFiles = [
path.join(homeDir, '.bashrc'),
path.join(homeDir, '.zshrc'),
path.join(homeDir, '.bash_profile'),
path.join(homeDir, '.profile')
];
const keys = {};
const keyPatterns = {
xaiApiKey: /export\s+XAI_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
groqApiKey: /export\s+GROQ_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
anthropicApiKey: /export\s+(?:ANTHROPIC_API_KEY|CLAUDE_API_KEY)\s*=\s*['"]?([^'";\s]+)['"]?/,
openRouterApiKey: /export\s+OPENROUTER_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
googleApiKey: /export\s+GOOGLE_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
cerebrasApiKey: /export\s+CEREBRAS_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
exaApiKey: /export\s+EXA_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
openaiApiKey: /export\s+OPENAI_API_KEY\s*=\s*['"]?([^'";\s]+)['"]?/,
ollamaBaseUrl: /export\s+OLLAMA_BASE_URL\s*=\s*['"]?([^'";\s]+)['"]?/,
};
for (const file of shellFiles) {
try {
if (fs.existsSync(file)) {
const content = fs.readFileSync(file, 'utf8');
for (const [keyName, pattern] of Object.entries(keyPatterns)) {
if (!keys[keyName]) {
const match = content.match(pattern);
if (match && match[1]) {
keys[keyName] = match[1];
}
}
}
}
}
catch (error) {
// Ignore errors reading shell files
}
}
return keys;
}
function saveShellKeysToSettings(shellKeys) {
try {
const homeDir = os.homedir();
const settingsDir = path.join(homeDir, '.giga');
const settingsFile = path.join(settingsDir, 'user-settings.json');
// Load existing settings or create empty object
let settings = {};
if (fs.existsSync(settingsFile)) {
settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
}
// Only save shell keys that are not already in settings and are not empty
let hasChanges = false;
const keyMappings = {
xaiApiKey: 'xaiApiKey',
groqApiKey: 'groqApiKey',
anthropicApiKey: 'anthropicApiKey',
openRouterApiKey: 'openRouterApiKey',
googleApiKey: 'googleApiKey',
cerebrasApiKey: 'cerebrasApiKey',
exaApiKey: 'exaApiKey',
openaiApiKey: 'openaiApiKey',
ollamaBaseUrl: 'ollamaBaseUrl',
};
for (const [apiKeyName, settingsKeyName] of Object.entries(keyMappings)) {
const shellValue = shellKeys[apiKeyName];
if (shellValue && !settings[settingsKeyName]) {
settings[settingsKeyName] = shellValue;
hasChanges = true;
}
}
// Handle legacy apiKey field
if (shellKeys.xaiApiKey && !settings.apiKey && !settings.xaiApiKey) {
settings.apiKey = shellKeys.xaiApiKey;
hasChanges = true;
}
// Save settings file if there were changes
if (hasChanges) {
fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2));
// Refresh global shared info after changes
try {
const now = new Date();
fs.utimesSync(settingsFile, now, now);
}
catch (refreshError) {
// Silently ignore refresh errors
}
}
}
catch (error) {
// Silently ignore errors to avoid disrupting the application
}
}
function refreshGlobalSharedInfo() {
try {
const homeDir = os.homedir();
const settingsFile = path.join(homeDir, '.giga', 'user-settings.json');
// If user-settings.json exists, refresh global shared info
if (fs.existsSync(settingsFile)) {
// Trigger refresh by updating modification time
const now = new Date();
fs.utimesSync(settingsFile, now, now);
}
}
catch (error) {
// Silently ignore errors
}
}
exports.refreshGlobalSharedInfo = refreshGlobalSharedInfo;
function saveExaApiKey(apiKey) {
try {
const homeDir = os.homedir();
const settingsDir = path.join(homeDir, '.giga');
const settingsFile = path.join(settingsDir, 'user-settings.json');
let settings = {};
if (fs.existsSync(settingsFile)) {
settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
}
settings.exaApiKey = apiKey;
fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2));
refreshGlobalSharedInfo();
}
catch (error) {
// Silently ignore
}
}
exports.saveExaApiKey = saveExaApiKey;
function loadApiKeys() {
try {
const homeDir = os.homedir();
const settingsFile = path.join(homeDir, '.giga', 'user-settings.json');
// Start with environment variables
const envKeys = {
xaiApiKey: process.env.XAI_API_KEY,
groqApiKey: process.env.GROQ_API_KEY,
anthropicApiKey: process.env.ANTHROPIC_API_KEY || process.env.CLAUDE_API_KEY,
openRouterApiKey: process.env.OPENROUTER_API_KEY,
googleApiKey: process.env.GOOGLE_API_KEY,
cerebrasApiKey: process.env.CEREBRAS_API_KEY,
exaApiKey: process.env.EXA_API_KEY,
openaiApiKey: process.env.OPENAI_API_KEY,
ollamaBaseUrl: process.env.OLLAMA_BASE_URL,
};
// Check shell files for exported variables
const shellKeys = checkShellFiles();
// Save shell keys to settings if they're not already saved
saveShellKeysToSettings(shellKeys);
// Load settings file
let settingsKeys = {};
if (fs.existsSync(settingsFile)) {
const settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
settingsKeys = {
xaiApiKey: settings.apiKey || settings.xaiApiKey,
groqApiKey: settings.groqApiKey,
anthropicApiKey: settings.anthropicApiKey,
openRouterApiKey: settings.openRouterApiKey,
googleApiKey: settings.googleApiKey,
cerebrasApiKey: settings.cerebrasApiKey,
exaApiKey: settings.exaApiKey,
openaiApiKey: settings.openaiApiKey,
ollamaBaseUrl: settings.ollamaBaseUrl,
};
}
// Priority: env vars > shell files > settings file
return {
xaiApiKey: envKeys.xaiApiKey || shellKeys.xaiApiKey || settingsKeys.xaiApiKey,
groqApiKey: envKeys.groqApiKey || shellKeys.groqApiKey || settingsKeys.groqApiKey,
anthropicApiKey: envKeys.anthropicApiKey || shellKeys.anthropicApiKey || settingsKeys.anthropicApiKey,
openRouterApiKey: envKeys.openRouterApiKey || shellKeys.openRouterApiKey || settingsKeys.openRouterApiKey,
googleApiKey: envKeys.googleApiKey || shellKeys.googleApiKey || settingsKeys.googleApiKey,
cerebrasApiKey: envKeys.cerebrasApiKey || shellKeys.cerebrasApiKey || settingsKeys.cerebrasApiKey,
exaApiKey: envKeys.exaApiKey || shellKeys.exaApiKey || settingsKeys.exaApiKey,
openaiApiKey: envKeys.openaiApiKey || shellKeys.openaiApiKey || settingsKeys.openaiApiKey,
ollamaBaseUrl: envKeys.ollamaBaseUrl || shellKeys.ollamaBaseUrl || settingsKeys.ollamaBaseUrl || 'http://localhost:11434',
};
}
catch (error) {
return {};
}
}
exports.loadApiKeys = loadApiKeys;
//# sourceMappingURL=api-keys.js.map