UNPKG

@kya-os/cli

Version:

CLI for MCP-I setup and management

310 lines 9.47 kB
/** * CLI Integration for Terminal Effects * Provides hooks for various CLI operations to display effects */ import { EffectRunner } from "./effect-runner.js"; import { getEffect } from "./index.js"; import { getConfig } from "./config.js"; /** * Effect triggers for different CLI operations */ export var EffectTrigger; (function (EffectTrigger) { // Security operations EffectTrigger["PRIVATE_KEY_DELETE"] = "private_key_delete"; EffectTrigger["PRIVATE_KEY_VIEW_EXIT"] = "private_key_view_exit"; EffectTrigger["KEY_ROTATION"] = "key_rotation"; // Identity operations EffectTrigger["AGENT_IDENTITY_CREATE"] = "agent_identity_create"; EffectTrigger["DID_GENERATION"] = "did_generation"; EffectTrigger["CREDENTIAL_ISSUANCE"] = "credential_issuance"; // General operations EffectTrigger["OPERATION_SUCCESS"] = "operation_success"; EffectTrigger["OPERATION_FAILURE"] = "operation_failure"; EffectTrigger["LOADING"] = "loading"; })(EffectTrigger || (EffectTrigger = {})); /** * Effect configurations for triggers */ const TRIGGER_EFFECTS = { [EffectTrigger.PRIVATE_KEY_DELETE]: { effect: "burn", options: { duration: 2000, burnColors: ["ff0000", "ff4500", "ff8c00", "8B0000", "000000"], }, }, [EffectTrigger.PRIVATE_KEY_VIEW_EXIT]: { effect: "burn", options: { duration: 1500, burnColors: ["ffffff", "ffff00", "ff8c00", "8B0000", "000000"], }, }, [EffectTrigger.KEY_ROTATION]: { effect: "burn", options: { duration: 2500, burnColors: ["00ff00", "ffff00", "ff8c00", "8B0000", "000000"], }, }, [EffectTrigger.AGENT_IDENTITY_CREATE]: { effect: "blackhole", options: { duration: 3000, blackholeColors: ["004400", "006600", "008800", "00aa00", "00cc00"], finalColor: "00ff00", gravity: 0.3, explosionForce: 15, }, }, [EffectTrigger.DID_GENERATION]: { effect: "beams", options: { duration: 3000, beamColors: ["00ff00", "00ffff", "ffffff"], baseColor: "404040", }, }, [EffectTrigger.CREDENTIAL_ISSUANCE]: { effect: "beams", options: { duration: 2500, beamColors: ["0080ff", "00ffff", "ffffff"], }, }, [EffectTrigger.OPERATION_SUCCESS]: { effect: "beams", options: { duration: 1500, beamColors: ["00ff00", "00ff00", "00ff00"], beamCount: 3, }, }, [EffectTrigger.OPERATION_FAILURE]: { effect: "burn", options: { duration: 1000, burnColors: ["ff0000", "ff0000", "8B0000"], }, }, [EffectTrigger.LOADING]: { effect: "waves", options: { duration: 5000, waveColors: ["008800", "00aa00", "00cc00", "00ff00"], waveCount: 3, waveSpeed: 0.5, }, }, }; /** * CLI Effects Manager */ export class CLIEffects { constructor() { this.runner = new EffectRunner(); } /** * Get singleton instance */ static getInstance() { if (!CLIEffects.instance) { CLIEffects.instance = new CLIEffects(); } return CLIEffects.instance; } /** * Show effect for a trigger */ async showEffect(trigger, text, options) { const config = await getConfig(); // Skip if effects are disabled if (!config.enabled) { console.log(text); options?.onComplete?.(); return; } const triggerConfig = TRIGGER_EFFECTS[trigger]; if (!triggerConfig) { console.log(text); options?.onComplete?.(); return; } const effect = await getEffect(triggerConfig.effect); if (!effect) { console.log(text); options?.onComplete?.(); return; } try { await this.runner.run({ effect, text, config: { ...triggerConfig.options, ...options?.customOptions }, onComplete: options?.onComplete, onError: (err) => { // Log the error for debugging but don't throw if (process.env.DEBUG) { console.error('Effect error:', err); } options?.onError?.(err); }, skipExitPrompt: options?.skipExitPrompt, persistent: options?.persistent, }); } catch (error) { // Fallback to plain text console.log(text); if (process.env.DEBUG) { console.error('Failed to run effect:', error); } options?.onError?.(error); } } /** * Show custom effect */ async showCustomEffect(effectName, text, options) { const config = await getConfig(); // Skip if effects are disabled if (!config.enabled) { console.log(text); options?.onComplete?.(); return; } const effect = await getEffect(effectName); if (!effect) { console.log(text); options?.onComplete?.(); return; } try { await this.runner.run({ effect, text, config: options?.config, onComplete: options?.onComplete, onError: (err) => { // Log the error for debugging but don't throw if (process.env.DEBUG) { console.error('Effect error:', err); } options?.onError?.(err); }, skipExitPrompt: options?.skipExitPrompt, persistent: options?.persistent, }); } catch (error) { // Fallback to plain text console.log(text); if (process.env.DEBUG) { console.error('Failed to run custom effect:', error); } options?.onError?.(error); } } /** * Show loading effect with ability to stop */ async showLoadingEffect(text, promise) { const config = await getConfig(); // Skip if effects are disabled if (!config.enabled) { console.log(text); return promise; } const effect = await getEffect("waves"); if (!effect) { console.log(text); return promise; } let completed = false; let result; let error; // Start loading effect this.runner .run({ effect, text, config: { duration: 30000, // 30 seconds max waveColors: ["008800", "00aa00", "00cc00", "00ff00"], waveCount: 3, waveSpeed: 0.5, }, onComplete: () => { completed = true; }, skipExitPrompt: true, }) .catch(() => { // Ignore effect errors - we'll still return the result }); try { // Wait for the actual operation result = await promise; } catch (err) { error = err; } // Stop the effect if still running if (!completed) { await this.runner.stop(); } // Re-throw error if any if (error) { throw error; } return result; } /** * Check if an effect is currently running */ isEffectRunning() { return this.runner.isEffectRunning(); } /** * Stop any running effect */ async stopEffect() { await this.runner.stop(); } } /** * Export singleton instance */ export const cliEffects = CLIEffects.getInstance(); /** * Convenience functions for common operations */ /** * Show effect for private key deletion */ export async function showPrivateKeyDeleteEffect(keyName, skipExitPrompt = false, persistent = false) { await cliEffects.showEffect(EffectTrigger.PRIVATE_KEY_DELETE, `🔥 Securely destroying private key: ${keyName}`, { skipExitPrompt, persistent }); } /** * Show effect for agent identity creation */ export async function showAgentIdentityCreateEffect(agentName, skipExitPrompt = false, persistent = false) { await cliEffects.showEffect(EffectTrigger.AGENT_IDENTITY_CREATE, `🤖 Initializing Agent Identity: ${agentName}\n` + `\n` + `Generating cryptographic identity...`, { skipExitPrompt, persistent }); } /** * Show effect for DID generation */ export async function showDIDGenerationEffect(did, skipExitPrompt = false, persistent = true // Default to persistent for DID display ) { await cliEffects.showEffect(EffectTrigger.DID_GENERATION, `🔐 Decentralized Identity Generated\n` + `\n` + `DID: ${did}`, { skipExitPrompt, persistent }); } /** * Show loading effect for async operations */ export async function withLoadingEffect(message, promise) { return cliEffects.showLoadingEffect(message, promise); } //# sourceMappingURL=cli-integration.js.map