({
apiKeyStatus,
debug,
exitMessage,
vimMode,
mode,
autoUpdaterResult,
isAutoUpdating,
verbose,
onAutoUpdaterResult,
onChangeIsUpdating,
suggestions,
selectedSuggestion,
maxColumnWidth,
toolPermissionContext,
helpOpen,
suppressHint: suppressHintFromProps,
isLoading,
tasksSelected,
teamsSelected,
bridgeSelected,
tmuxSelected,
teammateFooterIndex,
ideSelection,
mcpClients,
isPasting = false,
isInputWrapped = false,
messages,
isSearching,
historyQuery,
setHistoryQuery,
historyFailedMatch,
onOpenTasksDialog
}: Props)
| 61 | onOpenTasksDialog?: (taskId?: string) => void; |
| 62 | }; |
| 63 | function PromptInputFooter({ |
| 64 | apiKeyStatus, |
| 65 | debug, |
| 66 | exitMessage, |
| 67 | vimMode, |
| 68 | mode, |
| 69 | autoUpdaterResult, |
| 70 | isAutoUpdating, |
| 71 | verbose, |
| 72 | onAutoUpdaterResult, |
| 73 | onChangeIsUpdating, |
| 74 | suggestions, |
| 75 | selectedSuggestion, |
| 76 | maxColumnWidth, |
| 77 | toolPermissionContext, |
| 78 | helpOpen, |
| 79 | suppressHint: suppressHintFromProps, |
| 80 | isLoading, |
| 81 | tasksSelected, |
| 82 | teamsSelected, |
| 83 | bridgeSelected, |
| 84 | tmuxSelected, |
| 85 | teammateFooterIndex, |
| 86 | ideSelection, |
| 87 | mcpClients, |
| 88 | isPasting = false, |
| 89 | isInputWrapped = false, |
| 90 | messages, |
| 91 | isSearching, |
| 92 | historyQuery, |
| 93 | setHistoryQuery, |
| 94 | historyFailedMatch, |
| 95 | onOpenTasksDialog |
| 96 | }: Props): ReactNode { |
| 97 | const settings = useSettings(); |
| 98 | const { |
| 99 | columns, |
| 100 | rows |
| 101 | } = useTerminalSize(); |
| 102 | const messagesRef = useRef(messages); |
| 103 | messagesRef.current = messages; |
| 104 | const lastAssistantMessageId = useMemo(() => getLastAssistantMessageId(messages), [messages]); |
| 105 | const isNarrow = columns < 80; |
| 106 | // In fullscreen the bottom slot is flexShrink:0, so every row here is a row |
| 107 | // stolen from the ScrollBox. Drop the optional StatusLine first. Non-fullscreen |
| 108 | // has terminal scrollback to absorb overflow, so we never hide StatusLine there. |
| 109 | const isFullscreen = isFullscreenEnvEnabled(); |
| 110 | const isShort = isFullscreen && rows < 24; |
| 111 | |
| 112 | // Pill highlights when tasks is the active footer item AND no specific |
| 113 | // agent row is selected. When coordinatorTaskIndex >= 0 the pointer has |
| 114 | // moved into CoordinatorTaskPanel, so the pill should un-highlight. |
| 115 | // coordinatorTaskCount === 0 covers the bash-only case (no agent rows |
| 116 | // exist, pill is the only selectable item). |
| 117 | const coordinatorTaskCount = useCoordinatorTaskCount(); |
| 118 | const coordinatorTaskIndex = useAppState(s => s.coordinatorTaskIndex); |
| 119 | const pillSelected = tasksSelected && (coordinatorTaskCount === 0 || coordinatorTaskIndex < 0); |
| 120 |
nothing calls this directly
no test coverage detected