@aria-cli/cli 1.0.57 → 1.0.58
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/bin/aria.mjs +2 -2
- package/package.json +17 -76
- package/dist/.tsbuildinfo +0 -1
- package/dist/attached-local-control-client.js +0 -826
- package/dist/bootstrap-local-control-client.js +0 -2
- package/dist/capability-aware-method-proxy.js +0 -42
- package/dist/cli-context.js +0 -160
- package/dist/commands/arions.js +0 -174
- package/dist/commands/auth.js +0 -123
- package/dist/commands/daemon.js +0 -367
- package/dist/commands/definitions.js +0 -176
- package/dist/commands/index.js +0 -80
- package/dist/commands/login-handler.js +0 -1108
- package/dist/commands/logout-handler.js +0 -92
- package/dist/commands/memory-handlers.js +0 -89
- package/dist/commands/pairing.js +0 -60
- package/dist/commands/runtime-cutover-reset-command.js +0 -12
- package/dist/commands/runtime-cutover-reset.js +0 -265
- package/dist/commands/terminal-setup.js +0 -84
- package/dist/config/aria-config.js +0 -238
- package/dist/config/index.js +0 -3
- package/dist/config/loader.js +0 -97
- package/dist/config.js +0 -142
- package/dist/daemon-info.js +0 -10
- package/dist/ensure-daemon.js +0 -128
- package/dist/entrypoints/command-mode.js +0 -5
- package/dist/entrypoints/daemon.js +0 -50
- package/dist/entrypoints/headless-stdio.js +0 -25
- package/dist/entrypoints/interactive.js +0 -80
- package/dist/event-loop-watchdog.js +0 -73
- package/dist/headless/auth-orchestrator.js +0 -508
- package/dist/headless/auth-service.js +0 -43
- package/dist/headless/bootstrap-fast-path.js +0 -112
- package/dist/headless/call-command.js +0 -143
- package/dist/headless/daemon-service.js +0 -318
- package/dist/headless/hook-actions.js +0 -235
- package/dist/headless/hook-service.js +0 -42
- package/dist/headless/kernel-services.js +0 -216
- package/dist/headless/kernel.js +0 -785
- package/dist/headless/operations/arion.js +0 -119
- package/dist/headless/operations/auth.js +0 -45
- package/dist/headless/operations/client.js +0 -31
- package/dist/headless/operations/config.js +0 -69
- package/dist/headless/operations/daemon.js +0 -47
- package/dist/headless/operations/hook.js +0 -56
- package/dist/headless/operations/index.js +0 -11
- package/dist/headless/operations/memory.js +0 -102
- package/dist/headless/operations/message.js +0 -279
- package/dist/headless/operations/model.js +0 -100
- package/dist/headless/operations/peer.js +0 -56
- package/dist/headless/operations/run.js +0 -24
- package/dist/headless/operations/session.js +0 -90
- package/dist/headless/operations/system.js +0 -19
- package/dist/headless/operations/utils.js +0 -35
- package/dist/headless/run-orchestrator.js +0 -703
- package/dist/headless/stdio-server.js +0 -439
- package/dist/history/SessionHistory.js +0 -8
- package/dist/history/SessionHistoryClient.js +0 -186
- package/dist/history/conversation-message.js +0 -112
- package/dist/history/index.js +0 -8
- package/dist/history/jsonl-replay.js +0 -154
- package/dist/history/repair-tool-pairing.js +0 -84
- package/dist/history/stall-phase-bridge.js +0 -11
- package/dist/history/turn-accumulator.js +0 -427
- package/dist/index.js +0 -7
- package/dist/ink-repl.js +0 -4183
- package/dist/local-control-bootstrap.js +0 -26
- package/dist/local-control-client.js +0 -2
- package/dist/local-control-error-reporting.js +0 -34
- package/dist/local-control-http-client.js +0 -362
- package/dist/local-control-lazy-wrapper.js +0 -363
- package/dist/local-control-manager.js +0 -146
- package/dist/main.js +0 -62
- package/dist/network-security.js +0 -62
- package/dist/networking-server.js +0 -38
- package/dist/peer-identity.js +0 -23
- package/dist/polling-subscription.js +0 -34
- package/dist/relaunch.js +0 -617
- package/dist/release-notes.js +0 -35
- package/dist/repl-cleanup.js +0 -47
- package/dist/runtime/configure-bun-sqlite.js +0 -3
- package/dist/runtime/crash-handlers.js +0 -111
- package/dist/runtime/interactive-invocation.js +0 -39
- package/dist/runtime/internal-mode.js +0 -14
- package/dist/runtime/launch-spec.js +0 -64
- package/dist/runtime/owner-lease.js +0 -44
- package/dist/runtime/public-mode.js +0 -20
- package/dist/runtime/run-internal-mode.js +0 -18
- package/dist/runtime/runtime-kind.js +0 -32
- package/dist/runtime/spawn-aria.js +0 -38
- package/dist/selectable-client.js +0 -2
- package/dist/selectable-peer.js +0 -2
- package/dist/session.js +0 -203
- package/dist/slash-commands.js +0 -80
- package/dist/sounds.js +0 -210
- package/dist/ui/App.js +0 -526
- package/dist/ui/components/AnthropicMethodPicker.js +0 -6
- package/dist/ui/components/ArionPrompt.js +0 -15
- package/dist/ui/components/AutocompleteDropdown.js +0 -23
- package/dist/ui/components/AutonomySelector.js +0 -55
- package/dist/ui/components/Banner.js +0 -98
- package/dist/ui/components/ConversationHistory.js +0 -175
- package/dist/ui/components/CopilotDeviceLoginFlow.js +0 -88
- package/dist/ui/components/CopilotSourcePicker.js +0 -50
- package/dist/ui/components/Cost.js +0 -10
- package/dist/ui/components/CustomSelect/option-map.js +0 -30
- package/dist/ui/components/CustomSelect/select-option.js +0 -13
- package/dist/ui/components/CustomSelect/select.js +0 -42
- package/dist/ui/components/CustomSelect/use-select-state.js +0 -179
- package/dist/ui/components/CustomSelect/use-select.js +0 -15
- package/dist/ui/components/ErrorDisplay.js +0 -35
- package/dist/ui/components/FallbackToolUseRejectedMessage.js +0 -7
- package/dist/ui/components/FileEditToolUpdatedMessage.js +0 -57
- package/dist/ui/components/HandoffMarker.js +0 -18
- package/dist/ui/components/HighlightedCode.js +0 -21
- package/dist/ui/components/InputArea.js +0 -187
- package/dist/ui/components/Message.js +0 -25
- package/dist/ui/components/OAuthLoginFlow.js +0 -113
- package/dist/ui/components/OutputTruncation.js +0 -35
- package/dist/ui/components/PermissionPrompt.js +0 -79
- package/dist/ui/components/PipelineTimingPanel.js +0 -15
- package/dist/ui/components/ProviderMethodPicker.js +0 -61
- package/dist/ui/components/ProviderPicker.js +0 -63
- package/dist/ui/components/RenderItemView.js +0 -71
- package/dist/ui/components/Spinner.js +0 -46
- package/dist/ui/components/StatusBar.js +0 -95
- package/dist/ui/components/StreamingIndicator.js +0 -55
- package/dist/ui/components/StructuredDiff.js +0 -168
- package/dist/ui/components/TextInputOverlay.js +0 -43
- package/dist/ui/components/ThinkingBlock.js +0 -82
- package/dist/ui/components/ToolCost.js +0 -17
- package/dist/ui/components/ToolExecution.js +0 -61
- package/dist/ui/components/ToolHeader.js +0 -51
- package/dist/ui/components/ToolRenderLayoutContext.js +0 -14
- package/dist/ui/components/ToolResultWrapper.js +0 -6
- package/dist/ui/components/ToolUseLoader.js +0 -35
- package/dist/ui/components/TraceWaterfall.js +0 -91
- package/dist/ui/components/index.js +0 -33
- package/dist/ui/components/messages/AssistantTextMessage.js +0 -25
- package/dist/ui/components/messages/UserImageMessage.js +0 -12
- package/dist/ui/components/messages/UserTextMessage.js +0 -12
- package/dist/ui/components/overlays/ArionSelector.js +0 -68
- package/dist/ui/components/overlays/ClientSelector.js +0 -62
- package/dist/ui/components/overlays/CommandPalette.js +0 -67
- package/dist/ui/components/overlays/DaemonControl.js +0 -87
- package/dist/ui/components/overlays/InviteShareOverlay.js +0 -15
- package/dist/ui/components/overlays/JoinInviteOverlay.js +0 -32
- package/dist/ui/components/overlays/MemoryBrowser.js +0 -100
- package/dist/ui/components/overlays/MessageSelector.js +0 -123
- package/dist/ui/components/overlays/ModelSelector.js +0 -211
- package/dist/ui/components/overlays/PairRequestOverlay.js +0 -42
- package/dist/ui/components/overlays/PeerSelector.js +0 -84
- package/dist/ui/components/overlays/SessionSelector.js +0 -102
- package/dist/ui/components/overlays/SoundSelector.js +0 -86
- package/dist/ui/components/overlays/ThemeSelector.js +0 -139
- package/dist/ui/components/overlays/index.js +0 -15
- package/dist/ui/components/permissions/BashPermissionRequest/BashPermissionRequest.js +0 -53
- package/dist/ui/components/permissions/FallbackPermissionRequest.js +0 -56
- package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +0 -76
- package/dist/ui/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +0 -18
- package/dist/ui/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +0 -64
- package/dist/ui/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +0 -26
- package/dist/ui/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +0 -141
- package/dist/ui/components/permissions/PermissionRequest.js +0 -70
- package/dist/ui/components/permissions/PermissionRequestTitle.js +0 -41
- package/dist/ui/components/permissions/hooks.js +0 -10
- package/dist/ui/components/permissions/toolUseOptions.js +0 -68
- package/dist/ui/components/permissions/utils.js +0 -10
- package/dist/ui/components/text-input/Cursor.js +0 -326
- package/dist/ui/components/text-input/TextInput.js +0 -231
- package/dist/ui/components/text-input/imagePaste.js +0 -28
- package/dist/ui/components/text-input/index.js +0 -6
- package/dist/ui/components/text-input/useDoublePress.js +0 -30
- package/dist/ui/components/text-input/useTextInput.js +0 -245
- package/dist/ui/components/tool-types.js +0 -9
- package/dist/ui/constants/figures.js +0 -4
- package/dist/ui/constants/index.js +0 -3
- package/dist/ui/display-mode.js +0 -93
- package/dist/ui/display-policy.js +0 -19
- package/dist/ui/hooks/index.js +0 -6
- package/dist/ui/hooks/useCommandAutocomplete.js +0 -93
- package/dist/ui/hooks/useDoublePress.js +0 -37
- package/dist/ui/hooks/useIndicatorState.js +0 -55
- package/dist/ui/hooks/useInterval.js +0 -23
- package/dist/ui/hooks/useKeyboardShortcuts.js +0 -127
- package/dist/ui/hooks/useTerminalSize.js +0 -55
- package/dist/ui/hooks/useUnifiedMessages.js +0 -117
- package/dist/ui/indicator-state.js +0 -44
- package/dist/ui/markdown/highlight.js +0 -44
- package/dist/ui/markdown/index.js +0 -1460
- package/dist/ui/markdown/tokenizer.js +0 -24
- package/dist/ui/render-item.js +0 -5
- package/dist/ui/screens/REPL.js +0 -119
- package/dist/ui/screens/approval-lifecycle.js +0 -38
- package/dist/ui/status-line.js +0 -72
- package/dist/ui/theme/index.js +0 -51
- package/dist/ui/theme/themes/claude-dark-daltonized.js +0 -51
- package/dist/ui/theme/themes/claude-dark.js +0 -50
- package/dist/ui/theme/themes/claude-light-daltonized.js +0 -51
- package/dist/ui/theme/themes/claude-light.js +0 -50
- package/dist/ui/theme/themes/dark-accessible.js +0 -18
- package/dist/ui/theme/themes/dark.js +0 -49
- package/dist/ui/theme/themes/light-accessible.js +0 -18
- package/dist/ui/theme/themes/light.js +0 -49
- package/dist/ui/theme/types.js +0 -3
- package/dist/ui/theme.js +0 -142
- package/dist/ui/to-render-items.js +0 -145
- package/dist/ui/tools/AgentTool/index.js +0 -30
- package/dist/ui/tools/ArchitectTool/index.js +0 -31
- package/dist/ui/tools/AskUserTool/index.js +0 -46
- package/dist/ui/tools/BashTool/BashToolResultMessage.js +0 -11
- package/dist/ui/tools/BashTool/OutputLine.js +0 -21
- package/dist/ui/tools/BashTool/index.js +0 -91
- package/dist/ui/tools/BrowseTool/index.js +0 -43
- package/dist/ui/tools/BrowserTool/index.js +0 -47
- package/dist/ui/tools/CbmTool/index.js +0 -188
- package/dist/ui/tools/CheckDelegationTool/index.js +0 -46
- package/dist/ui/tools/CheckMessagesTool/index.js +0 -85
- package/dist/ui/tools/CreateQuipTool/index.js +0 -30
- package/dist/ui/tools/CreateSkillTool/index.js +0 -22
- package/dist/ui/tools/CreateToolTool/index.js +0 -31
- package/dist/ui/tools/DelegateRemoteTool/index.js +0 -42
- package/dist/ui/tools/DeployTool/index.js +0 -47
- package/dist/ui/tools/FffTool/index.js +0 -103
- package/dist/ui/tools/FileEditTool/index.js +0 -67
- package/dist/ui/tools/FileReadTool/index.js +0 -68
- package/dist/ui/tools/FileWriteTool/index.js +0 -61
- package/dist/ui/tools/ForkTool/index.js +0 -47
- package/dist/ui/tools/FrgTool/index.js +0 -96
- package/dist/ui/tools/GetThreadTool/index.js +0 -39
- package/dist/ui/tools/GlobTool/index.js +0 -50
- package/dist/ui/tools/GrepTool/index.js +0 -84
- package/dist/ui/tools/HatchArionTool/index.js +0 -36
- package/dist/ui/tools/LearnSkillTool/index.js +0 -22
- package/dist/ui/tools/LearnTool/index.js +0 -43
- package/dist/ui/tools/LearnToolTool/index.js +0 -22
- package/dist/ui/tools/ListClientsTool/index.js +0 -39
- package/dist/ui/tools/LspTool/index.js +0 -261
- package/dist/ui/tools/MCPTool/index.js +0 -33
- package/dist/ui/tools/ManageNetworkTool/index.js +0 -53
- package/dist/ui/tools/MemoryReadTool/index.js +0 -64
- package/dist/ui/tools/MemoryWriteTool/index.js +0 -20
- package/dist/ui/tools/NotebookEditTool/index.js +0 -33
- package/dist/ui/tools/NotebookReadTool/index.js +0 -25
- package/dist/ui/tools/OutlookReadTool/index.js +0 -66
- package/dist/ui/tools/OutlookReplyTool/index.js +0 -49
- package/dist/ui/tools/OutlookSendTool/index.js +0 -49
- package/dist/ui/tools/PauseDelegationTool/index.js +0 -35
- package/dist/ui/tools/ProbeTool/index.js +0 -121
- package/dist/ui/tools/ProcessTool/index.js +0 -66
- package/dist/ui/tools/QuestListTool/index.js +0 -46
- package/dist/ui/tools/QuestReportTool/index.js +0 -49
- package/dist/ui/tools/QuestUpdateTool/index.js +0 -87
- package/dist/ui/tools/QuipCommentTool/index.js +0 -69
- package/dist/ui/tools/QuipReadTool/index.js +0 -71
- package/dist/ui/tools/RestArionTool/index.js +0 -32
- package/dist/ui/tools/RestartTool/index.js +0 -35
- package/dist/ui/tools/ResumeDelegationTool/index.js +0 -35
- package/dist/ui/tools/RetireArionTool/index.js +0 -32
- package/dist/ui/tools/RgTool/index.js +0 -73
- package/dist/ui/tools/SearchKnowledgeTool/index.js +0 -43
- package/dist/ui/tools/SearchMessagesTool/index.js +0 -43
- package/dist/ui/tools/SelfDiagnoseTool/index.js +0 -61
- package/dist/ui/tools/SendMessageTool/index.js +0 -45
- package/dist/ui/tools/SerenaTool/index.js +0 -124
- package/dist/ui/tools/SessionHistoryTool/index.js +0 -52
- package/dist/ui/tools/SgTool/index.js +0 -80
- package/dist/ui/tools/SlackReactTool/index.js +0 -41
- package/dist/ui/tools/SlackReadTool/index.js +0 -48
- package/dist/ui/tools/SlackSendTool/index.js +0 -45
- package/dist/ui/tools/SpawnWorkerTool/index.js +0 -33
- package/dist/ui/tools/StickerRequestTool/index.js +0 -19
- package/dist/ui/tools/ThinkTool/index.js +0 -17
- package/dist/ui/tools/UgTool/index.js +0 -108
- package/dist/ui/tools/UseSkillTool/index.js +0 -22
- package/dist/ui/tools/WakeArionTool/index.js +0 -32
- package/dist/ui/tools/WebFetchTool/index.js +0 -56
- package/dist/ui/tools/WebSearchTool/index.js +0 -44
- package/dist/ui/tools/lsTool/index.js +0 -58
- package/dist/ui/tools/registry.js +0 -197
- package/dist/ui/tools/tool-renderer.js +0 -11
- package/dist/ui/tools/truncation.js +0 -35
- package/dist/ui/types/anthropic.js +0 -4
- package/dist/ui/types/index.js +0 -2
- package/dist/ui/types/message.js +0 -3
- package/dist/ui/types/tool.js +0 -4
- package/dist/ui/utils/array.js +0 -4
- package/dist/ui/utils/cursor.js +0 -131
- package/dist/ui/utils/diff.js +0 -120
- package/dist/ui/utils/format.js +0 -42
- package/dist/ui/utils/fuzzy.js +0 -59
- package/dist/ui/utils/index.js +0 -11
- package/dist/ui/utils/keys.js +0 -8
- package/dist/ui/utils/patch.js +0 -17
- package/dist/ui/utils/risk.js +0 -114
- package/dist/ui/utils/terminal-image.js +0 -70
- package/dist/ui/utils/validation.js +0 -48
- package/dist/ui/verb-pairs.js +0 -248
- package/dist/ui.js +0 -131
- package/src/entrypoints/command-mode.ts +0 -5
- package/src/entrypoints/daemon.ts +0 -54
- package/src/entrypoints/headless-stdio.ts +0 -27
- package/src/entrypoints/interactive.ts +0 -112
- package/src/main.ts +0 -72
- package/src/runtime/configure-bun-sqlite.ts +0 -3
- package/src/runtime/crash-handlers.ts +0 -128
- package/src/runtime/interactive-invocation.test.ts +0 -42
- package/src/runtime/interactive-invocation.ts +0 -51
- package/src/runtime/internal-mode.test.ts +0 -19
- package/src/runtime/internal-mode.ts +0 -24
- package/src/runtime/launch-spec.test.ts +0 -26
- package/src/runtime/launch-spec.ts +0 -84
- package/src/runtime/owner-lease.ts +0 -52
- package/src/runtime/public-mode.test.ts +0 -18
- package/src/runtime/public-mode.ts +0 -19
- package/src/runtime/run-internal-mode.ts +0 -19
- package/src/runtime/runtime-kind.test.ts +0 -23
- package/src/runtime/runtime-kind.ts +0 -41
- package/src/runtime/spawn-aria.ts +0 -62
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// BashTool/OutputLine.tsx
|
|
3
|
-
// Substitutions:
|
|
4
|
-
// - import { getTheme } from '../../utils/theme' → import { getTheme } from '../theme/index.js'
|
|
5
|
-
// - import { MAX_RENDERED_LINES } from './prompt' → const MAX_RENDERED_LINES = 50
|
|
6
|
-
// - theme.error → theme.colors.error
|
|
7
|
-
// Compat: OutputTruncation exported for backward compat with ARIA callers
|
|
8
|
-
// (simplified interface: content + maxLines + isError)
|
|
9
|
-
import { Box, Text } from "ink";
|
|
10
|
-
import { getTheme } from "../theme/index.js";
|
|
11
|
-
import chalk from "chalk";
|
|
12
|
-
import { capLine } from "../tools/truncation.js";
|
|
13
|
-
const MAX_RENDERED_LINES = 3;
|
|
14
|
-
function renderTruncatedContent(content, totalLines, maxLines = MAX_RENDERED_LINES) {
|
|
15
|
-
const allLines = content.split("\n");
|
|
16
|
-
if (allLines.length <= maxLines) {
|
|
17
|
-
return allLines.map(capLine).join("\n");
|
|
18
|
-
}
|
|
19
|
-
return [
|
|
20
|
-
...allLines.slice(0, maxLines).map(capLine),
|
|
21
|
-
chalk.grey(`... (+${totalLines - maxLines} lines)`),
|
|
22
|
-
].join("\n");
|
|
23
|
-
}
|
|
24
|
-
export function OutputLine({ content, lines, verbose, isError, }) {
|
|
25
|
-
return (_jsx(Box, { justifyContent: "space-between", width: "100%", children: _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { children: "\u00A0\u00A0\u23BF \u00A0" }), _jsx(Box, { flexDirection: "column", children: _jsx(Text, { color: isError ? getTheme().colors.error : undefined, children: verbose ? content.trim() : renderTruncatedContent(content.trim(), lines) }) })] }) }));
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Backward-compat wrapper for ARIA callers that use the simplified interface.
|
|
29
|
-
* Accepts content string + optional maxLines + isError, computes line count internally.
|
|
30
|
-
*/
|
|
31
|
-
export function OutputTruncation({ content, maxLines = MAX_RENDERED_LINES, isError, }) {
|
|
32
|
-
const lines = content.split("\n").length;
|
|
33
|
-
return (_jsx(Box, { justifyContent: "space-between", width: "100%", children: _jsx(Box, { flexDirection: "row", children: _jsx(Box, { flexDirection: "column", children: _jsx(Text, { color: isError ? getTheme().colors.error : undefined, children: renderTruncatedContent(content.trim(), lines, maxLines) }) }) }) }));
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=OutputTruncation.js.map
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// packages/cli/src/ui/components/PermissionPrompt.tsx
|
|
3
|
-
import { useState, useRef } from "react";
|
|
4
|
-
import { Box, Text, useInput } from "ink";
|
|
5
|
-
import { getTheme } from "../theme/index.js";
|
|
6
|
-
import { CompactDiff } from "./StructuredDiff.js";
|
|
7
|
-
import { isEscapeInput } from "../utils/keys.js";
|
|
8
|
-
export function PermissionPrompt({ toolName, description, diff, riskLevel = "moderate", onChoice, isActive = true, }) {
|
|
9
|
-
const theme = getTheme();
|
|
10
|
-
const [selected, setSelected] = useState(0);
|
|
11
|
-
const submittedRef = useRef(false);
|
|
12
|
-
const options = [
|
|
13
|
-
{ key: "y", label: "Yes", choice: "yes" },
|
|
14
|
-
{ key: "n", label: "No", choice: "no" },
|
|
15
|
-
{ key: "a", label: "Always allow this session", choice: "always" },
|
|
16
|
-
];
|
|
17
|
-
// Risk level colors
|
|
18
|
-
const riskColors = {
|
|
19
|
-
low: theme.colors.success,
|
|
20
|
-
moderate: theme.colors.warning,
|
|
21
|
-
high: theme.colors.error,
|
|
22
|
-
};
|
|
23
|
-
// Only use input handling when stdin supports raw mode
|
|
24
|
-
const isRawModeSupported = process.stdin.isTTY ?? false;
|
|
25
|
-
const submit = (choice) => {
|
|
26
|
-
if (submittedRef.current)
|
|
27
|
-
return;
|
|
28
|
-
submittedRef.current = true;
|
|
29
|
-
onChoice(choice);
|
|
30
|
-
};
|
|
31
|
-
useInput((input, key) => {
|
|
32
|
-
if (submittedRef.current)
|
|
33
|
-
return;
|
|
34
|
-
const lowerInput = input.toLowerCase();
|
|
35
|
-
// Direct key selection
|
|
36
|
-
const directMatch = options.find((o) => o.key === lowerInput);
|
|
37
|
-
if (directMatch) {
|
|
38
|
-
submit(directMatch.choice);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
// Arrow navigation
|
|
42
|
-
if (key.leftArrow) {
|
|
43
|
-
setSelected((s) => Math.max(0, s - 1));
|
|
44
|
-
}
|
|
45
|
-
else if (key.rightArrow) {
|
|
46
|
-
setSelected((s) => Math.min(options.length - 1, s + 1));
|
|
47
|
-
}
|
|
48
|
-
else if (key.return) {
|
|
49
|
-
submit(options[selected].choice);
|
|
50
|
-
}
|
|
51
|
-
else if (isEscapeInput(input, key)) {
|
|
52
|
-
submit("no");
|
|
53
|
-
}
|
|
54
|
-
}, { isActive: isActive && isRawModeSupported });
|
|
55
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: riskColors[riskLevel], paddingX: 1, paddingY: 1, width: 60, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: riskColors[riskLevel], children: "Permission Required" }), riskLevel !== "low" && _jsxs(Text, { color: riskColors[riskLevel], children: [" \u2022 Risk: ", riskLevel] })] }), _jsx(Box, { marginBottom: 1, height: 6, overflowY: "hidden", children: _jsxs(Text, { wrap: "wrap", children: [_jsxs(Text, { bold: true, children: [theme.symbols.pending, " ", toolName] }), _jsxs(Text, { color: theme.colors.textMuted, children: [": ", description] })] }) }), diff && (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: theme.colors.secondary, paddingX: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Changes:" }), _jsx(CompactDiff, { diff: diff, maxLines: 8 })] })), _jsx(Box, { gap: 2, children: options.map((option, index) => (_jsxs(Text, { inverse: index === selected, color: index === selected ? theme.colors.primary : undefined, children: ["[", option.key.toUpperCase(), "] ", option.label] }, option.key))) })] }));
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Simple yes/no confirmation
|
|
59
|
-
*/
|
|
60
|
-
export function ConfirmPrompt({ message, onConfirm, onCancel, }) {
|
|
61
|
-
const theme = getTheme();
|
|
62
|
-
const submittedRef = useRef(false);
|
|
63
|
-
// Only use input handling when stdin supports raw mode
|
|
64
|
-
const isRawModeSupported = process.stdin.isTTY ?? false;
|
|
65
|
-
useInput((input, key) => {
|
|
66
|
-
if (submittedRef.current)
|
|
67
|
-
return;
|
|
68
|
-
if (input.toLowerCase() === "y" || key.return) {
|
|
69
|
-
submittedRef.current = true;
|
|
70
|
-
onConfirm();
|
|
71
|
-
}
|
|
72
|
-
else if (input.toLowerCase() === "n" || isEscapeInput(input, key)) {
|
|
73
|
-
submittedRef.current = true;
|
|
74
|
-
onCancel();
|
|
75
|
-
}
|
|
76
|
-
}, { isActive: isRawModeSupported });
|
|
77
|
-
return (_jsxs(Box, { children: [_jsxs(Text, { children: [message, " "] }), _jsx(Text, { color: theme.colors.textMuted, children: "[Y/n]" })] }));
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=PermissionPrompt.js.map
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { getTheme } from "../theme/index.js";
|
|
4
|
-
function formatMs(value) {
|
|
5
|
-
if (value < 1000)
|
|
6
|
-
return `${Math.round(value)}ms`;
|
|
7
|
-
return `${(value / 1000).toFixed(2)}s`;
|
|
8
|
-
}
|
|
9
|
-
export function PipelineTimingPanel({ report, }) {
|
|
10
|
-
const theme = getTheme();
|
|
11
|
-
if (!report || report.phases.length === 0)
|
|
12
|
-
return null;
|
|
13
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: theme.colors.textMuted, children: [" Pipeline timing (", formatMs(report.totalMs), ")"] }), report.phases.map((phase) => (_jsxs(Box, { children: [_jsxs(Text, { color: theme.colors.info, children: [" ", phase.phase.padEnd(24)] }), _jsxs(Text, { color: theme.colors.text, children: [" ", formatMs(phase.durationMs)] }), _jsxs(Text, { color: theme.colors.textMuted, children: [" (", phase.pct, "%)"] })] }, `${phase.phase}:${phase.durationMs}`)))] }));
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=PipelineTimingPanel.js.map
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import { Box, Text, useInput } from "ink";
|
|
4
|
-
import { getTheme } from "../theme/index.js";
|
|
5
|
-
import { isEscapeInput } from "../utils/keys.js";
|
|
6
|
-
function StatusIndicator({ status }) {
|
|
7
|
-
const theme = getTheme();
|
|
8
|
-
if (status === "connected") {
|
|
9
|
-
return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " connected"] });
|
|
10
|
-
}
|
|
11
|
-
if (status === "available") {
|
|
12
|
-
return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " available"] });
|
|
13
|
-
}
|
|
14
|
-
return _jsx(Text, { color: theme.colors.textMuted, children: "\u00b7" });
|
|
15
|
-
}
|
|
16
|
-
export function ProviderMethodPicker({ options, onSelect, onCancel, title = "Select login method:", isActive = true, }) {
|
|
17
|
-
const theme = getTheme();
|
|
18
|
-
const [selected, setSelectedState] = useState(0);
|
|
19
|
-
const selectedRef = useRef(0);
|
|
20
|
-
const submittedRef = useRef(false);
|
|
21
|
-
const isRawModeSupported = process.stdin.isTTY ?? false;
|
|
22
|
-
// Reset state when options change — prevents stale submittedRef from a
|
|
23
|
-
// previous interaction blocking input in the reused component instance
|
|
24
|
-
// (React reconciles the same JSX position without remounting).
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
submittedRef.current = false;
|
|
27
|
-
selectedRef.current = 0;
|
|
28
|
-
setSelectedState(0);
|
|
29
|
-
}, [options]);
|
|
30
|
-
const setSelected = (update) => {
|
|
31
|
-
setSelectedState((current) => {
|
|
32
|
-
const next = update(current);
|
|
33
|
-
selectedRef.current = next;
|
|
34
|
-
return next;
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
useInput((input, key) => {
|
|
38
|
-
if (submittedRef.current)
|
|
39
|
-
return;
|
|
40
|
-
if (key.upArrow) {
|
|
41
|
-
setSelected((s) => Math.max(0, s - 1));
|
|
42
|
-
}
|
|
43
|
-
else if (key.downArrow) {
|
|
44
|
-
setSelected((s) => Math.min(options.length - 1, s + 1));
|
|
45
|
-
}
|
|
46
|
-
else if (key.return) {
|
|
47
|
-
submittedRef.current = true;
|
|
48
|
-
onSelect(options[selectedRef.current]);
|
|
49
|
-
}
|
|
50
|
-
else if (isEscapeInput(input, key)) {
|
|
51
|
-
submittedRef.current = true;
|
|
52
|
-
onCancel();
|
|
53
|
-
}
|
|
54
|
-
}, { isActive: isActive && isRawModeSupported });
|
|
55
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.colors.secondary, paddingX: 1, paddingY: 1, width: 64, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: title }) }), options.map((option, index) => {
|
|
56
|
-
const isHovered = index === selected;
|
|
57
|
-
const pointer = isHovered ? "\u25b8" : " ";
|
|
58
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: isHovered ? theme.colors.primary : undefined, children: pointer }), _jsx(Text, { color: isHovered ? theme.colors.primary : undefined, bold: isHovered, children: option.label }), _jsx(StatusIndicator, { status: option.status })] }), option.description && (_jsx(Box, { marginLeft: 3, children: _jsx(Text, { color: theme.colors.textMuted, dimColor: true, children: option.description }) }))] }, option.id));
|
|
59
|
-
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.colors.textMuted, children: ["\u2191\u2193", " Navigate Enter Select Esc Cancel"] }) })] }));
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=ProviderMethodPicker.js.map
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// packages/cli/src/ui/components/ProviderPicker.tsx
|
|
3
|
-
import { useEffect, useState, useRef } from "react";
|
|
4
|
-
import { Box, Text, useInput } from "ink";
|
|
5
|
-
import { getTheme } from "../theme/index.js";
|
|
6
|
-
import { isEscapeInput } from "../utils/keys.js";
|
|
7
|
-
function StatusIndicator({ status }) {
|
|
8
|
-
const theme = getTheme();
|
|
9
|
-
switch (status) {
|
|
10
|
-
case "connected":
|
|
11
|
-
return _jsxs(Text, { color: theme.colors.success, children: ["\u2713", " connected"] });
|
|
12
|
-
case "expired":
|
|
13
|
-
return _jsxs(Text, { color: theme.colors.error, children: ["\u2717", " expired"] });
|
|
14
|
-
case "none":
|
|
15
|
-
return _jsxs(Text, { color: theme.colors.textMuted, children: ["\u00b7", " not connected"] });
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export function ProviderPicker({ providers, onSelect, onCancel, isActive = true, }) {
|
|
19
|
-
const theme = getTheme();
|
|
20
|
-
const [selected, setSelectedState] = useState(0);
|
|
21
|
-
const selectedRef = useRef(0);
|
|
22
|
-
const submittedRef = useRef(false);
|
|
23
|
-
// Reset state when providers change — prevents stale submittedRef from a
|
|
24
|
-
// previous interaction blocking input in a reused component instance.
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
submittedRef.current = false;
|
|
27
|
-
selectedRef.current = 0;
|
|
28
|
-
setSelectedState(0);
|
|
29
|
-
}, [providers]);
|
|
30
|
-
const setSelected = (update) => {
|
|
31
|
-
setSelectedState((current) => {
|
|
32
|
-
const next = update(current);
|
|
33
|
-
selectedRef.current = next;
|
|
34
|
-
return next;
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
// Only use input handling when stdin supports raw mode
|
|
38
|
-
const isRawModeSupported = process.stdin.isTTY ?? false;
|
|
39
|
-
useInput((input, key) => {
|
|
40
|
-
if (submittedRef.current)
|
|
41
|
-
return;
|
|
42
|
-
if (key.upArrow) {
|
|
43
|
-
setSelected((s) => Math.max(0, s - 1));
|
|
44
|
-
}
|
|
45
|
-
else if (key.downArrow) {
|
|
46
|
-
setSelected((s) => Math.min(providers.length - 1, s + 1));
|
|
47
|
-
}
|
|
48
|
-
else if (key.return) {
|
|
49
|
-
submittedRef.current = true;
|
|
50
|
-
onSelect(providers[selectedRef.current]);
|
|
51
|
-
}
|
|
52
|
-
else if (isEscapeInput(input, key)) {
|
|
53
|
-
submittedRef.current = true;
|
|
54
|
-
onCancel();
|
|
55
|
-
}
|
|
56
|
-
}, { isActive: isActive && isRawModeSupported });
|
|
57
|
-
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.colors.secondary, paddingX: 1, paddingY: 1, width: 56, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Select a provider:" }) }), providers.map((provider, index) => {
|
|
58
|
-
const isHovered = index === selected;
|
|
59
|
-
const pointer = isHovered ? "\u25b8" : " ";
|
|
60
|
-
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: isHovered ? theme.colors.primary : undefined, children: pointer }), _jsx(Text, { color: isHovered ? theme.colors.primary : undefined, bold: isHovered, children: provider.label.padEnd(28) }), _jsx(StatusIndicator, { status: provider.status })] }, provider.id));
|
|
61
|
-
}), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.colors.textMuted, children: ["\u2191\u2193", " Navigate Enter Select Esc Cancel"] }) })] }));
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=ProviderPicker.js.map
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* Flat dispatcher for the new rendering pipeline.
|
|
4
|
-
* Replaces MessageRouter — dispatches by RenderItem.kind instead of
|
|
5
|
-
* DisplayMessage.type + ContentBlock.type.
|
|
6
|
-
*
|
|
7
|
-
* Reuses existing components: UserTextMessage, ThinkingBlock, ToolExecution.
|
|
8
|
-
*/
|
|
9
|
-
import * as React from "react";
|
|
10
|
-
import { Box, Text } from "ink";
|
|
11
|
-
import wrapAnsi from "wrap-ansi";
|
|
12
|
-
import { UserTextMessage } from "./messages/UserTextMessage.js";
|
|
13
|
-
import { UserImageMessage } from "./messages/UserImageMessage.js";
|
|
14
|
-
import { ThinkingBlock } from "./ThinkingBlock.js";
|
|
15
|
-
import { ToolExecution } from "./ToolExecution.js";
|
|
16
|
-
import { getTheme } from "../theme/index.js";
|
|
17
|
-
import { applyMarkdown } from "../markdown/index.js";
|
|
18
|
-
import { useTerminalSize } from "../hooks/useTerminalSize.js";
|
|
19
|
-
export const RenderItemView = React.memo(function RenderItemView({ item, displayMode, showPrefix, previewTailLines }) {
|
|
20
|
-
const verbose = displayMode === "debug";
|
|
21
|
-
const { columns } = useTerminalSize();
|
|
22
|
-
switch (item.kind) {
|
|
23
|
-
case "user-message":
|
|
24
|
-
return (_jsx(UserTextMessage, { param: { type: "text", text: item.text }, userName: item.userName, columns: columns, addMargin: showPrefix, showPrefix: showPrefix }));
|
|
25
|
-
case "user-image":
|
|
26
|
-
return (_jsx(UserImageMessage, { dataUri: item.dataUri, userName: item.userName, showPrefix: showPrefix }));
|
|
27
|
-
case "assistant-text": {
|
|
28
|
-
const BLACK_CIRCLE = process.platform === "darwin" ? "\u23FA" : "\u25CF";
|
|
29
|
-
const arionColor = item.arion?.color ?? "cyan";
|
|
30
|
-
const contentWidth = Math.max(columns - 4, 20);
|
|
31
|
-
const rendered = applyMarkdown(item.text, {
|
|
32
|
-
width: contentWidth,
|
|
33
|
-
mode: item.committed ? "final" : "streaming",
|
|
34
|
-
});
|
|
35
|
-
const tailLines = !item.committed && previewTailLines
|
|
36
|
-
? Math.max(previewTailLines - (showPrefix && item.arion ? 1 : 0), 1)
|
|
37
|
-
: undefined;
|
|
38
|
-
const displayText = tailLines != null
|
|
39
|
-
? sliceRenderedTailByVisibleLines(rendered, contentWidth, tailLines)
|
|
40
|
-
: rendered;
|
|
41
|
-
return (_jsxs(Box, { flexDirection: "column", children: [showPrefix && item.arion && (_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsxs(Text, { children: [item.arion.emoji, " "] }), _jsx(Text, { bold: true, color: arionColor, children: item.arion.name })] })), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: arionColor, children: BLACK_CIRCLE }) }), _jsx(Box, { flexShrink: 1, width: contentWidth, children: _jsx(Text, { children: displayText }) })] })] }));
|
|
42
|
-
}
|
|
43
|
-
case "thinking": {
|
|
44
|
-
// Collapsed (standard mode): content is empty, durationSec preserved
|
|
45
|
-
if (!item.content && item.durationSec != null) {
|
|
46
|
-
return (_jsxs(Box, { flexDirection: "column", children: [showPrefix && item.arion && (_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsxs(Text, { children: [item.arion.emoji, " "] }), _jsx(Text, { bold: true, color: item.arion.color, children: item.arion.name })] })), _jsxs(Text, { dimColor: true, children: ["\u273B", " Thought for ", item.durationSec.toFixed(1), "s"] })] }));
|
|
47
|
-
}
|
|
48
|
-
if (!item.content)
|
|
49
|
-
return null;
|
|
50
|
-
// Full thinking (debug mode) — delegate to existing ThinkingBlock
|
|
51
|
-
return (_jsx(ThinkingBlock, { content: item.content, expanded: verbose, durationSeconds: item.durationSec, arionName: showPrefix ? item.arion?.name : undefined, arionEmoji: showPrefix ? item.arion?.emoji : undefined, arionColor: showPrefix ? item.arion?.color : undefined, isLive: !item.committed }));
|
|
52
|
-
}
|
|
53
|
-
case "tool-execution":
|
|
54
|
-
return _jsx(ToolExecution, { item: item, verbose: verbose });
|
|
55
|
-
case "error": {
|
|
56
|
-
const theme = getTheme();
|
|
57
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.colors.error, children: item.message }), item.suggestion && _jsxs(Text, { dimColor: true, children: [" Suggestion: ", item.suggestion] })] }));
|
|
58
|
-
}
|
|
59
|
-
case "handoff":
|
|
60
|
-
return (_jsxs(Text, { dimColor: true, children: [item.direction === "outgoing" ? "\u2192" : "\u2190", " Handoff to ", item.target] }));
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
function sliceRenderedTailByVisibleLines(rendered, width, tailLines) {
|
|
64
|
-
const visibleLines = rendered.split("\n").flatMap((line) => wrapAnsi(line, width, {
|
|
65
|
-
hard: false,
|
|
66
|
-
trim: false,
|
|
67
|
-
wordWrap: true,
|
|
68
|
-
}).split("\n"));
|
|
69
|
-
return visibleLines.slice(-tailLines).join("\n");
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=RenderItemView.js.map
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
// packages/cli/src/ui/components/Spinner.tsx
|
|
3
|
-
// Changes: theme → ARIA's, MESSAGES → VERB_PAIRS.map(p => p.present), removed getSessionState
|
|
4
|
-
import { Box, Text } from "ink";
|
|
5
|
-
import { useEffect, useRef, useState } from "react";
|
|
6
|
-
import { getTheme } from "../theme/index.js";
|
|
7
|
-
import { VERB_PAIRS } from "../verb-pairs.js";
|
|
8
|
-
function sample(arr) {
|
|
9
|
-
return arr[Math.floor(Math.random() * arr.length)];
|
|
10
|
-
}
|
|
11
|
-
// NB: The third character in this string is an emoji that
|
|
12
|
-
// renders on Windows consoles with a green background
|
|
13
|
-
const CHARACTERS = process.platform === "darwin" ? ["·", "✢", "✳", "∗", "✻", "✽"] : ["·", "✢", "*", "∗", "✻", "✽"];
|
|
14
|
-
const MESSAGES = VERB_PAIRS.map((p) => p.present);
|
|
15
|
-
export function Spinner() {
|
|
16
|
-
const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
|
|
17
|
-
const [frame, setFrame] = useState(0);
|
|
18
|
-
const [elapsedTime, setElapsedTime] = useState(0);
|
|
19
|
-
const message = useRef(sample(MESSAGES));
|
|
20
|
-
const startTime = useRef(Date.now());
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
const timer = setInterval(() => {
|
|
23
|
-
setFrame((f) => (f + 1) % frames.length);
|
|
24
|
-
}, 120);
|
|
25
|
-
return () => clearInterval(timer);
|
|
26
|
-
}, [frames.length]);
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
const timer = setInterval(() => {
|
|
29
|
-
setElapsedTime(Math.floor((Date.now() - startTime.current) / 1000));
|
|
30
|
-
}, 1000);
|
|
31
|
-
return () => clearInterval(timer);
|
|
32
|
-
}, []);
|
|
33
|
-
return (_jsxs(Box, { flexDirection: "row", marginTop: 1, children: [_jsx(Box, { flexWrap: "nowrap", height: 1, width: 2, children: _jsx(Text, { color: getTheme().colors.primary, children: frames[frame] }) }), _jsxs(Text, { color: getTheme().colors.primary, children: [message.current, "\u2026 "] }), _jsxs(Text, { color: getTheme().colors.textMuted, children: ["(", elapsedTime, "s \u00B7 ", _jsx(Text, { bold: true, children: "esc" }), " to interrupt)"] })] }));
|
|
34
|
-
}
|
|
35
|
-
export function SimpleSpinner() {
|
|
36
|
-
const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
|
|
37
|
-
const [frame, setFrame] = useState(0);
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
const timer = setInterval(() => {
|
|
40
|
-
setFrame((f) => (f + 1) % frames.length);
|
|
41
|
-
}, 120);
|
|
42
|
-
return () => clearInterval(timer);
|
|
43
|
-
}, [frames.length]);
|
|
44
|
-
return (_jsx(Box, { flexWrap: "nowrap", height: 1, width: 2, children: _jsx(Text, { color: getTheme().colors.primary, children: frames[frame] }) }));
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=Spinner.js.map
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import { getArionColor, getModelColor, getModelProviderIcon, shortModelName } from "../theme.js";
|
|
4
|
-
/** Default autonomy level — matches DEFAULT_SAFETY_CONFIG.autonomy in @aria/aria */
|
|
5
|
-
export const DEFAULT_AUTONOMY = "balanced";
|
|
6
|
-
/**
|
|
7
|
-
* Format a token count into human-friendly compact notation.
|
|
8
|
-
* Examples: 0, 842, 1.2k, 45.6k, 1.2M
|
|
9
|
-
*/
|
|
10
|
-
export function formatTokens(tokens) {
|
|
11
|
-
if (tokens < 1000)
|
|
12
|
-
return String(tokens);
|
|
13
|
-
if (tokens < 1_000_000) {
|
|
14
|
-
const k = tokens / 1000;
|
|
15
|
-
return k >= 100 ? `${Math.round(k)}k` : `${k.toFixed(1)}k`;
|
|
16
|
-
}
|
|
17
|
-
const m = tokens / 1_000_000;
|
|
18
|
-
return m >= 100 ? `${Math.round(m)}M` : `${m.toFixed(1)}M`;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Format cost in USD with 2 decimal places.
|
|
22
|
-
* Examples: $0.00, $0.12, $1.50
|
|
23
|
-
*/
|
|
24
|
-
export function formatCost(cost) {
|
|
25
|
-
return `$${cost.toFixed(2)}`;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Format wall-clock time in human-readable format.
|
|
29
|
-
* Examples: 0.0s, 1.2s, 45.3s, 2m 15s
|
|
30
|
-
*/
|
|
31
|
-
export function formatWallTime(seconds) {
|
|
32
|
-
if (seconds < 60) {
|
|
33
|
-
return `${seconds.toFixed(1)}s`;
|
|
34
|
-
}
|
|
35
|
-
const mins = Math.floor(seconds / 60);
|
|
36
|
-
const secs = Math.round(seconds % 60);
|
|
37
|
-
return `${mins}m ${secs}s`;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Get context window fill percentage (0–100).
|
|
41
|
-
*/
|
|
42
|
-
export function contextPercent(contextTokens, maxTokens) {
|
|
43
|
-
if (maxTokens <= 0)
|
|
44
|
-
return 0;
|
|
45
|
-
return Math.min(100, Math.round((contextTokens / maxTokens) * 100));
|
|
46
|
-
}
|
|
47
|
-
/** Anthropic-style lavender purple for the context gauge */
|
|
48
|
-
const GAUGE_COLOR = "#B4A0FF";
|
|
49
|
-
/** Effort display: visual bars with semantic colors */
|
|
50
|
-
const EFFORT_DISPLAY = {
|
|
51
|
-
low: { bars: "▌", color: "blue" },
|
|
52
|
-
medium: { bars: "▌▌", color: "cyan" },
|
|
53
|
-
high: { bars: "▌▌▌", color: "yellow" },
|
|
54
|
-
max: { bars: "▌▌▌▌", color: "magenta" },
|
|
55
|
-
};
|
|
56
|
-
/** Autonomy display: describes actual behavior, visually distinct per level */
|
|
57
|
-
const AUTONOMY_DISPLAY = {
|
|
58
|
-
minimal: { symbol: "▸", label: "confirm all", color: "green" },
|
|
59
|
-
balanced: { symbol: "▸▸", label: "confirm risky", color: "yellow" },
|
|
60
|
-
high: { symbol: "▸▸▸", label: "auto-approve", color: "magenta" },
|
|
61
|
-
full: { symbol: "⏵⏵", label: "full bypass", color: "red" },
|
|
62
|
-
};
|
|
63
|
-
const GAUGE_WIDTH = 8;
|
|
64
|
-
const SEP = " · ";
|
|
65
|
-
/**
|
|
66
|
-
* Status bar — context-first, purple gauge, with autonomy indicator.
|
|
67
|
-
*
|
|
68
|
-
* Idle:
|
|
69
|
-
* 🦋 ARIA · opus-4.6 ⏵⏵ bypass ctx ░░░░░░░░ –
|
|
70
|
-
*
|
|
71
|
-
* During run (standard):
|
|
72
|
-
* 🦋 ARIA · opus-4.6 · Turn 3 · 45.6k/200k ⏵⏵ bypass ctx ████░░░░ 23%
|
|
73
|
-
*
|
|
74
|
-
* During run (debug — adds cost + time):
|
|
75
|
-
* 🦋 ARIA · opus-4.6 · Turn 3 · 45.6k/200k · $0.02 · 2.1s ⏵⏵ bypass ctx ████░░░░ 23%
|
|
76
|
-
*/
|
|
77
|
-
export function StatusBar({ arion, model, maxContextTokens = 0, responseTime, metrics, showCosts = true, displayMode, activeArion, effortLevel, autonomyLevel = DEFAULT_AUTONOMY, meshMessageCount = 0, connectionState = "connected", }) {
|
|
78
|
-
const arionHex = getArionColor(arion.color);
|
|
79
|
-
const displayModel = shortModelName(model);
|
|
80
|
-
const modelColor = getModelColor(displayModel);
|
|
81
|
-
const providerIcon = getModelProviderIcon(displayModel);
|
|
82
|
-
const isDebug = displayMode === "debug";
|
|
83
|
-
// Show metrics when available (turn > 0 means a run has started)
|
|
84
|
-
const hasMetrics = metrics && metrics.turnCount > 0;
|
|
85
|
-
// Context window gauge
|
|
86
|
-
const ctxTokens = hasMetrics ? metrics.contextTokens : 0;
|
|
87
|
-
const pct = maxContextTokens > 0 ? contextPercent(ctxTokens, maxContextTokens) : 0;
|
|
88
|
-
const filledBlocks = Math.min(GAUGE_WIDTH, Math.round((pct / 100) * GAUGE_WIDTH));
|
|
89
|
-
const emptyBlocks = GAUGE_WIDTH - filledBlocks;
|
|
90
|
-
const gaugeLabel = hasMetrics ? `${pct}%` : "–";
|
|
91
|
-
// Autonomy indicator
|
|
92
|
-
const auto = AUTONOMY_DISPLAY[autonomyLevel];
|
|
93
|
-
return (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsxs(Text, { children: [arion.emoji, " "] }), _jsx(Text, { color: arionHex, bold: true, children: arion.name }), _jsx(Text, { dimColor: true, children: SEP }), hasMetrics ? (_jsxs(_Fragment, { children: [providerIcon && _jsxs(Text, { color: providerIcon.color, children: [providerIcon.icon, " "] }), _jsx(Text, { color: modelColor, dimColor: !modelColor, children: displayModel }), effortLevel && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { color: EFFORT_DISPLAY[effortLevel].color, children: EFFORT_DISPLAY[effortLevel].bars })] })), _jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { dimColor: true, children: ["Turn ", metrics.turnCount] }), _jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { color: metrics.contextStale ? undefined : GAUGE_COLOR, dimColor: metrics.contextStale, children: [metrics.contextStale ? "~" : "", formatTokens(metrics.contextTokens)] }), maxContextTokens > 0 && _jsxs(Text, { dimColor: true, children: ["/", formatTokens(maxContextTokens)] }), isDebug && showCosts && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: formatCost(metrics.estimatedCost) })] })), isDebug && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: formatWallTime(metrics.wallTimeSeconds) })] })), activeArion && activeArion !== arion.name && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { dimColor: true, children: activeArion })] }))] })) : (_jsxs(_Fragment, { children: [providerIcon && _jsxs(Text, { color: providerIcon.color, children: [providerIcon.icon, " "] }), _jsx(Text, { color: modelColor, dimColor: !modelColor, children: displayModel }), effortLevel && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsx(Text, { color: EFFORT_DISPLAY[effortLevel].color, children: EFFORT_DISPLAY[effortLevel].bars })] })), responseTime !== undefined && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: SEP }), _jsxs(Text, { dimColor: true, children: [responseTime.toFixed(1), "s"] })] }))] }))] }), _jsxs(Box, { gap: 1, children: [connectionState === "disconnected" && (_jsx(Text, { color: "red", bold: true, children: "\u26A1 offline" })), connectionState === "reconnecting" && (_jsx(Text, { color: "yellow", bold: true, children: "\u21BB reconnecting\u2026" })), meshMessageCount > 0 && (_jsxs(Text, { color: "yellow", bold: true, children: ["msg ", meshMessageCount] })), _jsxs(Text, { color: auto.color, children: [auto.symbol, " ", auto.label] }), _jsx(Text, { dimColor: true, children: "ctx" }), _jsx(Text, { color: GAUGE_COLOR, children: "█".repeat(filledBlocks) }), _jsx(Text, { dimColor: true, children: "░".repeat(emptyBlocks) }), _jsx(Text, { color: GAUGE_COLOR, children: gaugeLabel })] })] }));
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
// packages/cli/src/ui/components/StreamingIndicator.tsx
|
|
3
|
-
import { useRef } from "react";
|
|
4
|
-
import { Box, Text } from "ink";
|
|
5
|
-
import gradient from "gradient-string";
|
|
6
|
-
import { getTheme } from "../theme/index.js";
|
|
7
|
-
import { pickRandomVerbPair } from "../verb-pairs.js";
|
|
8
|
-
// Subtle gradient in the primary color family — soft shimmer effect
|
|
9
|
-
const GRADIENT_COLORS = ["#5f97cd", "#7baed4", "#97c4db", "#7baed4"];
|
|
10
|
-
const CHARACTERS = process.platform === "darwin" ? ["·", "✢", "✳", "∗", "✻", "✽"] : ["·", "✢", "*", "∗", "✻", "✽"];
|
|
11
|
-
function formatElapsed(seconds) {
|
|
12
|
-
if (seconds < 60)
|
|
13
|
-
return `${seconds}s`;
|
|
14
|
-
const m = Math.floor(seconds / 60);
|
|
15
|
-
const s = seconds % 60;
|
|
16
|
-
return `${m}m ${s}s`;
|
|
17
|
-
}
|
|
18
|
-
function formatTokens(tokens) {
|
|
19
|
-
if (tokens >= 1000)
|
|
20
|
-
return `${(tokens / 1000).toFixed(1)}k tokens`;
|
|
21
|
-
return `${tokens} tokens`;
|
|
22
|
-
}
|
|
23
|
-
export function StreamingIndicator({ state, elapsedSeconds, totalTokens, thoughtForSeconds, currentVerb, }) {
|
|
24
|
-
const frames = [...CHARACTERS, ...[...CHARACTERS].reverse()];
|
|
25
|
-
// Derive animation frame from wall clock — no internal timer, no independent renders.
|
|
26
|
-
// The component re-renders only when the PARENT re-renders (driven by the single
|
|
27
|
-
// render scheduler), keeping all dynamic zone updates in one atomic write.
|
|
28
|
-
const frame = Math.floor(Date.now() / 120) % frames.length;
|
|
29
|
-
// Fallback from the same VERB_PAIRS list used by thinking blocks,
|
|
30
|
-
// so the indicator and ThinkingBlock verbs are always from the same family.
|
|
31
|
-
const fallbackVerb = useRef(pickRandomVerbPair().present);
|
|
32
|
-
const displayVerb = currentVerb || fallbackVerb.current;
|
|
33
|
-
const theme = getTheme();
|
|
34
|
-
// Build gradient-colored verb text
|
|
35
|
-
const offset = frame % GRADIENT_COLORS.length;
|
|
36
|
-
const shifted = [...GRADIENT_COLORS.slice(offset), ...GRADIENT_COLORS.slice(0, offset)];
|
|
37
|
-
const grad = gradient(shifted);
|
|
38
|
-
const verbText = `${frames[frame]} ${displayVerb}…`;
|
|
39
|
-
const coloredVerb = grad(verbText);
|
|
40
|
-
// Build metrics string
|
|
41
|
-
const elapsed = formatElapsed(elapsedSeconds);
|
|
42
|
-
const tokens = formatTokens(totalTokens);
|
|
43
|
-
let metricsStr;
|
|
44
|
-
if (state === "thinking") {
|
|
45
|
-
metricsStr = "(thinking)";
|
|
46
|
-
}
|
|
47
|
-
else if (thoughtForSeconds && thoughtForSeconds > 0) {
|
|
48
|
-
metricsStr = `(${elapsed} · ↓ ${tokens} · thought for ${formatElapsed(thoughtForSeconds)})`;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
metricsStr = `(${elapsed} · ↓ ${tokens} · esc to cancel)`;
|
|
52
|
-
}
|
|
53
|
-
return (_jsxs(Box, { flexDirection: "row", marginTop: 1, children: [_jsxs(Text, { children: [coloredVerb, " "] }), _jsx(Text, { color: theme.colors.textMuted, children: metricsStr })] }));
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=StreamingIndicator.js.map
|