@kya-os/cli
Version:
CLI for MCP-I setup and management
216 lines • 6.22 kB
JavaScript
/**
* 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