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