fix(tui): remove s:/t: suffixes from footer status bar (#1145)

Co-authored-by: Letta <noreply@letta.com>
This commit is contained in:
Charles Packer
2026-02-25 17:04:06 -08:00
committed by GitHub
parent d665acf393
commit 2c7d445766
3 changed files with 20 additions and 70 deletions

View File

@@ -12293,8 +12293,6 @@ Plan file path: ${planFilePath}`;
currentModel={currentModelDisplay}
currentModelProvider={currentModelProvider}
currentReasoningEffort={currentReasoningEffort}
currentSystemPromptId={currentSystemPromptId}
currentToolset={currentToolset}
messageQueue={messageQueue}
onEnterQueueEditMode={handleEnterQueueEditMode}
onEscapeCancel={

View File

@@ -217,8 +217,6 @@ const InputFooter = memo(function InputFooter({
agentName,
currentModel,
currentReasoningEffort,
currentSystemPromptId,
currentToolset,
isOpenAICodexProvider,
isByokProvider,
hideFooter,
@@ -236,8 +234,6 @@ const InputFooter = memo(function InputFooter({
agentName: string | null | undefined;
currentModel: string | null | undefined;
currentReasoningEffort?: ModelReasoningEffort | null;
currentSystemPromptId?: string | null;
currentToolset?: string | null;
isOpenAICodexProvider: boolean;
isByokProvider: boolean;
hideFooter: boolean;
@@ -256,45 +252,11 @@ const InputFooter = memo(function InputFooter({
const modelWithReasoning =
(currentModel ?? "unknown") + (reasoningTag ? ` (${reasoningTag})` : "");
// Optional suffixes: system prompt id + toolset.
const suffixParts: string[] = [];
if (currentSystemPromptId) {
suffixParts.push(`s:${currentSystemPromptId}`);
}
if (currentToolset) {
suffixParts.push(`t:${currentToolset}`);
}
// Reserve 4 chars per suffix part so the label is visible even on narrow terminals.
const minSuffixBudget = suffixParts.length * 4;
const maxModelChars = Math.max(
8,
rightColumnWidth - baseReservedChars - minSuffixBudget,
);
const maxModelChars = Math.max(8, rightColumnWidth - baseReservedChars);
const displayModel = truncateEnd(modelWithReasoning, maxModelChars);
const baseTextLength =
const rightTextLength =
displayAgentName.length + displayModel.length + byokExtraChars + 3;
const maxSuffixChars = Math.max(0, rightColumnWidth - baseTextLength);
const displaySuffix = (() => {
if (suffixParts.length === 0 || maxSuffixChars <= 0) return "";
let remaining = maxSuffixChars;
const out: string[] = [];
for (const part of suffixParts) {
// Leading space before each part.
if (remaining <= 1) break;
const budget = remaining - 1;
const clipped = truncateEnd(part, budget);
if (!clipped) break;
out.push(` ${clipped}`);
remaining -= 1 + clipped.length;
}
return out.join("");
})();
const rightTextLength = baseTextLength + displaySuffix.length;
const rightPrefixSpaces = Math.max(0, rightColumnWidth - rightTextLength);
const rightLabel = useMemo(() => {
const parts: string[] = [];
@@ -310,16 +272,11 @@ const InputFooter = memo(function InputFooter({
}
parts.push(chalk.dim("]"));
if (displaySuffix) {
parts.push(chalk.dim(displaySuffix));
}
return parts.join("");
}, [
rightPrefixSpaces,
displayAgentName,
displayModel,
displaySuffix,
isByokProvider,
isOpenAICodexProvider,
]);
@@ -559,16 +516,14 @@ const StreamingStatus = memo(function StreamingStatus({
// Uses chalk.dim to match reasoning text styling
// Memoized to prevent unnecessary re-renders during shimmer updates
const statusHintText = useMemo(() => {
const hintColor = chalk.hex(colors.subagent.hint);
const hintBold = hintColor.bold;
const suffix = `${statusHintSuffix})`;
if (interruptRequested) {
return <Text dimColor>{` (interrupting${suffix}`}</Text>;
return hintColor(` (interrupting${suffix}`);
}
return (
<Text dimColor>
{" ("}
<Text bold>esc</Text>
{` to interrupt${suffix}`}
</Text>
hintColor(" (") + hintBold("esc") + hintColor(` to interrupt${suffix}`)
);
}, [interruptRequested, statusHintSuffix]);
@@ -633,8 +588,6 @@ export function Input({
currentModel,
currentModelProvider,
currentReasoningEffort,
currentSystemPromptId,
currentToolset,
messageQueue,
onEnterQueueEditMode,
onEscapeCancel,
@@ -676,8 +629,6 @@ export function Input({
currentModel?: string | null;
currentModelProvider?: string | null;
currentReasoningEffort?: ModelReasoningEffort | null;
currentSystemPromptId?: string | null;
currentToolset?: string | null;
messageQueue?: QueuedMessage[];
onEnterQueueEditMode?: () => void;
onEscapeCancel?: () => void;
@@ -1500,8 +1451,6 @@ export function Input({
agentName={agentName}
currentModel={currentModel}
currentReasoningEffort={currentReasoningEffort}
currentSystemPromptId={currentSystemPromptId}
currentToolset={currentToolset}
isOpenAICodexProvider={
currentModelProvider === OPENAI_CODEX_PROVIDER_NAME
}
@@ -1559,8 +1508,6 @@ export function Input({
statusLineText,
statusLineRight,
statusLinePadding,
currentSystemPromptId,
currentToolset,
promptChar,
promptVisualWidth,
suppressDividers,

View File

@@ -1,3 +1,4 @@
import chalk from "chalk";
import { memo } from "react";
import { colors } from "./colors.js";
import { Text } from "./Text";
@@ -83,13 +84,17 @@ export const ShimmerText = memo(function ShimmerText({
pushRegion(shimmer, start, colors.status.processingShimmer);
pushRegion(after, end, color);
return (
<Text wrap={wrap}>
{segments.map((seg) => (
<Text key={seg.key} color={seg.color} bold={seg.bold}>
{seg.text}
</Text>
))}
</Text>
);
// Use chalk for ALL styling (color + bold) instead of <Text> style props.
// Ink's <Text bold={false}> doesn't emit SGR 22 to reset bold, and mixing
// chalk.bold inside <Text color> gets overwritten by Ink's ANSI handling.
// A single pre-formatted chalk string avoids both issues.
const formatted = segments
.map((seg) => {
let styled = chalk.hex(seg.color || color)(seg.text);
if (seg.bold) styled = chalk.bold(styled);
return styled;
})
.join("");
return <Text wrap={wrap}>{formatted}</Text>;
});