@kya-os/cli 0.1.0-beta.1 → 0.1.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +210 -34
  2. package/dist/commands/check.d.ts.map +1 -1
  3. package/dist/commands/check.js +73 -57
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/claim.js +33 -39
  6. package/dist/commands/claim.js.map +1 -1
  7. package/dist/commands/cli-experience-demo-simple.d.ts +14 -0
  8. package/dist/commands/cli-experience-demo-simple.d.ts.map +1 -0
  9. package/dist/commands/cli-experience-demo-simple.js +119 -0
  10. package/dist/commands/cli-experience-demo-simple.js.map +1 -0
  11. package/dist/commands/cli-experience-demo.d.ts +14 -0
  12. package/dist/commands/cli-experience-demo.d.ts.map +1 -0
  13. package/dist/commands/cli-experience-demo.js +172 -0
  14. package/dist/commands/cli-experience-demo.js.map +1 -0
  15. package/dist/commands/effects-demo.d.ts +10 -0
  16. package/dist/commands/effects-demo.d.ts.map +1 -0
  17. package/dist/commands/effects-demo.js +292 -0
  18. package/dist/commands/effects-demo.js.map +1 -0
  19. package/dist/commands/env.d.ts.map +1 -1
  20. package/dist/commands/env.js +55 -51
  21. package/dist/commands/env.js.map +1 -1
  22. package/dist/commands/init.d.ts +1 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +527 -102
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/rotate.d.ts.map +1 -1
  27. package/dist/commands/rotate.js +81 -60
  28. package/dist/commands/rotate.js.map +1 -1
  29. package/dist/dev.d.ts +7 -0
  30. package/dist/dev.d.ts.map +1 -0
  31. package/dist/dev.js +9 -0
  32. package/dist/dev.js.map +1 -0
  33. package/dist/effects/__tests__/effects.test.d.ts +5 -0
  34. package/dist/effects/__tests__/effects.test.d.ts.map +1 -0
  35. package/dist/effects/__tests__/effects.test.js +206 -0
  36. package/dist/effects/__tests__/effects.test.js.map +1 -0
  37. package/dist/effects/animation-engine.d.ts +173 -0
  38. package/dist/effects/animation-engine.d.ts.map +1 -0
  39. package/dist/effects/animation-engine.js +254 -0
  40. package/dist/effects/animation-engine.js.map +1 -0
  41. package/dist/effects/cli-integration.d.ts +86 -0
  42. package/dist/effects/cli-integration.d.ts.map +1 -0
  43. package/dist/effects/cli-integration.js +309 -0
  44. package/dist/effects/cli-integration.js.map +1 -0
  45. package/dist/effects/config.d.ts +95 -0
  46. package/dist/effects/config.d.ts.map +1 -0
  47. package/dist/effects/config.js +216 -0
  48. package/dist/effects/config.js.map +1 -0
  49. package/dist/effects/effect-runner.d.ts +69 -0
  50. package/dist/effects/effect-runner.d.ts.map +1 -0
  51. package/dist/effects/effect-runner.js +255 -0
  52. package/dist/effects/effect-runner.js.map +1 -0
  53. package/dist/effects/gradient.d.ts +131 -0
  54. package/dist/effects/gradient.d.ts.map +1 -0
  55. package/dist/effects/gradient.js +236 -0
  56. package/dist/effects/gradient.js.map +1 -0
  57. package/dist/effects/implementations/beams.d.ts +80 -0
  58. package/dist/effects/implementations/beams.d.ts.map +1 -0
  59. package/dist/effects/implementations/beams.js +221 -0
  60. package/dist/effects/implementations/beams.js.map +1 -0
  61. package/dist/effects/implementations/binary-path.d.ts +88 -0
  62. package/dist/effects/implementations/binary-path.d.ts.map +1 -0
  63. package/dist/effects/implementations/binary-path.js +296 -0
  64. package/dist/effects/implementations/binary-path.js.map +1 -0
  65. package/dist/effects/implementations/blackhole.d.ts +98 -0
  66. package/dist/effects/implementations/blackhole.d.ts.map +1 -0
  67. package/dist/effects/implementations/blackhole.js +394 -0
  68. package/dist/effects/implementations/blackhole.js.map +1 -0
  69. package/dist/effects/implementations/burn.d.ts +74 -0
  70. package/dist/effects/implementations/burn.d.ts.map +1 -0
  71. package/dist/effects/implementations/burn.js +234 -0
  72. package/dist/effects/implementations/burn.js.map +1 -0
  73. package/dist/effects/implementations/decrypt.d.ts +115 -0
  74. package/dist/effects/implementations/decrypt.d.ts.map +1 -0
  75. package/dist/effects/implementations/decrypt.js +394 -0
  76. package/dist/effects/implementations/decrypt.js.map +1 -0
  77. package/dist/effects/implementations/test.d.ts +113 -0
  78. package/dist/effects/implementations/test.d.ts.map +1 -0
  79. package/dist/effects/implementations/test.js +552 -0
  80. package/dist/effects/implementations/test.js.map +1 -0
  81. package/dist/effects/implementations/waves.d.ts +78 -0
  82. package/dist/effects/implementations/waves.d.ts.map +1 -0
  83. package/dist/effects/implementations/waves.js +278 -0
  84. package/dist/effects/implementations/waves.js.map +1 -0
  85. package/dist/effects/index.d.ts +37 -0
  86. package/dist/effects/index.d.ts.map +1 -0
  87. package/dist/effects/index.js +79 -0
  88. package/dist/effects/index.js.map +1 -0
  89. package/dist/effects/motion-engine.d.ts +168 -0
  90. package/dist/effects/motion-engine.d.ts.map +1 -0
  91. package/dist/effects/motion-engine.js +353 -0
  92. package/dist/effects/motion-engine.js.map +1 -0
  93. package/dist/effects/safe-executor.d.ts +55 -0
  94. package/dist/effects/safe-executor.d.ts.map +1 -0
  95. package/dist/effects/safe-executor.js +210 -0
  96. package/dist/effects/safe-executor.js.map +1 -0
  97. package/dist/effects/template/effect-template.d.ts +97 -0
  98. package/dist/effects/template/effect-template.d.ts.map +1 -0
  99. package/dist/effects/template/effect-template.js +208 -0
  100. package/dist/effects/template/effect-template.js.map +1 -0
  101. package/dist/effects/types.d.ts +199 -0
  102. package/dist/effects/types.d.ts.map +1 -0
  103. package/dist/effects/types.js +80 -0
  104. package/dist/effects/types.js.map +1 -0
  105. package/dist/effects/utils.d.ts +104 -0
  106. package/dist/effects/utils.d.ts.map +1 -0
  107. package/dist/effects/utils.js +280 -0
  108. package/dist/effects/utils.js.map +1 -0
  109. package/dist/index.d.ts +2 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +52 -51
  112. package/dist/index.js.map +1 -1
  113. package/dist/utils/env-manager.d.ts +66 -2
  114. package/dist/utils/env-manager.d.ts.map +1 -1
  115. package/dist/utils/env-manager.js +355 -65
  116. package/dist/utils/env-manager.js.map +1 -1
  117. package/dist/utils/platform-detector.js +15 -19
  118. package/dist/utils/platform-detector.js.map +1 -1
  119. package/dist/utils/prompts.js +21 -34
  120. package/dist/utils/prompts.js.map +1 -1
  121. package/package.json +10 -5
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Scene-Based Animation Engine for Terminal Effects
3
+ * Provides sophisticated animation capabilities with scenes, frames, and events
4
+ */
5
+ import { CharacterVisual, ColorPair, Color, EasingFunction } from "./types.js";
6
+ import { Gradient, GradientDirection } from "./gradient.js";
7
+ /**
8
+ * Single frame in an animation scene
9
+ */
10
+ export interface AnimationFrame {
11
+ /** Symbol to display */
12
+ symbol: string;
13
+ /** Frame duration in milliseconds */
14
+ duration: number;
15
+ /** Colors for this frame */
16
+ colors?: ColorPair;
17
+ /** Text effects (bold, italic, etc.) */
18
+ textEffects?: string[];
19
+ }
20
+ /**
21
+ * Sync metric for scene timing
22
+ */
23
+ export declare enum SyncMetric {
24
+ /** Sync to time */
25
+ TIME = "time",
26
+ /** Sync to motion distance */
27
+ DISTANCE = "distance",
28
+ /** Sync to motion steps */
29
+ STEP = "step"
30
+ }
31
+ /**
32
+ * Animation scene - a sequence of frames
33
+ */
34
+ export declare class Scene {
35
+ readonly id: string;
36
+ private frames;
37
+ private currentFrameIndex;
38
+ private frameStartTime;
39
+ private _isLooping;
40
+ private _isComplete;
41
+ /** Sync metric for timing */
42
+ syncMetric: SyncMetric;
43
+ /** Easing function for frame transitions */
44
+ easingFn?: EasingFunction;
45
+ constructor(id: string);
46
+ /**
47
+ * Add a frame to the scene
48
+ */
49
+ addFrame(symbol: string, duration: number, colors?: ColorPair): void;
50
+ /**
51
+ * Apply gradient to symbols across multiple frames
52
+ */
53
+ applyGradientToSymbols(symbol: string, duration: number, gradient: Gradient, _direction?: GradientDirection): void;
54
+ /**
55
+ * Set looping behavior
56
+ */
57
+ setLooping(isLooping: boolean): void;
58
+ /**
59
+ * Get current frame based on elapsed time
60
+ */
61
+ getCurrentFrame(elapsedTime: number): AnimationFrame | null;
62
+ /**
63
+ * Reset the scene
64
+ */
65
+ reset(): void;
66
+ /**
67
+ * Check if scene is complete
68
+ */
69
+ isComplete(): boolean;
70
+ /**
71
+ * Get total duration of the scene
72
+ */
73
+ getTotalDuration(): number;
74
+ /**
75
+ * Get frame count
76
+ */
77
+ getFrameCount(): number;
78
+ /**
79
+ * Get current frame index
80
+ */
81
+ getCurrentFrameIndex(): number;
82
+ }
83
+ /**
84
+ * Event types for character animation
85
+ */
86
+ export declare enum AnimationEvent {
87
+ SCENE_COMPLETE = "scene_complete",
88
+ SCENE_ACTIVATED = "scene_activated",
89
+ FRAME_CHANGE = "frame_change"
90
+ }
91
+ /**
92
+ * Event handler for animation events
93
+ */
94
+ export interface AnimationEventHandler {
95
+ event: AnimationEvent;
96
+ sceneId?: string;
97
+ callback: () => void;
98
+ }
99
+ /**
100
+ * Character animation manager
101
+ */
102
+ export declare class CharacterAnimation {
103
+ private scenes;
104
+ private activeScene;
105
+ private sceneStartTime;
106
+ private eventHandlers;
107
+ /** Original character colors */
108
+ inputFgColor?: Color;
109
+ inputBgColor?: Color;
110
+ constructor(inputColors?: {
111
+ fg?: Color;
112
+ bg?: Color;
113
+ });
114
+ /**
115
+ * Create a new scene
116
+ */
117
+ newScene(sceneId: string): Scene;
118
+ /**
119
+ * Get a scene by ID
120
+ */
121
+ queryScene(sceneId: string): Scene | undefined;
122
+ /**
123
+ * Activate a scene
124
+ */
125
+ activateScene(scene: Scene): void;
126
+ /**
127
+ * Update animation and get current visual
128
+ */
129
+ update(): CharacterVisual | null;
130
+ /**
131
+ * Register an event handler
132
+ */
133
+ registerEvent(event: AnimationEvent, sceneId: string, callback: () => void): void;
134
+ /**
135
+ * Trigger an event
136
+ */
137
+ private triggerEvent;
138
+ /**
139
+ * Reset all scenes
140
+ */
141
+ reset(): void;
142
+ }
143
+ /**
144
+ * Enhanced character with animation capabilities
145
+ */
146
+ export declare class AnimatedCharacter {
147
+ readonly id: string;
148
+ readonly originalSymbol: string;
149
+ readonly animation: CharacterAnimation;
150
+ /** Current visual state */
151
+ visual: CharacterVisual;
152
+ /** Layer for z-ordering (higher = on top) */
153
+ layer: number;
154
+ /** Visibility flag */
155
+ isVisible: boolean;
156
+ constructor(id: string, symbol: string, inputColors?: {
157
+ fg?: Color;
158
+ bg?: Color;
159
+ });
160
+ /**
161
+ * Update character animation
162
+ */
163
+ update(): void;
164
+ /**
165
+ * Set character layer
166
+ */
167
+ setLayer(layer: number): void;
168
+ /**
169
+ * Set visibility
170
+ */
171
+ setVisibility(isVisible: boolean): void;
172
+ }
173
+ //# sourceMappingURL=animation-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-engine.d.ts","sourceRoot":"","sources":["../../src/effects/animation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Scene-Based Animation Engine for Terminal Effects
3
+ * Provides sophisticated animation capabilities with scenes, frames, and events
4
+ */
5
+ /**
6
+ * Sync metric for scene timing
7
+ */
8
+ export var SyncMetric;
9
+ (function (SyncMetric) {
10
+ /** Sync to time */
11
+ SyncMetric["TIME"] = "time";
12
+ /** Sync to motion distance */
13
+ SyncMetric["DISTANCE"] = "distance";
14
+ /** Sync to motion steps */
15
+ SyncMetric["STEP"] = "step";
16
+ })(SyncMetric || (SyncMetric = {}));
17
+ /**
18
+ * Animation scene - a sequence of frames
19
+ */
20
+ export class Scene {
21
+ constructor(id) {
22
+ this.frames = [];
23
+ // @ts-ignore - Used internally
24
+ this.currentFrameIndex = 0;
25
+ // @ts-ignore - Used internally
26
+ this.frameStartTime = 0;
27
+ this._isLooping = false;
28
+ this._isComplete = false;
29
+ /** Sync metric for timing */
30
+ this.syncMetric = SyncMetric.TIME;
31
+ this.id = id;
32
+ }
33
+ /**
34
+ * Add a frame to the scene
35
+ */
36
+ addFrame(symbol, duration, colors) {
37
+ this.frames.push({ symbol, duration, colors });
38
+ }
39
+ /**
40
+ * Apply gradient to symbols across multiple frames
41
+ */
42
+ applyGradientToSymbols(symbol, duration, gradient, _direction) {
43
+ const spectrum = gradient.getSpectrum();
44
+ const frameDuration = Math.floor(duration / spectrum.length);
45
+ for (const color of spectrum) {
46
+ this.addFrame(symbol, frameDuration, { fg: color, bg: null });
47
+ }
48
+ }
49
+ /**
50
+ * Set looping behavior
51
+ */
52
+ setLooping(isLooping) {
53
+ this._isLooping = isLooping;
54
+ }
55
+ /**
56
+ * Get current frame based on elapsed time
57
+ */
58
+ getCurrentFrame(elapsedTime) {
59
+ if (this.frames.length === 0)
60
+ return null;
61
+ if (this._isComplete && !this._isLooping) {
62
+ return this.frames[this.frames.length - 1];
63
+ }
64
+ let totalDuration = 0;
65
+ let targetTime = elapsedTime;
66
+ // Handle looping
67
+ if (this._isLooping) {
68
+ const sceneDuration = this.frames.reduce((sum, frame) => sum + frame.duration, 0);
69
+ targetTime = elapsedTime % sceneDuration;
70
+ }
71
+ // Find the current frame
72
+ for (let i = 0; i < this.frames.length; i++) {
73
+ totalDuration += this.frames[i].duration;
74
+ if (targetTime < totalDuration) {
75
+ this.currentFrameIndex = i;
76
+ return this.frames[i];
77
+ }
78
+ }
79
+ // Scene complete
80
+ this._isComplete = true;
81
+ if (this._isLooping) {
82
+ this.currentFrameIndex = 0;
83
+ this._isComplete = false;
84
+ return this.frames[0];
85
+ }
86
+ return this.frames[this.frames.length - 1];
87
+ }
88
+ /**
89
+ * Reset the scene
90
+ */
91
+ reset() {
92
+ this.currentFrameIndex = 0;
93
+ this.frameStartTime = 0;
94
+ this._isComplete = false;
95
+ }
96
+ /**
97
+ * Check if scene is complete
98
+ */
99
+ isComplete() {
100
+ return this._isComplete && !this._isLooping;
101
+ }
102
+ /**
103
+ * Get total duration of the scene
104
+ */
105
+ getTotalDuration() {
106
+ return this.frames.reduce((sum, frame) => sum + frame.duration, 0);
107
+ }
108
+ /**
109
+ * Get frame count
110
+ */
111
+ getFrameCount() {
112
+ return this.frames.length;
113
+ }
114
+ /**
115
+ * Get current frame index
116
+ */
117
+ getCurrentFrameIndex() {
118
+ return this.currentFrameIndex;
119
+ }
120
+ }
121
+ /**
122
+ * Event types for character animation
123
+ */
124
+ export var AnimationEvent;
125
+ (function (AnimationEvent) {
126
+ AnimationEvent["SCENE_COMPLETE"] = "scene_complete";
127
+ AnimationEvent["SCENE_ACTIVATED"] = "scene_activated";
128
+ AnimationEvent["FRAME_CHANGE"] = "frame_change";
129
+ })(AnimationEvent || (AnimationEvent = {}));
130
+ /**
131
+ * Character animation manager
132
+ */
133
+ export class CharacterAnimation {
134
+ constructor(inputColors) {
135
+ this.scenes = new Map();
136
+ this.activeScene = null;
137
+ this.sceneStartTime = 0;
138
+ this.eventHandlers = [];
139
+ this.inputFgColor = inputColors?.fg;
140
+ this.inputBgColor = inputColors?.bg;
141
+ }
142
+ /**
143
+ * Create a new scene
144
+ */
145
+ newScene(sceneId) {
146
+ const scene = new Scene(sceneId);
147
+ this.scenes.set(sceneId, scene);
148
+ return scene;
149
+ }
150
+ /**
151
+ * Get a scene by ID
152
+ */
153
+ queryScene(sceneId) {
154
+ return this.scenes.get(sceneId);
155
+ }
156
+ /**
157
+ * Activate a scene
158
+ */
159
+ activateScene(scene) {
160
+ if (this.activeScene && this.activeScene !== scene) {
161
+ this.triggerEvent(AnimationEvent.SCENE_COMPLETE, this.activeScene.id);
162
+ }
163
+ this.activeScene = scene;
164
+ this.sceneStartTime = Date.now();
165
+ scene.reset();
166
+ this.triggerEvent(AnimationEvent.SCENE_ACTIVATED, scene.id);
167
+ }
168
+ /**
169
+ * Update animation and get current visual
170
+ */
171
+ update() {
172
+ if (!this.activeScene)
173
+ return null;
174
+ const elapsedTime = Date.now() - this.sceneStartTime;
175
+ const frame = this.activeScene.getCurrentFrame(elapsedTime);
176
+ if (!frame)
177
+ return null;
178
+ // Check for scene completion
179
+ if (this.activeScene.isComplete()) {
180
+ this.triggerEvent(AnimationEvent.SCENE_COMPLETE, this.activeScene.id);
181
+ }
182
+ return {
183
+ symbol: frame.symbol,
184
+ colors: frame.colors || { fg: this.inputFgColor || null, bg: this.inputBgColor || null },
185
+ };
186
+ }
187
+ /**
188
+ * Register an event handler
189
+ */
190
+ registerEvent(event, sceneId, callback) {
191
+ this.eventHandlers.push({ event, sceneId, callback });
192
+ }
193
+ /**
194
+ * Trigger an event
195
+ */
196
+ triggerEvent(event, sceneId) {
197
+ for (const handler of this.eventHandlers) {
198
+ if (handler.event === event && handler.sceneId === sceneId) {
199
+ handler.callback();
200
+ }
201
+ }
202
+ }
203
+ /**
204
+ * Reset all scenes
205
+ */
206
+ reset() {
207
+ this.scenes.forEach(scene => scene.reset());
208
+ this.activeScene = null;
209
+ this.sceneStartTime = 0;
210
+ }
211
+ }
212
+ /**
213
+ * Enhanced character with animation capabilities
214
+ */
215
+ export class AnimatedCharacter {
216
+ constructor(id, symbol, inputColors) {
217
+ /** Layer for z-ordering (higher = on top) */
218
+ this.layer = 0;
219
+ /** Visibility flag */
220
+ this.isVisible = true;
221
+ this.id = id;
222
+ this.originalSymbol = symbol;
223
+ this.animation = new CharacterAnimation(inputColors);
224
+ this.visual = {
225
+ symbol,
226
+ colors: {
227
+ fg: inputColors?.fg || null,
228
+ bg: inputColors?.bg || null,
229
+ },
230
+ };
231
+ }
232
+ /**
233
+ * Update character animation
234
+ */
235
+ update() {
236
+ const newVisual = this.animation.update();
237
+ if (newVisual) {
238
+ this.visual = newVisual;
239
+ }
240
+ }
241
+ /**
242
+ * Set character layer
243
+ */
244
+ setLayer(layer) {
245
+ this.layer = layer;
246
+ }
247
+ /**
248
+ * Set visibility
249
+ */
250
+ setVisibility(isVisible) {
251
+ this.isVisible = isVisible;
252
+ }
253
+ }
254
+ //# sourceMappingURL=animation-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-engine.js","sourceRoot":"","sources":["../../src/effects/animation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * CLI Integration for Terminal Effects
3
+ * Provides hooks for various CLI operations to display effects
4
+ */
5
+ /**
6
+ * Effect triggers for different CLI operations
7
+ */
8
+ export declare enum EffectTrigger {
9
+ PRIVATE_KEY_DELETE = "private_key_delete",
10
+ PRIVATE_KEY_VIEW_EXIT = "private_key_view_exit",
11
+ KEY_ROTATION = "key_rotation",
12
+ AGENT_IDENTITY_CREATE = "agent_identity_create",
13
+ DID_GENERATION = "did_generation",
14
+ CREDENTIAL_ISSUANCE = "credential_issuance",
15
+ OPERATION_SUCCESS = "operation_success",
16
+ OPERATION_FAILURE = "operation_failure",
17
+ LOADING = "loading"
18
+ }
19
+ /**
20
+ * CLI Effects Manager
21
+ */
22
+ export declare class CLIEffects {
23
+ private runner;
24
+ private static instance?;
25
+ constructor();
26
+ /**
27
+ * Get singleton instance
28
+ */
29
+ static getInstance(): CLIEffects;
30
+ /**
31
+ * Show effect for a trigger
32
+ */
33
+ showEffect(trigger: EffectTrigger, text: string, options?: {
34
+ onComplete?: () => void;
35
+ onError?: (error: Error) => void;
36
+ customOptions?: any;
37
+ skipExitPrompt?: boolean;
38
+ persistent?: boolean;
39
+ }): Promise<void>;
40
+ /**
41
+ * Show custom effect
42
+ */
43
+ showCustomEffect(effectName: string, text: string, options?: {
44
+ config?: any;
45
+ onComplete?: () => void;
46
+ onError?: (error: Error) => void;
47
+ skipExitPrompt?: boolean;
48
+ persistent?: boolean;
49
+ }): Promise<void>;
50
+ /**
51
+ * Show loading effect with ability to stop
52
+ */
53
+ showLoadingEffect(text: string, promise: Promise<any>): Promise<any>;
54
+ /**
55
+ * Check if an effect is currently running
56
+ */
57
+ isEffectRunning(): boolean;
58
+ /**
59
+ * Stop any running effect
60
+ */
61
+ stopEffect(): Promise<void>;
62
+ }
63
+ /**
64
+ * Export singleton instance
65
+ */
66
+ export declare const cliEffects: CLIEffects;
67
+ /**
68
+ * Convenience functions for common operations
69
+ */
70
+ /**
71
+ * Show effect for private key deletion
72
+ */
73
+ export declare function showPrivateKeyDeleteEffect(keyName: string, skipExitPrompt?: boolean, persistent?: boolean): Promise<void>;
74
+ /**
75
+ * Show effect for agent identity creation
76
+ */
77
+ export declare function showAgentIdentityCreateEffect(agentName: string, skipExitPrompt?: boolean, persistent?: boolean): Promise<void>;
78
+ /**
79
+ * Show effect for DID generation
80
+ */
81
+ export declare function showDIDGenerationEffect(did: string, skipExitPrompt?: boolean, persistent?: boolean): Promise<void>;
82
+ /**
83
+ * Show loading effect for async operations
84
+ */
85
+ export declare function withLoadingEffect<T>(message: string, promise: Promise<T>): Promise<T>;
86
+ //# sourceMappingURL=cli-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-integration.d.ts","sourceRoot":"","sources":["../../src/effects/cli-integration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,oBAAY,aAAa;IAEvB,kBAAkB,uBAAuB;IACzC,qBAAqB,0BAA0B;IAC/C,YAAY,iBAAiB;IAG7B,qBAAqB,0BAA0B;IAC/C,cAAc,mBAAmB;IACjC,mBAAmB,wBAAwB;IAG3C,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,OAAO,YAAY;CACpB;AAgFD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAa;;IAMrC;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,UAAU;IAOhC;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;QACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,aAAa,CAAC,EAAE,GAAG,CAAC;QACpB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;IAkDhB;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;QACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACjC,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;IA2ChB;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA2D1E;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,YAA2B,CAAC;AAEnD;;GAEG;AAEH;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,OAAe,EAC/B,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,cAAc,GAAE,OAAe,EAC/B,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,OAAe,EAC/B,UAAU,GAAE,OAAc,GACzB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,CAAC,CAAC,CAEZ"}