diff --git a/src/cli/App.tsx b/src/cli/App.tsx index b7fc2e8..4efe3aa 100644 --- a/src/cli/App.tsx +++ b/src/cli/App.tsx @@ -134,7 +134,7 @@ import { PendingApprovalStub } from "./components/PendingApprovalStub"; import { PinDialog, validateAgentName } from "./components/PinDialog"; import { ProviderSelector } from "./components/ProviderSelector"; import { ReasoningMessage } from "./components/ReasoningMessageRich"; -import { formatUsageStats } from "./components/SessionStats"; +import { formatDuration, formatUsageStats } from "./components/SessionStats"; // InlinePlanApproval kept for easy rollback if needed // import { InlinePlanApproval } from "./components/InlinePlanApproval"; import { StatusMessage } from "./components/StatusMessage"; @@ -166,6 +166,7 @@ import { } from "./helpers/diff"; import { setErrorContext } from "./helpers/errorContext"; import { formatErrorDetails } from "./helpers/errorFormatter"; +import { formatCompact } from "./helpers/format"; import { parsePatchOperations } from "./helpers/formatArgsDisplay"; import { buildMemoryReminder, @@ -9795,55 +9796,61 @@ Plan file path: ${planFilePath}`; {/* Exit stats - shown when exiting via double Ctrl+C */} - {showExitStats && ( - - - {formatUsageStats({ - stats: sessionStatsRef.current.getSnapshot(), - })} - - {/* Alien + Resume commands */} - - {" ▗▖▗▖ "} - Resume this agent with: - - - {"▙█▜▛█▟ "} - - {/* Show -n "name" if agent has name and is pinned, otherwise --agent */} - {agentName && - (settingsManager.getLocalPinnedAgents().includes(agentId) || - settingsManager.getGlobalPinnedAgents().includes(agentId)) - ? `letta -n "${agentName}"` - : `letta --agent ${agentId}`} - - - {/* Only show conversation hint if not on default (default is resumed automatically) */} - {conversationId !== "default" ? ( - <> + {showExitStats && + (() => { + const stats = sessionStatsRef.current.getSnapshot(); + return ( + + {/* Alien + Stats (3 lines) */} - {"▝▜▛▜▛▘ "} - Resume this conversation with: - - - {" ▀ ▀ "} - - {`letta --conv ${conversationId}`} + {" ▗▖▗▖ "} + + Total duration (API): {formatDuration(stats.totalApiMs)} - - ) : ( - <> - {"▝▜▛▜▛▘ "} + {"▙█▜▛█▟ "} + + Total duration (wall):{" "} + {formatDuration(stats.totalWallMs)} + - {" ▀ ▀ "} + {"▝▜▛▜▛▘ "} + + Session usage: {stats.usage.stepCount} steps,{" "} + {formatCompact(stats.usage.promptTokens)} input,{" "} + {formatCompact(stats.usage.completionTokens)} output + - - )} - - )} + {/* Resume commands (no alien) */} + + Resume this agent with: + + {/* Show -n "name" if agent has name and is pinned, otherwise --agent */} + {agentName && + (settingsManager + .getLocalPinnedAgents() + .includes(agentId) || + settingsManager + .getGlobalPinnedAgents() + .includes(agentId)) + ? `letta -n "${agentName}"` + : `letta --agent ${agentId}`} + + {/* Only show conversation hint if not on default (default is resumed automatically) */} + {conversationId !== "default" && ( + <> + + Resume this conversation with: + + {`letta --conv ${conversationId}`} + + + )} + + ); + })()} {/* Input row - always mounted to preserve state */} diff --git a/src/cli/components/AgentInfoBar.tsx b/src/cli/components/AgentInfoBar.tsx index 5efc3f7..2c2cd80 100644 --- a/src/cli/components/AgentInfoBar.tsx +++ b/src/cli/components/AgentInfoBar.tsx @@ -44,7 +44,7 @@ export const AgentInfoBar = memo(function AgentInfoBar({ } // Alien ASCII art lines (4 lines tall, with 2-char indent + extra space before text) - const alienLines = [" ▗▖▗▖ ", " ▙█▜▛█▟ ", " ▝▜▛▜▛▘ ", " ▀ ▀ "]; + const alienLines = [" ▗▖▗▖ ", " ▙█▜▛█▟ ", " ▝▜▛▜▛▘ ", " "]; return ( @@ -107,9 +107,9 @@ export const AgentInfoBar = memo(function AgentInfoBar({ {agentId} - {/* Alien + Conversation ID */} + {/* Phantom alien row + Conversation ID */} - {alienLines[3]} + {alienLines[3]} {conversationId && conversationId !== "default" ? ( {conversationId} ) : (