erosolar-cli 2.1.172 → 2.1.174

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 (172) hide show
  1. package/README.md +1 -1
  2. package/agents/erosolar-code.rules.json +2 -2
  3. package/agents/general.rules.json +21 -3
  4. package/dist/capabilities/statusCapability.js +2 -2
  5. package/dist/capabilities/statusCapability.js.map +1 -1
  6. package/dist/contracts/agent-schemas.json +5 -5
  7. package/dist/core/agent.d.ts +83 -24
  8. package/dist/core/agent.d.ts.map +1 -1
  9. package/dist/core/agent.js +499 -248
  10. package/dist/core/agent.js.map +1 -1
  11. package/dist/core/preferences.d.ts +1 -0
  12. package/dist/core/preferences.d.ts.map +1 -1
  13. package/dist/core/preferences.js +8 -1
  14. package/dist/core/preferences.js.map +1 -1
  15. package/dist/core/reliabilityPrompt.d.ts +9 -0
  16. package/dist/core/reliabilityPrompt.d.ts.map +1 -0
  17. package/dist/core/reliabilityPrompt.js +31 -0
  18. package/dist/core/reliabilityPrompt.js.map +1 -0
  19. package/dist/core/schemaValidator.js +3 -3
  20. package/dist/core/schemaValidator.js.map +1 -1
  21. package/dist/core/toolPreconditions.d.ts +0 -11
  22. package/dist/core/toolPreconditions.d.ts.map +1 -1
  23. package/dist/core/toolPreconditions.js +33 -164
  24. package/dist/core/toolPreconditions.js.map +1 -1
  25. package/dist/core/toolRuntime.d.ts.map +1 -1
  26. package/dist/core/toolRuntime.js +9 -114
  27. package/dist/core/toolRuntime.js.map +1 -1
  28. package/dist/core/updateChecker.d.ts +61 -1
  29. package/dist/core/updateChecker.d.ts.map +1 -1
  30. package/dist/core/updateChecker.js +147 -3
  31. package/dist/core/updateChecker.js.map +1 -1
  32. package/dist/headless/headlessApp.d.ts.map +1 -1
  33. package/dist/headless/headlessApp.js +0 -39
  34. package/dist/headless/headlessApp.js.map +1 -1
  35. package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
  36. package/dist/plugins/tools/nodeDefaults.js +0 -2
  37. package/dist/plugins/tools/nodeDefaults.js.map +1 -1
  38. package/dist/providers/openaiResponsesProvider.d.ts.map +1 -1
  39. package/dist/providers/openaiResponsesProvider.js +79 -74
  40. package/dist/providers/openaiResponsesProvider.js.map +1 -1
  41. package/dist/runtime/agentController.d.ts.map +1 -1
  42. package/dist/runtime/agentController.js +6 -3
  43. package/dist/runtime/agentController.js.map +1 -1
  44. package/dist/runtime/agentSession.d.ts +0 -2
  45. package/dist/runtime/agentSession.d.ts.map +1 -1
  46. package/dist/runtime/agentSession.js +2 -2
  47. package/dist/runtime/agentSession.js.map +1 -1
  48. package/dist/shell/interactiveShell.d.ts +11 -18
  49. package/dist/shell/interactiveShell.d.ts.map +1 -1
  50. package/dist/shell/interactiveShell.js +273 -291
  51. package/dist/shell/interactiveShell.js.map +1 -1
  52. package/dist/shell/shellApp.d.ts.map +1 -1
  53. package/dist/shell/shellApp.js +7 -1
  54. package/dist/shell/shellApp.js.map +1 -1
  55. package/dist/shell/systemPrompt.d.ts.map +1 -1
  56. package/dist/shell/systemPrompt.js +4 -15
  57. package/dist/shell/systemPrompt.js.map +1 -1
  58. package/dist/subagents/taskRunner.js +2 -1
  59. package/dist/subagents/taskRunner.js.map +1 -1
  60. package/dist/tools/bashTools.d.ts.map +1 -1
  61. package/dist/tools/bashTools.js +101 -8
  62. package/dist/tools/bashTools.js.map +1 -1
  63. package/dist/tools/diffUtils.d.ts +8 -2
  64. package/dist/tools/diffUtils.d.ts.map +1 -1
  65. package/dist/tools/diffUtils.js +72 -13
  66. package/dist/tools/diffUtils.js.map +1 -1
  67. package/dist/tools/grepTools.d.ts.map +1 -1
  68. package/dist/tools/grepTools.js +10 -2
  69. package/dist/tools/grepTools.js.map +1 -1
  70. package/dist/tools/planningTools.d.ts +0 -10
  71. package/dist/tools/planningTools.d.ts.map +1 -1
  72. package/dist/tools/planningTools.js +0 -16
  73. package/dist/tools/planningTools.js.map +1 -1
  74. package/dist/tools/searchTools.d.ts.map +1 -1
  75. package/dist/tools/searchTools.js +4 -2
  76. package/dist/tools/searchTools.js.map +1 -1
  77. package/dist/ui/PromptController.d.ts +1 -4
  78. package/dist/ui/PromptController.d.ts.map +1 -1
  79. package/dist/ui/PromptController.js +1 -7
  80. package/dist/ui/PromptController.js.map +1 -1
  81. package/dist/ui/ShellUIAdapter.d.ts +292 -28
  82. package/dist/ui/ShellUIAdapter.d.ts.map +1 -1
  83. package/dist/ui/ShellUIAdapter.js +1513 -121
  84. package/dist/ui/ShellUIAdapter.js.map +1 -1
  85. package/dist/ui/UnifiedUIController.d.ts +81 -0
  86. package/dist/ui/UnifiedUIController.d.ts.map +1 -0
  87. package/dist/ui/UnifiedUIController.js +212 -0
  88. package/dist/ui/UnifiedUIController.js.map +1 -0
  89. package/dist/ui/UnifiedUIRenderer.d.ts +133 -30
  90. package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -1
  91. package/dist/ui/UnifiedUIRenderer.js +939 -370
  92. package/dist/ui/UnifiedUIRenderer.js.map +1 -1
  93. package/dist/ui/animatedStatus.d.ts +128 -6
  94. package/dist/ui/animatedStatus.d.ts.map +1 -1
  95. package/dist/ui/animatedStatus.js +383 -50
  96. package/dist/ui/animatedStatus.js.map +1 -1
  97. package/dist/ui/animation/AnimationScheduler.d.ts +192 -0
  98. package/dist/ui/animation/AnimationScheduler.d.ts.map +1 -0
  99. package/dist/ui/animation/AnimationScheduler.js +432 -0
  100. package/dist/ui/animation/AnimationScheduler.js.map +1 -0
  101. package/dist/ui/display.d.ts +182 -26
  102. package/dist/ui/display.d.ts.map +1 -1
  103. package/dist/ui/display.js +678 -97
  104. package/dist/ui/display.js.map +1 -1
  105. package/dist/ui/inPlaceUpdater.d.ts +181 -0
  106. package/dist/ui/inPlaceUpdater.d.ts.map +1 -0
  107. package/dist/ui/inPlaceUpdater.js +515 -0
  108. package/dist/ui/inPlaceUpdater.js.map +1 -0
  109. package/dist/ui/interrupts/InterruptManager.d.ts +142 -0
  110. package/dist/ui/interrupts/InterruptManager.d.ts.map +1 -0
  111. package/dist/ui/interrupts/InterruptManager.js +439 -0
  112. package/dist/ui/interrupts/InterruptManager.js.map +1 -0
  113. package/dist/ui/layout.d.ts +0 -1
  114. package/dist/ui/layout.d.ts.map +1 -1
  115. package/dist/ui/layout.js +0 -12
  116. package/dist/ui/layout.js.map +1 -1
  117. package/dist/ui/orchestration/UIUpdateCoordinator.d.ts +61 -7
  118. package/dist/ui/orchestration/UIUpdateCoordinator.d.ts.map +1 -1
  119. package/dist/ui/orchestration/UIUpdateCoordinator.js +232 -20
  120. package/dist/ui/orchestration/UIUpdateCoordinator.js.map +1 -1
  121. package/dist/ui/shortcutsHelp.d.ts.map +1 -1
  122. package/dist/ui/shortcutsHelp.js +0 -1
  123. package/dist/ui/shortcutsHelp.js.map +1 -1
  124. package/dist/ui/telemetry/ResponseTracker.d.ts +22 -0
  125. package/dist/ui/telemetry/ResponseTracker.d.ts.map +1 -0
  126. package/dist/ui/telemetry/ResponseTracker.js +60 -0
  127. package/dist/ui/telemetry/ResponseTracker.js.map +1 -0
  128. package/dist/ui/telemetry/UITelemetry.d.ts +181 -0
  129. package/dist/ui/telemetry/UITelemetry.d.ts.map +1 -0
  130. package/dist/ui/telemetry/UITelemetry.js +446 -0
  131. package/dist/ui/telemetry/UITelemetry.js.map +1 -0
  132. package/dist/ui/unified/index.d.ts +30 -1
  133. package/dist/ui/unified/index.d.ts.map +1 -1
  134. package/dist/ui/unified/index.js +45 -2
  135. package/dist/ui/unified/index.js.map +1 -1
  136. package/dist/ui/unified/layout.d.ts +12 -0
  137. package/dist/ui/unified/layout.d.ts.map +1 -0
  138. package/dist/ui/unified/layout.js +96 -0
  139. package/dist/ui/unified/layout.js.map +1 -0
  140. package/package.json +2 -3
  141. package/dist/StringUtils.d.ts +0 -8
  142. package/dist/StringUtils.d.ts.map +0 -1
  143. package/dist/StringUtils.js +0 -11
  144. package/dist/StringUtils.js.map +0 -1
  145. package/dist/core/aiFlowSupervisor.d.ts +0 -44
  146. package/dist/core/aiFlowSupervisor.d.ts.map +0 -1
  147. package/dist/core/aiFlowSupervisor.js +0 -299
  148. package/dist/core/aiFlowSupervisor.js.map +0 -1
  149. package/dist/core/cliTestHarness.d.ts +0 -200
  150. package/dist/core/cliTestHarness.d.ts.map +0 -1
  151. package/dist/core/cliTestHarness.js +0 -549
  152. package/dist/core/cliTestHarness.js.map +0 -1
  153. package/dist/core/testUtils.d.ts +0 -121
  154. package/dist/core/testUtils.d.ts.map +0 -1
  155. package/dist/core/testUtils.js +0 -235
  156. package/dist/core/testUtils.js.map +0 -1
  157. package/dist/core/toolValidation.d.ts +0 -116
  158. package/dist/core/toolValidation.d.ts.map +0 -1
  159. package/dist/core/toolValidation.js +0 -282
  160. package/dist/core/toolValidation.js.map +0 -1
  161. package/dist/ui/planOverlay.d.ts +0 -28
  162. package/dist/ui/planOverlay.d.ts.map +0 -1
  163. package/dist/ui/planOverlay.js +0 -156
  164. package/dist/ui/planOverlay.js.map +0 -1
  165. package/dist/ui/streamingFormatter.d.ts +0 -30
  166. package/dist/ui/streamingFormatter.d.ts.map +0 -1
  167. package/dist/ui/streamingFormatter.js +0 -91
  168. package/dist/ui/streamingFormatter.js.map +0 -1
  169. package/dist/utils/errorUtils.d.ts +0 -16
  170. package/dist/utils/errorUtils.d.ts.map +0 -1
  171. package/dist/utils/errorUtils.js +0 -66
  172. package/dist/utils/errorUtils.js.map +0 -1
@@ -0,0 +1,432 @@
1
+ /**
2
+ * AnimationScheduler - Coordinates animations, spinners, progress bars, and elapsed time
3
+ * Provides frame-based animation updates and smooth transitions
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { performance } from 'perf_hooks';
7
+ export class AnimationScheduler extends EventEmitter {
8
+ animations = new Map();
9
+ animationLoop = null;
10
+ targetFPS = 30;
11
+ lastFrameTime = 0;
12
+ frameInterval;
13
+ isRunning = false;
14
+ // Predefined easing functions
15
+ static Easing = {
16
+ linear: (t) => t,
17
+ easeInQuad: (t) => t * t,
18
+ easeOutQuad: (t) => t * (2 - t),
19
+ easeInOutQuad: (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),
20
+ easeInCubic: (t) => t * t * t,
21
+ easeOutCubic: (t) => --t * t * t + 1,
22
+ easeInOutCubic: (t) => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,
23
+ easeOutElastic: (t) => {
24
+ const p = 0.3;
25
+ return Math.pow(2, -10 * t) * Math.sin((t - p / 4) * (2 * Math.PI) / p) + 1;
26
+ },
27
+ };
28
+ // Predefined spinner frames
29
+ static SpinnerFrames = {
30
+ dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
31
+ dots2: ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'],
32
+ dots3: ['⠋', '⠙', '⠚', '⠞', '⠖', '⠦', '⠴', '⠲', '⠳', '⠓'],
33
+ line: ['-', '\\', '|', '/'],
34
+ pipe: ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'],
35
+ simpleDots: ['. ', '.. ', '...', ' '],
36
+ simpleDotsScrolling: ['. ', '.. ', '...', ' ..', ' .', ' '],
37
+ star: ['✶', '✸', '✹', '✺', '✹', '✷'],
38
+ hamburger: ['☱', '☲', '☴'],
39
+ growVertical: ['▁', '▃', '▄', '▅', '▆', '▇', '▆', '▅', '▄', '▃'],
40
+ growHorizontal: ['▏', '▎', '▍', '▌', '▋', '▊', '▉', '▊', '▋', '▌', '▍', '▎'],
41
+ balloon: [' ', '.', 'o', 'O', '@', '*', ' '],
42
+ noise: ['▓', '▒', '░'],
43
+ bounce: ['⠁', '⠂', '⠄', '⠂'],
44
+ boxBounce: ['▖', '▘', '▝', '▗'],
45
+ circle: ['◜', '◠', '◝', '◞', '◡', '◟'],
46
+ arc: ['◜', '◠', '◝', '◞', '◡', '◟'],
47
+ arrow: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'],
48
+ bouncingBar: [
49
+ '[ ]',
50
+ '[= ]',
51
+ '[== ]',
52
+ '[=== ]',
53
+ '[ ===]',
54
+ '[ ==]',
55
+ '[ =]',
56
+ '[ ]',
57
+ '[ =]',
58
+ '[ ==]',
59
+ '[ ===]',
60
+ '[====]',
61
+ '[=== ]',
62
+ '[== ]',
63
+ '[= ]',
64
+ ],
65
+ };
66
+ constructor(targetFPS = 30) {
67
+ super();
68
+ this.targetFPS = targetFPS;
69
+ this.frameInterval = 1000 / targetFPS;
70
+ }
71
+ /**
72
+ * Create and register a spinner animation
73
+ */
74
+ createSpinner(id, message, frames = AnimationScheduler.SpinnerFrames.dots) {
75
+ const animation = {
76
+ id,
77
+ type: 'spinner',
78
+ startTime: performance.now(),
79
+ fps: 10, // Spinners typically run at 10 FPS
80
+ frameCount: frames.length,
81
+ currentFrame: 0,
82
+ data: {
83
+ frames,
84
+ message,
85
+ },
86
+ };
87
+ this.register(animation);
88
+ return animation;
89
+ }
90
+ /**
91
+ * Create and register a progress animation
92
+ */
93
+ createProgress(id, current, total, duration = 500) {
94
+ const animation = {
95
+ id,
96
+ type: 'progress',
97
+ startTime: performance.now(),
98
+ duration,
99
+ fps: 60, // Smooth progress animations at 60 FPS
100
+ frameCount: Math.ceil((duration / 1000) * 60),
101
+ currentFrame: 0,
102
+ data: {
103
+ current,
104
+ target: current,
105
+ total,
106
+ },
107
+ easing: AnimationScheduler.Easing.easeOutQuad,
108
+ };
109
+ this.register(animation);
110
+ return animation;
111
+ }
112
+ /**
113
+ * Update progress animation target
114
+ */
115
+ updateProgress(id, newTarget) {
116
+ const animation = this.animations.get(id);
117
+ if (!animation || animation.type !== 'progress')
118
+ return;
119
+ animation.data.current = this.getCurrentProgressValue(animation);
120
+ animation.data.target = newTarget;
121
+ animation.startTime = performance.now();
122
+ animation.currentFrame = 0;
123
+ }
124
+ /**
125
+ * Create and register an elapsed time animation
126
+ */
127
+ createElapsed(id, startTime = Date.now()) {
128
+ const animation = {
129
+ id,
130
+ type: 'elapsed',
131
+ startTime: performance.now(),
132
+ fps: 1, // Update once per second
133
+ frameCount: Infinity,
134
+ currentFrame: 0,
135
+ data: {
136
+ startTime,
137
+ format: this.formatElapsedTime,
138
+ },
139
+ };
140
+ this.register(animation);
141
+ return animation;
142
+ }
143
+ /**
144
+ * Create and register a transition animation
145
+ */
146
+ createTransition(id, from, to, property, duration = 300, easing) {
147
+ const animation = {
148
+ id,
149
+ type: 'transition',
150
+ startTime: performance.now(),
151
+ duration,
152
+ fps: 60,
153
+ frameCount: Math.ceil((duration / 1000) * 60),
154
+ currentFrame: 0,
155
+ data: {
156
+ from,
157
+ to,
158
+ property,
159
+ },
160
+ easing: easing || AnimationScheduler.Easing.easeInOutQuad,
161
+ };
162
+ this.register(animation);
163
+ return animation;
164
+ }
165
+ /**
166
+ * Register an animation
167
+ */
168
+ register(animation) {
169
+ this.animations.set(animation.id, animation);
170
+ // Start the animation loop if not running
171
+ if (!this.isRunning && this.animations.size > 0) {
172
+ this.start();
173
+ }
174
+ this.emit('animation:registered', animation);
175
+ }
176
+ /**
177
+ * Unregister an animation
178
+ */
179
+ unregister(id) {
180
+ const animation = this.animations.get(id);
181
+ if (animation) {
182
+ this.animations.delete(id);
183
+ this.emit('animation:unregistered', animation);
184
+ // Stop the loop if no animations remain
185
+ if (this.animations.size === 0) {
186
+ this.stop();
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Start the animation loop
192
+ */
193
+ start() {
194
+ if (this.isRunning)
195
+ return;
196
+ this.isRunning = true;
197
+ this.lastFrameTime = performance.now();
198
+ this.animationLoop = setInterval(() => this.tick(), this.frameInterval);
199
+ this.emit('scheduler:start');
200
+ }
201
+ /**
202
+ * Stop the animation loop
203
+ */
204
+ stop() {
205
+ if (!this.isRunning)
206
+ return;
207
+ if (this.animationLoop) {
208
+ clearInterval(this.animationLoop);
209
+ this.animationLoop = null;
210
+ }
211
+ this.isRunning = false;
212
+ this.emit('scheduler:stop');
213
+ }
214
+ /**
215
+ * Main animation tick
216
+ */
217
+ tick() {
218
+ const now = performance.now();
219
+ const deltaTime = now - this.lastFrameTime;
220
+ // Process each animation
221
+ for (const [, animation] of this.animations) {
222
+ // Check if animation should update based on its FPS
223
+ const animationInterval = 1000 / animation.fps;
224
+ const elapsedTime = now - animation.startTime;
225
+ const expectedFrame = Math.floor(elapsedTime / animationInterval);
226
+ if (expectedFrame > animation.currentFrame) {
227
+ animation.currentFrame = expectedFrame;
228
+ // Check if animation is complete
229
+ if (animation.duration &&
230
+ elapsedTime >= animation.duration &&
231
+ animation.frameCount !== Infinity) {
232
+ this.completeAnimation(animation);
233
+ continue;
234
+ }
235
+ // Update animation
236
+ this.updateAnimation(animation, elapsedTime);
237
+ // Call frame callback
238
+ if (animation.onFrame) {
239
+ animation.onFrame(animation);
240
+ }
241
+ this.emit('animation:frame', animation);
242
+ }
243
+ }
244
+ this.lastFrameTime = now;
245
+ this.emit('scheduler:tick', { deltaTime, animationCount: this.animations.size });
246
+ }
247
+ /**
248
+ * Update animation based on type
249
+ */
250
+ updateAnimation(animation, elapsedTime) {
251
+ switch (animation.type) {
252
+ case 'spinner':
253
+ this.updateSpinner(animation);
254
+ break;
255
+ case 'progress':
256
+ this.updateProgressAnimation(animation, elapsedTime);
257
+ break;
258
+ case 'elapsed':
259
+ this.updateElapsed(animation);
260
+ break;
261
+ case 'transition':
262
+ this.updateTransition(animation, elapsedTime);
263
+ break;
264
+ }
265
+ }
266
+ /**
267
+ * Update spinner animation
268
+ */
269
+ updateSpinner(animation) {
270
+ const frameIndex = animation.currentFrame % animation.data.frames.length;
271
+ this.emit('spinner:frame', {
272
+ id: animation.id,
273
+ frame: animation.data.frames[frameIndex],
274
+ message: animation.data.message,
275
+ });
276
+ }
277
+ /**
278
+ * Update progress animation
279
+ */
280
+ updateProgressAnimation(animation, elapsedTime) {
281
+ if (!animation.duration)
282
+ return;
283
+ const progress = Math.min(elapsedTime / animation.duration, 1);
284
+ const easedProgress = animation.easing ? animation.easing(progress) : progress;
285
+ const { current, target, total } = animation.data;
286
+ const newValue = current + (target - current) * easedProgress;
287
+ const percentage = Math.round((newValue / total) * 100);
288
+ this.emit('progress:update', {
289
+ id: animation.id,
290
+ value: newValue,
291
+ percentage,
292
+ total,
293
+ formatted: animation.data.format
294
+ ? animation.data.format(newValue, total)
295
+ : `${percentage}%`,
296
+ });
297
+ }
298
+ /**
299
+ * Update elapsed time animation
300
+ */
301
+ updateElapsed(animation) {
302
+ const elapsed = Date.now() - animation.data.startTime;
303
+ const formatted = animation.data.format
304
+ ? animation.data.format(elapsed)
305
+ : this.formatElapsedTime(elapsed);
306
+ this.emit('elapsed:update', {
307
+ id: animation.id,
308
+ elapsed,
309
+ formatted,
310
+ });
311
+ }
312
+ /**
313
+ * Update transition animation
314
+ */
315
+ updateTransition(animation, elapsedTime) {
316
+ if (!animation.duration)
317
+ return;
318
+ const progress = Math.min(elapsedTime / animation.duration, 1);
319
+ const easedProgress = animation.easing ? animation.easing(progress) : progress;
320
+ const { from, to } = animation.data;
321
+ let value;
322
+ if (typeof from === 'number' && typeof to === 'number') {
323
+ value = from + (to - from) * easedProgress;
324
+ }
325
+ else {
326
+ // For non-numeric values, switch at 50% progress
327
+ value = easedProgress < 0.5 ? from : to;
328
+ }
329
+ this.emit('transition:update', {
330
+ id: animation.id,
331
+ property: animation.data.property,
332
+ value,
333
+ progress: easedProgress,
334
+ });
335
+ }
336
+ /**
337
+ * Complete an animation
338
+ */
339
+ completeAnimation(animation) {
340
+ if (animation.onComplete) {
341
+ animation.onComplete(animation);
342
+ }
343
+ this.emit('animation:complete', animation);
344
+ this.unregister(animation.id);
345
+ }
346
+ /**
347
+ * Get current progress value with easing
348
+ */
349
+ getCurrentProgressValue(animation) {
350
+ const elapsedTime = performance.now() - animation.startTime;
351
+ if (!animation.duration)
352
+ return animation.data.target;
353
+ const progress = Math.min(elapsedTime / animation.duration, 1);
354
+ const easedProgress = animation.easing ? animation.easing(progress) : progress;
355
+ const { current, target } = animation.data;
356
+ return current + (target - current) * easedProgress;
357
+ }
358
+ /**
359
+ * Format elapsed time
360
+ */
361
+ formatElapsedTime(elapsedMs) {
362
+ const seconds = Math.floor(elapsedMs / 1000);
363
+ const minutes = Math.floor(seconds / 60);
364
+ const hours = Math.floor(minutes / 60);
365
+ if (hours > 0) {
366
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
367
+ }
368
+ else if (minutes > 0) {
369
+ return `${minutes}m ${seconds % 60}s`;
370
+ }
371
+ else {
372
+ return `${seconds}s`;
373
+ }
374
+ }
375
+ /**
376
+ * Get animation by ID
377
+ */
378
+ getAnimation(id) {
379
+ return this.animations.get(id);
380
+ }
381
+ /**
382
+ * Get all active animations
383
+ */
384
+ getActiveAnimations() {
385
+ return Array.from(this.animations.values());
386
+ }
387
+ /**
388
+ * Check if scheduler is running
389
+ */
390
+ isActive() {
391
+ return this.isRunning;
392
+ }
393
+ /**
394
+ * Get target FPS
395
+ */
396
+ getTargetFPS() {
397
+ return this.targetFPS;
398
+ }
399
+ /**
400
+ * Set target FPS
401
+ */
402
+ setTargetFPS(fps) {
403
+ this.targetFPS = fps;
404
+ this.frameInterval = 1000 / fps;
405
+ // Restart the loop with new interval if running
406
+ if (this.isRunning) {
407
+ this.stop();
408
+ this.start();
409
+ }
410
+ }
411
+ /**
412
+ * Clear all animations
413
+ */
414
+ clearAll() {
415
+ for (const animation of this.animations.values()) {
416
+ if (animation.onComplete) {
417
+ animation.onComplete(animation);
418
+ }
419
+ }
420
+ this.animations.clear();
421
+ this.stop();
422
+ this.emit('scheduler:cleared');
423
+ }
424
+ /**
425
+ * Dispose of the scheduler
426
+ */
427
+ dispose() {
428
+ this.clearAll();
429
+ this.removeAllListeners();
430
+ }
431
+ }
432
+ //# sourceMappingURL=AnimationScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationScheduler.js","sourceRoot":"","sources":["../../../src/ui/animation/AnimationScheduler.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
+ /**
2
+ * Display - Simplified UI facade that routes all output through UnifiedUIRenderer
3
+ *
4
+ * This class now serves as a compatibility layer, providing the same API
5
+ * but delegating all actual rendering to UnifiedUIRenderer.
6
+ */
1
7
  import type { ProviderUsage } from '../core/types.js';
2
- import { UnifiedUIRenderer, type RendererEventType } from './UnifiedUIRenderer.js';
8
+ import { UnifiedUIRenderer } from './UnifiedUIRenderer.js';
3
9
  type OutputStream = NodeJS.WritableStream & {
4
10
  columns?: number;
5
11
  rows?: number;
@@ -11,50 +17,200 @@ export interface DisplayMessageMetadata {
11
17
  usage?: ProviderUsage | null;
12
18
  contextWindowTokens?: number | null;
13
19
  wasStreamed?: boolean;
20
+ suppressDisplay?: boolean;
14
21
  }
22
+ interface StatusLineContextInfo {
23
+ percentage?: number;
24
+ tokens?: number;
25
+ sessionElapsedMs?: number;
26
+ }
27
+ type ActionStatus = 'pending' | 'success' | 'error' | 'info' | 'warning';
28
+ interface OutputInterceptor {
29
+ beforeWrite?: () => void;
30
+ afterWrite?: (content?: string) => void;
31
+ }
32
+ type CommandPaletteTone = 'info' | 'warn' | 'success' | 'muted';
33
+ interface CommandPaletteItem {
34
+ command: string;
35
+ description: string;
36
+ category?: string | null;
37
+ tone?: CommandPaletteTone;
38
+ }
39
+ /**
40
+ * Display class - now a thin wrapper around UnifiedUIRenderer
41
+ *
42
+ * Provides backward-compatible API while routing all output through the renderer.
43
+ */
15
44
  export declare class Display {
16
- private renderer;
17
45
  private readonly outputStream;
46
+ private readonly errorStream;
47
+ private renderer;
48
+ private readonly outputInterceptors;
18
49
  private inlinePanelHandler;
19
- private thinkingStart;
20
- private lastToolResult;
21
- private activeSpinner;
22
- constructor(stream?: OutputStream, _errorStream?: OutputStream);
50
+ constructor(stream?: OutputStream, errorStream?: OutputStream);
23
51
  setRenderer(renderer: UnifiedUIRenderer | null): void;
52
+ hasRenderer(): boolean;
24
53
  setInlinePanelHandler(handler: ((content: string) => boolean) | null): void;
25
- emit(type: RendererEventType, content: string, options?: {
26
- compact?: boolean;
27
- }): void;
54
+ private maybeHandleInlinePanel;
55
+ private enqueueEvent;
56
+ registerOutputInterceptor(interceptor: OutputInterceptor): () => void;
57
+ private notifyBeforeOutput;
58
+ private notifyAfterOutput;
59
+ /**
60
+ * Write raw content directly
61
+ */
62
+ writeRaw(content: string): void;
63
+ /**
64
+ * Stream chunk (for streaming responses)
65
+ */
28
66
  stream(chunk: string): void;
29
- parallelAgentStatus(content: string): void;
67
+ /**
68
+ * Backward-compatible alias
69
+ */
70
+ writeStreamChunk(chunk: string): void;
71
+ /**
72
+ * Get the output stream for direct access
73
+ */
74
+ getOutputStream(): OutputStream;
75
+ /**
76
+ * Show thinking indicator
77
+ * NO-OP: Don't emit events during SSE streaming.
78
+ * The animated spinner in the status line shows thinking state.
79
+ */
80
+ showThinking(_message?: string): void;
81
+ /**
82
+ * Update thinking indicator (status line only, not scrollback)
83
+ * This is called frequently during streaming to show progress snippets.
84
+ * The actual content will be rendered as a complete block later.
85
+ */
86
+ updateThinking(_message: string): void;
87
+ /**
88
+ * Stop thinking (no-op - renderer handles state)
89
+ */
90
+ stopThinking(_addNewLine?: boolean): void;
91
+ /**
92
+ * Show assistant message
93
+ */
30
94
  showAssistantMessage(content: string, metadata?: DisplayMessageMetadata): void;
31
- showNarrative(content: string): void;
95
+ /**
96
+ * Show narrative (thought)
97
+ * NO-OP: Don't emit events during SSE streaming.
98
+ * Narratives are buffered and rendered as part of the final response.
99
+ */
100
+ showNarrative(_content: string): void;
101
+ /**
102
+ * Show action
103
+ */
104
+ showAction(text: string, status?: ActionStatus): void;
105
+ /**
106
+ * Show sub-action
107
+ */
108
+ showSubAction(text: string, status?: ActionStatus): void;
109
+ /**
110
+ * Show message
111
+ */
112
+ showMessage(content: string, role?: 'assistant' | 'system'): void;
113
+ /**
114
+ * Show system message
115
+ */
32
116
  showSystemMessage(content: string): void;
33
- showError(message: string, error?: unknown): void;
34
- showWarning(message: string): void;
35
- showInfo(message: string): void;
36
- showSuccess(message: string): void;
117
+ /**
118
+ * Show test event (renders in unified UI "test" lane)
119
+ */
37
120
  showTestEvent(content: string): void;
38
- showThinking(message?: string): void;
39
- updateThinking(message: string): void;
40
- stopThinking(addNewline?: boolean): void;
41
- private clearActiveSpinner;
42
- isSpinnerActive(): boolean;
43
- getThinkingElapsedMs(): number | null;
121
+ /**
122
+ * Show an inline panel pinned below the prompt (overlay only, no scrollback).
123
+ */
44
124
  showInlinePanel(content: string | string[]): void;
45
125
  clearInlinePanel(): void;
126
+ /**
127
+ * Capture a single line of user input without logging it to scrollback.
128
+ * Uses the unified renderer when available, with a readline fallback.
129
+ */
46
130
  captureUserInput(options?: {
47
131
  allowEmpty?: boolean;
48
132
  trim?: boolean;
49
133
  resetBuffer?: boolean;
50
134
  }): Promise<string>;
51
- rememberToolResult(content: string, summary?: string): void;
52
- expandLastToolResult(): void;
53
- showStatusLine(status: string, elapsedMs?: number): void;
135
+ /**
136
+ * Show error
137
+ */
138
+ showError(message: string, error?: unknown): void;
139
+ /**
140
+ * Show warning
141
+ */
142
+ showWarning(message: string): void;
143
+ /**
144
+ * Show info
145
+ */
146
+ showInfo(message: string): void;
147
+ /**
148
+ * Show success
149
+ */
150
+ showSuccess(message: string): void;
151
+ /**
152
+ * Show progress badge
153
+ */
154
+ showProgressBadge(label: string, current: number, total: number): void;
155
+ /**
156
+ * Show status line
157
+ */
158
+ showStatusLine(status: string, elapsedMs?: number, _context?: StatusLineContextInfo): void;
159
+ /**
160
+ * Show command palette
161
+ */
162
+ showCommandPalette(commands: CommandPaletteItem[], options?: {
163
+ title?: string;
164
+ intro?: string;
165
+ }): void;
166
+ /**
167
+ * Show planning step
168
+ */
169
+ showPlanningStep(step: string, index: number, total: number): void;
170
+ /**
171
+ * Show thinking block
172
+ */
173
+ showThinkingBlock(content: string, durationMs?: number): void;
174
+ /**
175
+ * Clear screen
176
+ */
54
177
  clear(): void;
55
- registerOutputInterceptor(_interceptor: unknown): () => void;
56
- private maybeHandleInlinePanel;
178
+ /**
179
+ * Update streaming status (routes to renderer)
180
+ */
181
+ updateStreamingStatus(status: string | null): void;
182
+ /**
183
+ * Clear streaming status
184
+ */
185
+ clearStreamingStatus(): void;
186
+ /**
187
+ * Check if streaming status is visible
188
+ */
189
+ isStreamingStatusVisible(): boolean;
190
+ parallelAgentStatus(content: string): void;
191
+ private getColumnWidth;
192
+ private formatErrorDetails;
57
193
  private formatElapsed;
194
+ private buildChatBox;
195
+ private resolveMessageWidth;
196
+ private formatTelemetryLine;
197
+ private buildClaudeStyleThought;
198
+ private formatElapsedTime;
199
+ private buildCommandPalette;
200
+ private groupPaletteCommands;
201
+ private computeCommandColumnWidth;
202
+ private formatPaletteCategory;
203
+ private colorizePaletteText;
204
+ private wrapWithPrefix;
205
+ private buildWrappedSubActionLines;
206
+ private buildSubActionPrefixes;
207
+ private resolveStatusColor;
208
+ private formatActionIcon;
209
+ private wrapForRenderer;
210
+ private wrapLine;
211
+ private chunkWord;
212
+ private visibleLength;
213
+ private stripAnsi;
58
214
  }
59
215
  export declare const display: Display;
60
216
  export {};