@calliopelabs/cli 0.8.20 → 2.0.2
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.
- package/dist/agents/agent-config-loader.d.ts +60 -0
- package/dist/agents/agent-config-loader.d.ts.map +1 -0
- package/dist/agents/agent-config-loader.js +402 -0
- package/dist/agents/agent-config-loader.js.map +1 -0
- package/dist/agents/agent-config-presets.d.ts +10 -0
- package/dist/agents/agent-config-presets.d.ts.map +1 -0
- package/dist/agents/agent-config-presets.js +940 -0
- package/dist/agents/agent-config-presets.js.map +1 -0
- package/dist/agents/agent-config-types.d.ts +145 -0
- package/dist/agents/agent-config-types.d.ts.map +1 -0
- package/dist/agents/agent-config-types.js +12 -0
- package/dist/agents/agent-config-types.js.map +1 -0
- package/dist/{agterm → agents}/agent-detection.d.ts +1 -1
- package/dist/{agterm → agents}/agent-detection.d.ts.map +1 -1
- package/dist/{agterm → agents}/agent-detection.js +21 -5
- package/dist/agents/agent-detection.js.map +1 -0
- package/dist/agents/aggregator.d.ts +19 -0
- package/dist/agents/aggregator.d.ts.map +1 -0
- package/dist/agents/aggregator.js +141 -0
- package/dist/agents/aggregator.js.map +1 -0
- package/dist/{agterm → agents}/cli-backend.d.ts +1 -1
- package/dist/{agterm → agents}/cli-backend.d.ts.map +1 -1
- package/dist/{agterm → agents}/cli-backend.js +90 -12
- package/dist/agents/cli-backend.js.map +1 -0
- package/dist/agents/council-types.d.ts +113 -0
- package/dist/agents/council-types.d.ts.map +1 -0
- package/dist/agents/council-types.js +81 -0
- package/dist/agents/council-types.js.map +1 -0
- package/dist/agents/council.d.ts +107 -0
- package/dist/agents/council.d.ts.map +1 -0
- package/dist/agents/council.js +586 -0
- package/dist/agents/council.js.map +1 -0
- package/dist/agents/decomposer.d.ts +33 -0
- package/dist/agents/decomposer.d.ts.map +1 -0
- package/dist/agents/decomposer.js +138 -0
- package/dist/agents/decomposer.js.map +1 -0
- package/dist/agents/dynamic-tools.d.ts +52 -0
- package/dist/agents/dynamic-tools.d.ts.map +1 -0
- package/dist/agents/dynamic-tools.js +395 -0
- package/dist/agents/dynamic-tools.js.map +1 -0
- package/dist/agents/index.d.ts +29 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +29 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/installer.d.ts +39 -0
- package/dist/agents/installer.d.ts.map +1 -0
- package/dist/agents/installer.js +205 -0
- package/dist/agents/installer.js.map +1 -0
- package/dist/{agterm → agents}/orchestrator.d.ts +7 -2
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/{agterm → agents}/orchestrator.js +22 -2
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/sdk-backend.d.ts +63 -0
- package/dist/agents/sdk-backend.d.ts.map +1 -0
- package/dist/agents/sdk-backend.js +489 -0
- package/dist/agents/sdk-backend.js.map +1 -0
- package/dist/agents/swarm-types.d.ts +83 -0
- package/dist/agents/swarm-types.d.ts.map +1 -0
- package/dist/agents/swarm-types.js +20 -0
- package/dist/agents/swarm-types.js.map +1 -0
- package/dist/agents/swarm.d.ts +74 -0
- package/dist/agents/swarm.d.ts.map +1 -0
- package/dist/agents/swarm.js +307 -0
- package/dist/agents/swarm.js.map +1 -0
- package/dist/{agterm → agents}/tools.d.ts +7 -5
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +776 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/{agterm → agents}/types.d.ts +14 -2
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/{agterm → agents}/types.js +2 -2
- package/dist/agents/types.js.map +1 -0
- package/dist/api-server.d.ts +26 -0
- package/dist/api-server.d.ts.map +1 -0
- package/dist/api-server.js +230 -0
- package/dist/api-server.js.map +1 -0
- package/dist/auto-checkpoint.d.ts +35 -0
- package/dist/auto-checkpoint.d.ts.map +1 -0
- package/dist/auto-checkpoint.js +143 -0
- package/dist/auto-checkpoint.js.map +1 -0
- package/dist/auto-compressor.d.ts +44 -0
- package/dist/auto-compressor.d.ts.map +1 -0
- package/dist/auto-compressor.js +145 -0
- package/dist/auto-compressor.js.map +1 -0
- package/dist/background-jobs.d.ts +45 -0
- package/dist/background-jobs.d.ts.map +1 -0
- package/dist/background-jobs.js +122 -0
- package/dist/background-jobs.js.map +1 -0
- package/dist/bin.d.ts +6 -2
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +127 -24
- package/dist/bin.js.map +1 -1
- package/dist/checkpoint.d.ts +49 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +219 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/circuit-breaker/breaker.d.ts +80 -0
- package/dist/circuit-breaker/breaker.d.ts.map +1 -0
- package/dist/circuit-breaker/breaker.js +408 -0
- package/dist/circuit-breaker/breaker.js.map +1 -0
- package/dist/circuit-breaker/defaults.d.ts +8 -0
- package/dist/circuit-breaker/defaults.d.ts.map +1 -0
- package/dist/circuit-breaker/defaults.js +35 -0
- package/dist/circuit-breaker/defaults.js.map +1 -0
- package/dist/circuit-breaker/index.d.ts +9 -0
- package/dist/circuit-breaker/index.d.ts.map +1 -0
- package/dist/circuit-breaker/index.js +8 -0
- package/dist/circuit-breaker/index.js.map +1 -0
- package/dist/circuit-breaker/types.d.ts +77 -0
- package/dist/circuit-breaker/types.d.ts.map +1 -0
- package/dist/circuit-breaker/types.js +8 -0
- package/dist/circuit-breaker/types.js.map +1 -0
- package/dist/circuit-breaker.d.ts +8 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +7 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/cli/agent.d.ts +9 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +262 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/commands.d.ts +12 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/{cli.js → cli/commands.js} +285 -422
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +222 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +30 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +20 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/companions.d.ts +54 -0
- package/dist/companions.d.ts.map +1 -0
- package/dist/companions.js +440 -0
- package/dist/companions.js.map +1 -0
- package/dist/config.d.ts +23 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +95 -22
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +27 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +415 -10
- package/dist/diff.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +20 -11
- package/dist/errors.js.map +1 -1
- package/dist/git-status.d.ts +23 -0
- package/dist/git-status.d.ts.map +1 -0
- package/dist/git-status.js +92 -0
- package/dist/git-status.js.map +1 -0
- package/dist/headless.d.ts +25 -0
- package/dist/headless.d.ts.map +1 -0
- package/dist/headless.js +182 -0
- package/dist/headless.js.map +1 -0
- package/dist/hud/api.d.ts +35 -0
- package/dist/hud/api.d.ts.map +1 -0
- package/dist/hud/api.js +448 -0
- package/dist/hud/api.js.map +1 -0
- package/dist/hud/palettes.d.ts +9 -0
- package/dist/hud/palettes.d.ts.map +1 -0
- package/dist/hud/palettes.js +280 -0
- package/dist/hud/palettes.js.map +1 -0
- package/dist/hud/skins.d.ts +12 -0
- package/dist/hud/skins.d.ts.map +1 -0
- package/dist/hud/skins.js +365 -0
- package/dist/hud/skins.js.map +1 -0
- package/dist/hud/theme-packs/api.d.ts +51 -0
- package/dist/hud/theme-packs/api.d.ts.map +1 -0
- package/dist/hud/theme-packs/api.js +145 -0
- package/dist/hud/theme-packs/api.js.map +1 -0
- package/dist/hud/theme-packs/index.d.ts +18 -0
- package/dist/hud/theme-packs/index.d.ts.map +1 -0
- package/dist/hud/theme-packs/index.js +38 -0
- package/dist/hud/theme-packs/index.js.map +1 -0
- package/dist/hud/theme-packs/types.d.ts +29 -0
- package/dist/hud/theme-packs/types.d.ts.map +1 -0
- package/dist/hud/theme-packs/types.js +9 -0
- package/dist/hud/theme-packs/types.js.map +1 -0
- package/dist/hud/types.d.ts +182 -0
- package/dist/hud/types.d.ts.map +1 -0
- package/dist/hud/types.js +7 -0
- package/dist/hud/types.js.map +1 -0
- package/dist/idle-eviction.d.ts +34 -0
- package/dist/idle-eviction.d.ts.map +1 -0
- package/dist/idle-eviction.js +78 -0
- package/dist/idle-eviction.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/iteration-ledger.d.ts +105 -0
- package/dist/iteration-ledger.d.ts.map +1 -0
- package/dist/iteration-ledger.js +237 -0
- package/dist/iteration-ledger.js.map +1 -0
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +1 -27
- package/dist/markdown.js.map +1 -1
- package/dist/mcp.d.ts +35 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +291 -7
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +12 -2
- package/dist/memory.js.map +1 -1
- package/dist/model-detection.d.ts +5 -0
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +278 -10
- package/dist/model-detection.js.map +1 -1
- package/dist/model-router.d.ts.map +1 -1
- package/dist/model-router.js +33 -11
- package/dist/model-router.js.map +1 -1
- package/dist/plugins.d.ts +8 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +97 -6
- package/dist/plugins.js.map +1 -1
- package/dist/providers/anthropic.d.ts +10 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +221 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/bedrock.d.ts +17 -0
- package/dist/providers/bedrock.d.ts.map +1 -0
- package/dist/providers/bedrock.js +574 -0
- package/dist/providers/bedrock.js.map +1 -0
- package/dist/providers/compat.d.ts +13 -0
- package/dist/providers/compat.d.ts.map +1 -0
- package/dist/providers/compat.js +202 -0
- package/dist/providers/compat.js.map +1 -0
- package/dist/providers/google.d.ts +10 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +203 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +23 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +145 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +289 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +121 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +485 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +63 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +164 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/sandbox-native.d.ts +59 -0
- package/dist/sandbox-native.d.ts.map +1 -0
- package/dist/sandbox-native.js +292 -0
- package/dist/sandbox-native.js.map +1 -0
- package/dist/sandbox.d.ts +2 -2
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +59 -13
- package/dist/sandbox.js.map +1 -1
- package/dist/scope.d.ts +3 -1
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +13 -1
- package/dist/scope.js.map +1 -1
- package/dist/session-timeout.d.ts +31 -0
- package/dist/session-timeout.d.ts.map +1 -0
- package/dist/session-timeout.js +100 -0
- package/dist/session-timeout.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +29 -17
- package/dist/setup.js.map +1 -1
- package/dist/smart-router.d.ts +73 -0
- package/dist/smart-router.d.ts.map +1 -0
- package/dist/smart-router.js +332 -0
- package/dist/smart-router.js.map +1 -0
- package/dist/storage.d.ts +19 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +164 -1
- package/dist/storage.js.map +1 -1
- package/dist/streaming.d.ts +4 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +12 -0
- package/dist/streaming.js.map +1 -1
- package/dist/styles.d.ts +32 -0
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +91 -0
- package/dist/styles.js.map +1 -1
- package/dist/summarization.d.ts +1 -1
- package/dist/summarization.js +4 -4
- package/dist/summarization.js.map +1 -1
- package/dist/terminal-image.d.ts +115 -0
- package/dist/terminal-image.d.ts.map +1 -0
- package/dist/terminal-image.js +766 -0
- package/dist/terminal-image.js.map +1 -0
- package/dist/terminal-recording.d.ts +55 -0
- package/dist/terminal-recording.d.ts.map +1 -0
- package/dist/terminal-recording.js +182 -0
- package/dist/terminal-recording.js.map +1 -0
- package/dist/themes.d.ts +19 -35
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +101 -210
- package/dist/themes.js.map +1 -1
- package/dist/tmux.d.ts +35 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +106 -0
- package/dist/tmux.js.map +1 -0
- package/dist/tools.d.ts +3 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +587 -45
- package/dist/tools.js.map +1 -1
- package/dist/trust.d.ts +53 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +154 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +7 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +70 -32
- package/dist/types.js.map +1 -1
- package/dist/ui/agent.d.ts +61 -0
- package/dist/ui/agent.d.ts.map +1 -0
- package/dist/ui/agent.js +768 -0
- package/dist/ui/agent.js.map +1 -0
- package/dist/ui/chat-input.d.ts +32 -0
- package/dist/ui/chat-input.d.ts.map +1 -0
- package/dist/ui/chat-input.js +355 -0
- package/dist/ui/chat-input.js.map +1 -0
- package/dist/ui/commands.d.ts +92 -0
- package/dist/ui/commands.d.ts.map +1 -0
- package/dist/ui/commands.js +3006 -0
- package/dist/ui/commands.js.map +1 -0
- package/dist/ui/completions.d.ts +22 -0
- package/dist/ui/completions.d.ts.map +1 -0
- package/dist/ui/completions.js +215 -0
- package/dist/ui/completions.js.map +1 -0
- package/dist/ui/components.d.ts +38 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +422 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/context.d.ts +12 -0
- package/dist/ui/context.d.ts.map +1 -0
- package/dist/ui/context.js +102 -0
- package/dist/ui/context.js.map +1 -0
- package/dist/ui/error-boundary.d.ts +33 -0
- package/dist/ui/error-boundary.d.ts.map +1 -0
- package/dist/ui/error-boundary.js +94 -0
- package/dist/ui/error-boundary.js.map +1 -0
- package/dist/ui/frame.d.ts +13 -0
- package/dist/ui/frame.d.ts.map +1 -0
- package/dist/ui/frame.js +89 -0
- package/dist/ui/frame.js.map +1 -0
- package/dist/ui/index.d.ts +12 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +928 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/messages.d.ts +19 -0
- package/dist/ui/messages.d.ts.map +1 -0
- package/dist/ui/messages.js +181 -0
- package/dist/ui/messages.js.map +1 -0
- package/dist/ui/modals.d.ts +52 -0
- package/dist/ui/modals.d.ts.map +1 -0
- package/dist/ui/modals.js +204 -0
- package/dist/ui/modals.js.map +1 -0
- package/dist/ui/pack-picker.d.ts +12 -0
- package/dist/ui/pack-picker.d.ts.map +1 -0
- package/dist/ui/pack-picker.js +101 -0
- package/dist/ui/pack-picker.js.map +1 -0
- package/dist/ui/status-bar.d.ts +20 -0
- package/dist/ui/status-bar.d.ts.map +1 -0
- package/dist/ui/status-bar.js +41 -0
- package/dist/ui/status-bar.js.map +1 -0
- package/dist/ui/theme-picker.d.ts +24 -0
- package/dist/ui/theme-picker.d.ts.map +1 -0
- package/dist/ui/theme-picker.js +190 -0
- package/dist/ui/theme-picker.js.map +1 -0
- package/dist/ui/types.d.ts +62 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +7 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +1 -9
- package/dist/version-check.js.map +1 -1
- package/package.json +8 -3
- package/dist/agterm/agent-detection.js.map +0 -1
- package/dist/agterm/cli-backend.js.map +0 -1
- package/dist/agterm/index.d.ts +0 -12
- package/dist/agterm/index.d.ts.map +0 -1
- package/dist/agterm/index.js +0 -15
- package/dist/agterm/index.js.map +0 -1
- package/dist/agterm/orchestrator.d.ts.map +0 -1
- package/dist/agterm/orchestrator.js.map +0 -1
- package/dist/agterm/tools.d.ts.map +0 -1
- package/dist/agterm/tools.js +0 -278
- package/dist/agterm/tools.js.map +0 -1
- package/dist/agterm/types.d.ts.map +0 -1
- package/dist/agterm/types.js.map +0 -1
- package/dist/cli.d.ts +0 -14
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/providers.d.ts +0 -51
- package/dist/providers.d.ts.map +0 -1
- package/dist/providers.js +0 -1146
- package/dist/providers.js.map +0 -1
- package/dist/ui-cli.d.ts +0 -17
- package/dist/ui-cli.d.ts.map +0 -1
- package/dist/ui-cli.js +0 -3730
- package/dist/ui-cli.js.map +0 -1
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI Module - Utility Components
|
|
4
|
+
*
|
|
5
|
+
* Animated thinking displays, state transitions, streaming indicators.
|
|
6
|
+
* Colors sourced from active palette, animations from active skin.
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useEffect, useRef } from 'react';
|
|
9
|
+
import { Box, Text, useStdout } from 'ink';
|
|
10
|
+
import { getCurrentSkin, getSpinnerFrames, getInkColor } from '../hud/api.js';
|
|
11
|
+
import { getThinkingPhrase } from '../companions.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Constants & Helpers
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export function getBannerLines() {
|
|
16
|
+
return getCurrentSkin().banner.art;
|
|
17
|
+
}
|
|
18
|
+
export function getSkinSpinnerFrames() {
|
|
19
|
+
return getSpinnerFrames();
|
|
20
|
+
}
|
|
21
|
+
const DEFAULT_PULSE = ['·', '•', '●', '•'];
|
|
22
|
+
/** Get spinner frames for a specific state, falling back to skin default */
|
|
23
|
+
export function getStateSpinner(state) {
|
|
24
|
+
const skin = getCurrentSkin();
|
|
25
|
+
const anims = skin.animations;
|
|
26
|
+
if (state === 'thinking' && anims?.thinkingSpinner?.length)
|
|
27
|
+
return anims.thinkingSpinner;
|
|
28
|
+
if (state === 'processing' && anims?.processingSpinner?.length)
|
|
29
|
+
return anims.processingSpinner;
|
|
30
|
+
if (state === 'streaming' && anims?.streamingPulse?.length)
|
|
31
|
+
return anims.streamingPulse;
|
|
32
|
+
return state === 'streaming' ? DEFAULT_PULSE : getSpinnerFrames();
|
|
33
|
+
}
|
|
34
|
+
export const DEFAULT_SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
35
|
+
/** Characters for each animation style */
|
|
36
|
+
const WAVE_CHARS = ' ░▒▓█▓▒░ ';
|
|
37
|
+
const NEURAL_NODES = ['◇', '◆', '○', '●', '◎', '◉'];
|
|
38
|
+
const CIRCUIT_CHARS = ['─', '┐', '│', '└', '─', '┌', '│', '┘'];
|
|
39
|
+
const DNA_LEFT = ['╭', '│', '╰', ' ', ' ', '╭', '│', '╰'];
|
|
40
|
+
const DNA_RIGHT = [' ', ' ', '╭', '│', '╰', ' ', ' ', '╭'];
|
|
41
|
+
const DNA_BASES = ['A', 'T', 'G', 'C'];
|
|
42
|
+
const ORBIT_CHARS = [
|
|
43
|
+
' ◠ ',
|
|
44
|
+
' ◜ ◝ ',
|
|
45
|
+
' ◜ ● ◝ ',
|
|
46
|
+
' ◟ ◞ ',
|
|
47
|
+
' ◡ ',
|
|
48
|
+
];
|
|
49
|
+
/** Generate a wave animation line */
|
|
50
|
+
function waveFrame(tick, width) {
|
|
51
|
+
let line = '';
|
|
52
|
+
for (let x = 0; x < width; x++) {
|
|
53
|
+
const phase = (x * 0.3 + tick * 0.4) % WAVE_CHARS.length;
|
|
54
|
+
line += WAVE_CHARS[Math.floor(phase)] || ' ';
|
|
55
|
+
}
|
|
56
|
+
return line;
|
|
57
|
+
}
|
|
58
|
+
/** Generate neural network activity */
|
|
59
|
+
function neuralFrame(tick, width) {
|
|
60
|
+
let line = '';
|
|
61
|
+
for (let x = 0; x < width; x++) {
|
|
62
|
+
if (x % 4 === 0) {
|
|
63
|
+
const nodeIdx = (tick + x) % NEURAL_NODES.length;
|
|
64
|
+
line += NEURAL_NODES[nodeIdx];
|
|
65
|
+
}
|
|
66
|
+
else if (x % 4 === 2) {
|
|
67
|
+
const active = ((tick + x * 3) % 7) < 3;
|
|
68
|
+
line += active ? '─' : ' ';
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
line += ' ';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return line;
|
|
75
|
+
}
|
|
76
|
+
/** Generate circuit trace pattern */
|
|
77
|
+
function circuitFrame(tick, width) {
|
|
78
|
+
let line = '';
|
|
79
|
+
const pulsePos = tick % width;
|
|
80
|
+
for (let x = 0; x < width; x++) {
|
|
81
|
+
const charIdx = (x + tick) % CIRCUIT_CHARS.length;
|
|
82
|
+
const dist = Math.abs(x - pulsePos);
|
|
83
|
+
if (dist < 3) {
|
|
84
|
+
line += CIRCUIT_CHARS[charIdx];
|
|
85
|
+
}
|
|
86
|
+
else if (x % 5 === 0) {
|
|
87
|
+
line += '·';
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
line += ' ';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return line;
|
|
94
|
+
}
|
|
95
|
+
/** Generate DNA helix pattern (2 lines) */
|
|
96
|
+
function dnaFrame(tick, _width) {
|
|
97
|
+
const len = 24;
|
|
98
|
+
let top = ' ';
|
|
99
|
+
let bot = ' ';
|
|
100
|
+
for (let x = 0; x < len; x++) {
|
|
101
|
+
const phase = (x + tick) % 8;
|
|
102
|
+
const lt = DNA_LEFT[phase];
|
|
103
|
+
const rt = DNA_RIGHT[phase];
|
|
104
|
+
if (lt !== ' ' && rt !== ' ') {
|
|
105
|
+
// Crossover — show a base pair
|
|
106
|
+
const base = DNA_BASES[(x + tick) % DNA_BASES.length];
|
|
107
|
+
top += lt + base;
|
|
108
|
+
bot += rt + base;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
top += lt + ' ';
|
|
112
|
+
bot += rt + ' ';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return [top, bot];
|
|
116
|
+
}
|
|
117
|
+
/** Generate an animated pulse bar */
|
|
118
|
+
function pulseBarFrame(tick, width) {
|
|
119
|
+
const barWidth = Math.min(width - 4, 32);
|
|
120
|
+
let bar = '│';
|
|
121
|
+
for (let x = 0; x < barWidth; x++) {
|
|
122
|
+
const intensity = Math.sin((x / barWidth) * Math.PI + tick * 0.3);
|
|
123
|
+
if (intensity > 0.8)
|
|
124
|
+
bar += '█';
|
|
125
|
+
else if (intensity > 0.5)
|
|
126
|
+
bar += '▓';
|
|
127
|
+
else if (intensity > 0.2)
|
|
128
|
+
bar += '▒';
|
|
129
|
+
else if (intensity > -0.2)
|
|
130
|
+
bar += '░';
|
|
131
|
+
else
|
|
132
|
+
bar += ' ';
|
|
133
|
+
}
|
|
134
|
+
bar += '│';
|
|
135
|
+
return bar;
|
|
136
|
+
}
|
|
137
|
+
/** Generate cascade / waterfall pattern */
|
|
138
|
+
function cascadeFrame(tick, width) {
|
|
139
|
+
const lines = [];
|
|
140
|
+
const cascadeWidth = Math.min(width - 2, 36);
|
|
141
|
+
for (let row = 0; row < 3; row++) {
|
|
142
|
+
let line = '';
|
|
143
|
+
for (let x = 0; x < cascadeWidth; x++) {
|
|
144
|
+
const drop = ((x * 7 + row * 13 + tick * 3) % 23);
|
|
145
|
+
if (drop < 2)
|
|
146
|
+
line += '│';
|
|
147
|
+
else if (drop < 4)
|
|
148
|
+
line += '┊';
|
|
149
|
+
else if (drop < 6)
|
|
150
|
+
line += '·';
|
|
151
|
+
else
|
|
152
|
+
line += ' ';
|
|
153
|
+
}
|
|
154
|
+
lines.push(line);
|
|
155
|
+
}
|
|
156
|
+
return lines;
|
|
157
|
+
}
|
|
158
|
+
/** Pick animation style from skin config or infer from skin name */
|
|
159
|
+
function getAnimationStyle() {
|
|
160
|
+
const skin = getCurrentSkin();
|
|
161
|
+
// Explicit skin preference wins
|
|
162
|
+
if (skin.animations?.thinkingStyle)
|
|
163
|
+
return skin.animations.thinkingStyle;
|
|
164
|
+
const skinName = skin.name.toLowerCase();
|
|
165
|
+
// Infer from skin name / vibe
|
|
166
|
+
if (skinName.includes('matrix') || skinName.includes('neo') || skinName.includes('hack'))
|
|
167
|
+
return 'cascade';
|
|
168
|
+
if (skinName.includes('retro') || skinName.includes('basic') || skinName.includes('arcade'))
|
|
169
|
+
return 'circuit';
|
|
170
|
+
if (skinName.includes('sci') || skinName.includes('trek') || skinName.includes('space'))
|
|
171
|
+
return 'neural';
|
|
172
|
+
if (skinName.includes('bio') || skinName.includes('nature') || skinName.includes('organic'))
|
|
173
|
+
return 'dna';
|
|
174
|
+
if (skinName.includes('minimal') || skinName.includes('clean'))
|
|
175
|
+
return 'minimal';
|
|
176
|
+
return 'wave';
|
|
177
|
+
}
|
|
178
|
+
function useTransition(isActive, enterMs = 300, exitMs = 200) {
|
|
179
|
+
const [phase, setPhase] = useState(isActive ? 'active' : 'exit');
|
|
180
|
+
const [progress, setProgress] = useState(isActive ? 1 : 0);
|
|
181
|
+
const startTime = useRef(Date.now());
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (isActive && phase !== 'active') {
|
|
184
|
+
setPhase('enter');
|
|
185
|
+
startTime.current = Date.now();
|
|
186
|
+
}
|
|
187
|
+
else if (!isActive && phase === 'active') {
|
|
188
|
+
setPhase('exit');
|
|
189
|
+
startTime.current = Date.now();
|
|
190
|
+
}
|
|
191
|
+
}, [isActive]);
|
|
192
|
+
useEffect(() => {
|
|
193
|
+
if (phase === 'enter' || phase === 'exit') {
|
|
194
|
+
const duration = phase === 'enter' ? enterMs : exitMs;
|
|
195
|
+
const timer = setInterval(() => {
|
|
196
|
+
const elapsed = Date.now() - startTime.current;
|
|
197
|
+
const p = Math.min(1, elapsed / duration);
|
|
198
|
+
setProgress(phase === 'enter' ? p : 1 - p);
|
|
199
|
+
if (p >= 1) {
|
|
200
|
+
setPhase(phase === 'enter' ? 'active' : 'exit');
|
|
201
|
+
setProgress(phase === 'enter' ? 1 : 0);
|
|
202
|
+
clearInterval(timer);
|
|
203
|
+
}
|
|
204
|
+
}, 30);
|
|
205
|
+
return () => clearInterval(timer);
|
|
206
|
+
}
|
|
207
|
+
}, [phase]);
|
|
208
|
+
return { phase, progress };
|
|
209
|
+
}
|
|
210
|
+
/** Build a transition-in wipe line */
|
|
211
|
+
function transitionWipe(text, progress) {
|
|
212
|
+
const visibleChars = Math.floor(text.length * progress);
|
|
213
|
+
return text.slice(0, visibleChars) + ' '.repeat(Math.max(0, text.length - visibleChars));
|
|
214
|
+
}
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// Elapsed Time Visualization
|
|
217
|
+
// ============================================================================
|
|
218
|
+
function formatElapsed(seconds) {
|
|
219
|
+
if (seconds < 60)
|
|
220
|
+
return `${seconds}s`;
|
|
221
|
+
const m = Math.floor(seconds / 60);
|
|
222
|
+
const s = seconds % 60;
|
|
223
|
+
return `${m}m${s.toString().padStart(2, '0')}s`;
|
|
224
|
+
}
|
|
225
|
+
/** Tiny progress dots that grow with time */
|
|
226
|
+
function elapsedDots(seconds) {
|
|
227
|
+
const filled = Math.min(seconds, 20);
|
|
228
|
+
const dots = '·'.repeat(Math.max(0, 20 - filled)) + '•'.repeat(Math.min(filled, 10));
|
|
229
|
+
return dots.slice(0, 20);
|
|
230
|
+
}
|
|
231
|
+
// ============================================================================
|
|
232
|
+
// Components
|
|
233
|
+
// ============================================================================
|
|
234
|
+
export function Separator() {
|
|
235
|
+
const { stdout } = useStdout();
|
|
236
|
+
const width = stdout?.columns || 80;
|
|
237
|
+
const borderColor = getInkColor('border');
|
|
238
|
+
return _jsx(Text, { color: borderColor, dimColor: true, children: '─'.repeat(width) });
|
|
239
|
+
}
|
|
240
|
+
export function ThinkingDisplay({ state }) {
|
|
241
|
+
const [frame, setFrame] = useState(0);
|
|
242
|
+
const [elapsed, setElapsed] = useState(0);
|
|
243
|
+
const startTime = useRef(Date.now());
|
|
244
|
+
const spinFrames = getStateSpinner('thinking');
|
|
245
|
+
const [immersionPhrase] = useState(() => getThinkingPhrase());
|
|
246
|
+
const [animStyle] = useState(() => getAnimationStyle());
|
|
247
|
+
const { stdout } = useStdout();
|
|
248
|
+
const termWidth = stdout?.columns || 80;
|
|
249
|
+
const primaryColor = getInkColor('primary');
|
|
250
|
+
const accentColor = getInkColor('accent');
|
|
251
|
+
const secondaryColor = getInkColor('secondary');
|
|
252
|
+
const { phase, progress } = useTransition(true);
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
const timer = setInterval(() => {
|
|
255
|
+
setFrame(f => f + 1);
|
|
256
|
+
setElapsed(Math.floor((Date.now() - startTime.current) / 1000));
|
|
257
|
+
}, 80);
|
|
258
|
+
return () => clearInterval(timer);
|
|
259
|
+
}, []);
|
|
260
|
+
const displayStatus = immersionPhrase || state.status;
|
|
261
|
+
const animWidth = Math.min(termWidth - 4, 40);
|
|
262
|
+
// Build animation lines based on style
|
|
263
|
+
let animLines = [];
|
|
264
|
+
if (animStyle === 'wave') {
|
|
265
|
+
animLines = [waveFrame(frame, animWidth)];
|
|
266
|
+
}
|
|
267
|
+
else if (animStyle === 'neural') {
|
|
268
|
+
animLines = [neuralFrame(frame, animWidth)];
|
|
269
|
+
}
|
|
270
|
+
else if (animStyle === 'circuit') {
|
|
271
|
+
animLines = [circuitFrame(frame, animWidth)];
|
|
272
|
+
}
|
|
273
|
+
else if (animStyle === 'dna') {
|
|
274
|
+
animLines = dnaFrame(frame, animWidth);
|
|
275
|
+
}
|
|
276
|
+
else if (animStyle === 'pulse-bar') {
|
|
277
|
+
animLines = [pulseBarFrame(frame, animWidth)];
|
|
278
|
+
}
|
|
279
|
+
else if (animStyle === 'cascade') {
|
|
280
|
+
animLines = cascadeFrame(frame, animWidth);
|
|
281
|
+
}
|
|
282
|
+
else if (animStyle === 'orbit') {
|
|
283
|
+
const orbitIdx = frame % ORBIT_CHARS.length;
|
|
284
|
+
animLines = [ORBIT_CHARS[orbitIdx]];
|
|
285
|
+
}
|
|
286
|
+
// 'minimal' — no animation lines
|
|
287
|
+
// Apply enter transition (wipe in)
|
|
288
|
+
if (phase === 'enter') {
|
|
289
|
+
animLines = animLines.map(l => transitionWipe(l, progress));
|
|
290
|
+
}
|
|
291
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: primaryColor, children: spinFrames[frame % spinFrames.length] }), _jsxs(Text, { color: primaryColor, bold: true, children: [" ", displayStatus] }), state.iteration != null && state.maxIterations && Number.isFinite(state.maxIterations) && (_jsxs(Text, { dimColor: true, children: [" (", state.iteration, "/", state.maxIterations, ")"] })), elapsed > 0 && (_jsxs(Text, { dimColor: true, children: [" ", formatElapsed(elapsed)] }))] }), animStyle !== 'minimal' && animLines.length > 0 && (_jsx(Box, { flexDirection: "column", marginLeft: 2, children: animLines.map((line, i) => (_jsx(Text, { color: secondaryColor, dimColor: true, children: line }, i))) })), elapsed > 2 && (_jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: accentColor, dimColor: true, children: elapsedDots(elapsed) }) })), state.detail && (_jsx(Box, { marginLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["\u21B3 ", state.detail] }) })), state.thinking && (_jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsx(Text, { color: accentColor, children: "Thinking:" }), state.thinking.split('\n').slice(0, 5).map((line, i) => (_jsxs(Text, { dimColor: true, children: [" ", line.substring(0, 80)] }, i))), state.thinking.split('\n').length > 5 && (_jsx(Text, { dimColor: true, children: " ..." }))] }))] }));
|
|
292
|
+
}
|
|
293
|
+
export function ProcessingIndicator({ label }) {
|
|
294
|
+
const [frame, setFrame] = useState(0);
|
|
295
|
+
const spinFrames = getStateSpinner('processing');
|
|
296
|
+
const primaryColor = getInkColor('primary');
|
|
297
|
+
const secondaryColor = getInkColor('secondary');
|
|
298
|
+
useEffect(() => {
|
|
299
|
+
const timer = setInterval(() => {
|
|
300
|
+
setFrame(f => f + 1);
|
|
301
|
+
}, 80);
|
|
302
|
+
return () => clearInterval(timer);
|
|
303
|
+
}, []);
|
|
304
|
+
// Animated ellipsis
|
|
305
|
+
const dots = '.'.repeat((frame % 12) < 3 ? 1 : (frame % 12) < 6 ? 2 : (frame % 12) < 9 ? 3 : 0);
|
|
306
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: primaryColor, children: spinFrames[frame % spinFrames.length] }), _jsxs(Text, { dimColor: true, children: [" ", label, dots] })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: secondaryColor, dimColor: true, children: scanLine(frame, 24) }) })] }));
|
|
307
|
+
}
|
|
308
|
+
/** A subtle scanning line effect */
|
|
309
|
+
function scanLine(tick, width) {
|
|
310
|
+
const pos = tick % (width * 2);
|
|
311
|
+
const actual = pos < width ? pos : width * 2 - pos;
|
|
312
|
+
let line = '';
|
|
313
|
+
for (let x = 0; x < width; x++) {
|
|
314
|
+
const dist = Math.abs(x - actual);
|
|
315
|
+
if (dist === 0)
|
|
316
|
+
line += '█';
|
|
317
|
+
else if (dist === 1)
|
|
318
|
+
line += '▓';
|
|
319
|
+
else if (dist === 2)
|
|
320
|
+
line += '▒';
|
|
321
|
+
else if (dist === 3)
|
|
322
|
+
line += '░';
|
|
323
|
+
else
|
|
324
|
+
line += '·';
|
|
325
|
+
}
|
|
326
|
+
return line;
|
|
327
|
+
}
|
|
328
|
+
/** Brief splash overlay shown when switching themes (auto-dismisses) */
|
|
329
|
+
export function SplashOverlay({ art, color, onDone }) {
|
|
330
|
+
const [visibleLines, setVisibleLines] = useState(0);
|
|
331
|
+
useEffect(() => {
|
|
332
|
+
// Typewriter entry: reveal one line at a time
|
|
333
|
+
if (visibleLines < art.length) {
|
|
334
|
+
const timer = setTimeout(() => setVisibleLines(v => v + 1), 60);
|
|
335
|
+
return () => clearTimeout(timer);
|
|
336
|
+
}
|
|
337
|
+
// Hold then dismiss
|
|
338
|
+
const timer = setTimeout(onDone, 800);
|
|
339
|
+
return () => clearTimeout(timer);
|
|
340
|
+
}, [visibleLines, art.length, onDone]);
|
|
341
|
+
return (_jsx(Box, { flexDirection: "column", justifyContent: "center", alignItems: "center", marginY: 1, children: art.slice(0, visibleLines).map((line, i) => (_jsx(Text, { color: color, children: line }, i))) }));
|
|
342
|
+
}
|
|
343
|
+
export function StreamingIndicator({ activity }) {
|
|
344
|
+
const [frame, setFrame] = useState(0);
|
|
345
|
+
const [elapsed, setElapsed] = useState(0);
|
|
346
|
+
const pulseFrames = getStateSpinner('streaming');
|
|
347
|
+
const primaryColor = getInkColor('primary');
|
|
348
|
+
const successColor = getInkColor('success');
|
|
349
|
+
const accentColor = getInkColor('accent');
|
|
350
|
+
useEffect(() => {
|
|
351
|
+
const timer = setInterval(() => {
|
|
352
|
+
setFrame(f => f + 1);
|
|
353
|
+
if (activity) {
|
|
354
|
+
setElapsed(Math.floor((Date.now() - activity.startTime) / 1000));
|
|
355
|
+
}
|
|
356
|
+
}, 150);
|
|
357
|
+
return () => clearInterval(timer);
|
|
358
|
+
}, [activity]);
|
|
359
|
+
// Flowing stream visualization
|
|
360
|
+
const streamChars = '─═─═─═─═─═─═─═─═─═─═';
|
|
361
|
+
const streamPos = frame % streamChars.length;
|
|
362
|
+
const streamVis = streamChars.slice(streamPos, streamPos + 12).padEnd(12, '─');
|
|
363
|
+
if (activity) {
|
|
364
|
+
const elapsedStr = elapsed > 0 ? ` ${formatElapsed(elapsed)}` : '';
|
|
365
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: primaryColor, children: pulseFrames[frame % pulseFrames.length] }), _jsxs(Text, { bold: true, children: [" ", activity.action] }), activity.target && _jsxs(Text, { dimColor: true, children: [" ", activity.target] }), _jsx(Text, { dimColor: true, children: elapsedStr })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: accentColor, dimColor: true, children: streamVis }) }), activity.detail && _jsxs(Text, { dimColor: true, children: [" ", activity.detail] })] }));
|
|
366
|
+
}
|
|
367
|
+
return (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { children: [_jsx(Text, { color: successColor, children: pulseFrames[frame % pulseFrames.length] }), _jsx(Text, { dimColor: true, children: " receiving" }), _jsxs(Text, { color: accentColor, dimColor: true, children: [" ", streamVis] })] }) }));
|
|
368
|
+
}
|
|
369
|
+
// ============================================================================
|
|
370
|
+
// State Transition Overlay
|
|
371
|
+
// ============================================================================
|
|
372
|
+
/**
|
|
373
|
+
* Renders a brief transition effect between processing states.
|
|
374
|
+
* Mount when transitioning, unmount after onComplete fires.
|
|
375
|
+
*/
|
|
376
|
+
export function StateTransition({ from, to, onComplete }) {
|
|
377
|
+
const [frame, setFrame] = useState(0);
|
|
378
|
+
const totalFrames = 8;
|
|
379
|
+
const primaryColor = getInkColor('primary');
|
|
380
|
+
const successColor = getInkColor('success');
|
|
381
|
+
useEffect(() => {
|
|
382
|
+
const timer = setInterval(() => {
|
|
383
|
+
setFrame(f => {
|
|
384
|
+
if (f + 1 >= totalFrames) {
|
|
385
|
+
clearInterval(timer);
|
|
386
|
+
onComplete();
|
|
387
|
+
return f;
|
|
388
|
+
}
|
|
389
|
+
return f + 1;
|
|
390
|
+
});
|
|
391
|
+
}, 40);
|
|
392
|
+
return () => clearInterval(timer);
|
|
393
|
+
}, []);
|
|
394
|
+
const progress = frame / totalFrames;
|
|
395
|
+
const width = 24;
|
|
396
|
+
// Different transition effects based on state change
|
|
397
|
+
if (to === 'thinking') {
|
|
398
|
+
// Expand-in: growing bar
|
|
399
|
+
const filled = Math.floor(width * progress);
|
|
400
|
+
const bar = '▓'.repeat(filled) + '░'.repeat(width - filled);
|
|
401
|
+
return (_jsx(Box, { children: _jsx(Text, { color: primaryColor, children: bar }) }));
|
|
402
|
+
}
|
|
403
|
+
if (to === 'streaming') {
|
|
404
|
+
// Dissolve: thinking pattern breaks apart
|
|
405
|
+
let line = '';
|
|
406
|
+
for (let x = 0; x < width; x++) {
|
|
407
|
+
const dissolve = Math.random() < progress;
|
|
408
|
+
line += dissolve ? '·' : '▒';
|
|
409
|
+
}
|
|
410
|
+
return (_jsx(Box, { children: _jsx(Text, { color: primaryColor, dimColor: true, children: line }) }));
|
|
411
|
+
}
|
|
412
|
+
if (to === 'done') {
|
|
413
|
+
// Flash success
|
|
414
|
+
const flash = progress < 0.5 ? '✓'.padStart(Math.floor(width / 2)) : '';
|
|
415
|
+
return (_jsx(Box, { children: _jsx(Text, { color: successColor, bold: true, children: flash }) }));
|
|
416
|
+
}
|
|
417
|
+
// Fade out (to idle)
|
|
418
|
+
const opacity = 1 - progress;
|
|
419
|
+
const fadeBar = opacity > 0.5 ? '─'.repeat(width) : opacity > 0.2 ? '·'.repeat(width) : '';
|
|
420
|
+
return (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: fadeBar }) }));
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/ui/components.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Smart Context Management
|
|
3
|
+
*
|
|
4
|
+
* Tracks context window usage and provides progressive warnings
|
|
5
|
+
* as the conversation approaches the model's context limit.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMProvider } from '../types.js';
|
|
8
|
+
export type ContextLevel = 'healthy' | 'caution' | 'warning' | 'critical' | 'emergency';
|
|
9
|
+
export declare function getContextLevel(percentage: number): ContextLevel;
|
|
10
|
+
export declare function checkAndWarnContextLimit(provider: LLMProvider, model: string, tokens: number, addMessage?: (type: 'user' | 'assistant' | 'system' | 'error', content: string) => void): void;
|
|
11
|
+
export declare function resetContextWarnings(): void;
|
|
12
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAsBxF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAMhE;AA2BD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACtF,IAAI,CAkDN;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Smart Context Management
|
|
3
|
+
*
|
|
4
|
+
* Tracks context window usage and provides progressive warnings
|
|
5
|
+
* as the conversation approaches the model's context limit.
|
|
6
|
+
*/
|
|
7
|
+
import { getModelContextLimit } from '../model-detection.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Module-level State (persists across renders)
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const contextState = {
|
|
12
|
+
lastLevel: 'healthy',
|
|
13
|
+
warningCounts: { healthy: 0, caution: 0, warning: 0, critical: 0, emergency: 0 },
|
|
14
|
+
lastWarningTime: 0,
|
|
15
|
+
};
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Functions
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export function getContextLevel(percentage) {
|
|
20
|
+
if (percentage >= 98)
|
|
21
|
+
return 'emergency';
|
|
22
|
+
if (percentage >= 95)
|
|
23
|
+
return 'critical';
|
|
24
|
+
if (percentage >= 85)
|
|
25
|
+
return 'warning';
|
|
26
|
+
if (percentage >= 70)
|
|
27
|
+
return 'caution';
|
|
28
|
+
return 'healthy';
|
|
29
|
+
}
|
|
30
|
+
function getContextLevelIndex(level) {
|
|
31
|
+
const order = ['healthy', 'caution', 'warning', 'critical', 'emergency'];
|
|
32
|
+
return order.indexOf(level);
|
|
33
|
+
}
|
|
34
|
+
function shouldShowContextWarning(level) {
|
|
35
|
+
if (level === 'healthy')
|
|
36
|
+
return false;
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
const timeSinceLastWarning = now - contextState.lastWarningTime;
|
|
39
|
+
const minInterval = level === 'emergency' ? 30000 : 60000; // 30s for emergency, 60s otherwise
|
|
40
|
+
// Always warn on level increase
|
|
41
|
+
if (getContextLevelIndex(level) > getContextLevelIndex(contextState.lastLevel)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
// Warn again if enough time has passed and we're at critical/emergency
|
|
45
|
+
if ((level === 'critical' || level === 'emergency') && timeSinceLastWarning > minInterval) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
export function checkAndWarnContextLimit(provider, model, tokens, addMessage) {
|
|
51
|
+
const limit = getModelContextLimit(provider, model);
|
|
52
|
+
const percentage = (tokens / limit) * 100;
|
|
53
|
+
const level = getContextLevel(percentage);
|
|
54
|
+
const used = Math.round(tokens / 1000);
|
|
55
|
+
const limitK = Math.round(limit / 1000);
|
|
56
|
+
if (!shouldShowContextWarning(level))
|
|
57
|
+
return;
|
|
58
|
+
// Update state
|
|
59
|
+
contextState.lastLevel = level;
|
|
60
|
+
contextState.warningCounts[level]++;
|
|
61
|
+
contextState.lastWarningTime = Date.now();
|
|
62
|
+
// Generate warning message based on level
|
|
63
|
+
let message;
|
|
64
|
+
switch (level) {
|
|
65
|
+
case 'emergency':
|
|
66
|
+
message = `\x1b[31m\x1b[1m🚨 EMERGENCY: Context at ${Math.round(percentage)}% (${used}K/${limitK}K)\x1b[0m
|
|
67
|
+
\x1b[31m Responses WILL be truncated. Take action NOW:\x1b[0m
|
|
68
|
+
\x1b[2m /summarize compact - Auto-compress (recommended)
|
|
69
|
+
/clear - Fresh start
|
|
70
|
+
/branch new "save" - Save and branch\x1b[0m`;
|
|
71
|
+
break;
|
|
72
|
+
case 'critical':
|
|
73
|
+
message = `\x1b[31m🔴 CRITICAL: Context at ${Math.round(percentage)}% (${used}K/${limitK}K)\x1b[0m
|
|
74
|
+
\x1b[2m Approaching limits. Action recommended:
|
|
75
|
+
/summarize compact | /clear | shorter messages\x1b[0m`;
|
|
76
|
+
break;
|
|
77
|
+
case 'warning':
|
|
78
|
+
message = `\x1b[33m⚠️ WARNING: Context at ${Math.round(percentage)}% (${used}K/${limitK}K)\x1b[0m
|
|
79
|
+
\x1b[2m Consider: /summarize compact | /clear\x1b[0m`;
|
|
80
|
+
break;
|
|
81
|
+
case 'caution':
|
|
82
|
+
message = `\x1b[36m💡 Context at ${Math.round(percentage)}% (${used}K/${limitK}K)\x1b[0m
|
|
83
|
+
\x1b[2m Monitor usage. /context summary for details\x1b[0m`;
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
console.log(message + '\n');
|
|
89
|
+
// Also add to UI messages if callback provided (for critical+)
|
|
90
|
+
if (addMessage && (level === 'critical' || level === 'emergency')) {
|
|
91
|
+
const uiMessage = level === 'emergency'
|
|
92
|
+
? `🚨 EMERGENCY: Context at ${Math.round(percentage)}% - responses will be truncated! Use /summarize compact NOW`
|
|
93
|
+
: `🔴 Context at ${Math.round(percentage)}% - consider /summarize compact`;
|
|
94
|
+
addMessage('system', uiMessage);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function resetContextWarnings() {
|
|
98
|
+
contextState.lastLevel = 'healthy';
|
|
99
|
+
contextState.warningCounts = { healthy: 0, caution: 0, warning: 0, critical: 0, emergency: 0 };
|
|
100
|
+
contextState.lastWarningTime = 0;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Error Boundary
|
|
3
|
+
*
|
|
4
|
+
* React error boundary with persistent error logging and recovery UI.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
interface ErrorBoundaryProps {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
onReset?: () => void;
|
|
10
|
+
}
|
|
11
|
+
interface ErrorBoundaryState {
|
|
12
|
+
hasError: boolean;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
errorInfo: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Log error to persistent file for debugging
|
|
18
|
+
*/
|
|
19
|
+
export declare function logErrorToFile(error: Error | null, componentStack: string): void;
|
|
20
|
+
export declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
21
|
+
constructor(props: ErrorBoundaryProps);
|
|
22
|
+
static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState>;
|
|
23
|
+
componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
|
|
24
|
+
handleRetry: () => void;
|
|
25
|
+
render(): React.ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export declare function ErrorFallback({ error, errorInfo, onRetry }: {
|
|
28
|
+
error: Error | null;
|
|
29
|
+
errorInfo: string;
|
|
30
|
+
onRetry: () => void;
|
|
31
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=error-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary.d.ts","sourceRoot":"","sources":["../../src/ui/error-boundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAwChF;AAMD,qBAAa,aAAc,SAAQ,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBAC5E,KAAK,EAAE,kBAAkB;IAKrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI1E,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI;IAajE,WAAW,QAAO,IAAI,CAGpB;IAEF,MAAM,IAAI,KAAK,CAAC,SAAS;CAU1B;AAMD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,OAAO,EACR,EAAE;IACD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA6CA"}
|