UNPKG

@kya-os/cli

Version:

CLI for MCP-I setup and management

216 lines 6.22 kB
/** * Configuration management for terminal effects */ import { detectTerminalCapabilities } from "./utils.js"; import * as fs from "fs/promises"; import * as path from "path"; import { homedir } from "os"; /** * Default configuration */ const DEFAULT_CONFIG = { enabled: true, speedMultiplier: 1.0, performanceProfile: "medium", forceFallback: false, colorMode: "auto", accessibilityMode: false, showMetrics: false, effectSettings: {}, }; /** * Performance profiles */ const PERFORMANCE_PROFILES = { low: { maxExecutionTime: 1000, maxMemoryUsage: 25, }, medium: { maxExecutionTime: 3000, maxMemoryUsage: 50, }, high: { maxExecutionTime: 5000, maxMemoryUsage: 100, }, }; /** * Configuration manager for effects */ export class EffectsConfigManager { constructor(configPath) { this.config = { ...DEFAULT_CONFIG }; this.configPath = configPath || path.join(homedir(), ".kya-os", "effects.config.json"); } /** * Load configuration from file */ async load() { try { const configData = await fs.readFile(this.configPath, "utf-8"); const loadedConfig = JSON.parse(configData); this.config = { ...DEFAULT_CONFIG, ...loadedConfig }; } catch (error) { // Config file doesn't exist or is invalid, use defaults if (process.env.DEBUG) { console.log("No effects config found, using defaults"); } } } /** * Save configuration to file */ async save() { const configDir = path.dirname(this.configPath); await fs.mkdir(configDir, { recursive: true }); await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2)); } /** * Get current configuration */ getConfig() { return { ...this.config }; } /** * Update configuration */ async updateConfig(updates) { this.config = { ...this.config, ...updates }; await this.save(); } /** * Get safety configuration based on performance profile */ getSafetyConfig() { const profile = PERFORMANCE_PROFILES[this.config.performanceProfile] || PERFORMANCE_PROFILES.medium; return { ...profile, enableMonitoring: this.config.showMetrics, forceFallback: this.config.forceFallback || !this.shouldEnableEffects(), }; } /** * Determine if effects should be enabled */ shouldEnableEffects() { // Check explicit disable if (!this.config.enabled || process.env.KYA_EFFECTS_ENABLED === "false") { return false; } // Check CI/testing environments if (this.isCI() || this.isTesting()) { return false; } // Check terminal capabilities const capabilities = this.getTerminalCapabilities(); if (!capabilities.isInteractive) { return false; } // Check color support based on color mode if (this.config.colorMode === "none") { return true; // Effects without color } if (this.config.colorMode === "auto") { return capabilities.supportsColor; } // Check specific color mode support switch (this.config.colorMode) { case "16": return capabilities.supportsColor; case "256": return capabilities.supports256Color; case "truecolor": return capabilities.supportsTrueColor; default: return false; } } /** * Get terminal capabilities */ getTerminalCapabilities() { if (!this.terminalCapabilities) { this.terminalCapabilities = detectTerminalCapabilities(); } return this.terminalCapabilities; } /** * Check if running in CI environment */ isCI() { return !!(process.env.CI || process.env.CONTINUOUS_INTEGRATION || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.CIRCLECI || process.env.TRAVIS || process.env.JENKINS_URL); } /** * Check if running in testing environment */ isTesting() { return process.env.NODE_ENV === "test" || !!process.env.JEST_WORKER_ID; } /** * Apply environment variable overrides */ applyEnvironmentOverrides() { if (process.env.KYA_EFFECTS_ENABLED !== undefined) { this.config.enabled = process.env.KYA_EFFECTS_ENABLED !== "false"; } if (process.env.KYA_EFFECTS_SPEED) { const speed = parseFloat(process.env.KYA_EFFECTS_SPEED); if (!isNaN(speed) && speed > 0 && speed <= 10) { this.config.speedMultiplier = speed; } } if (process.env.KYA_EFFECTS_PROFILE) { const profile = process.env.KYA_EFFECTS_PROFILE; if (["low", "medium", "high"].includes(profile)) { this.config.performanceProfile = profile; } } if (process.env.KYA_EFFECTS_FALLBACK === "true") { this.config.forceFallback = true; } } /** * Get effect-specific configuration */ getEffectConfig(effectName) { return this.config.effectSettings[effectName] || {}; } /** * Set effect-specific configuration */ async setEffectConfig(effectName, config) { this.config.effectSettings[effectName] = config; await this.save(); } } /** * Global configuration instance */ export const effectsConfig = new EffectsConfigManager(); /** * Initialize configuration */ export async function initializeConfig() { await effectsConfig.load(); effectsConfig.applyEnvironmentOverrides(); } /** * Get current configuration */ export async function getConfig() { if (!effectsConfig.getConfig().enabled) { await initializeConfig(); } return effectsConfig.getConfig(); } //# sourceMappingURL=config.js.map