()
| 125 | const sessionProgress = useFreebuffSessionProgress(freebuffSession) |
| 126 | |
| 127 | const renderStatusIndicator = () => { |
| 128 | switch (statusIndicatorState.kind) { |
| 129 | case 'ctrlC': |
| 130 | return <span fg={theme.secondary}>Press Ctrl-C again to exit</span> |
| 131 | |
| 132 | case 'clipboard': |
| 133 | // Use green color for feedback success messages |
| 134 | const isFeedbackSuccess = |
| 135 | statusIndicatorState.message.includes('Feedback sent') |
| 136 | return ( |
| 137 | <span fg={isFeedbackSuccess ? theme.success : theme.primary}> |
| 138 | {statusIndicatorState.message} |
| 139 | </span> |
| 140 | ) |
| 141 | |
| 142 | case 'reconnected': |
| 143 | return <span fg={theme.success}>Reconnected</span> |
| 144 | |
| 145 | case 'retrying': |
| 146 | return <ShimmerText text="retrying..." primaryColor={theme.warning} /> |
| 147 | |
| 148 | case 'connecting': |
| 149 | return <ShimmerText text="connecting..." /> |
| 150 | |
| 151 | case 'waiting': |
| 152 | return ( |
| 153 | <ShimmerText |
| 154 | text="thinking..." |
| 155 | interval={SHIMMER_INTERVAL_MS} |
| 156 | primaryColor={theme.secondary} |
| 157 | /> |
| 158 | ) |
| 159 | |
| 160 | case 'streaming': |
| 161 | return ( |
| 162 | <ShimmerText |
| 163 | text="working..." |
| 164 | interval={SHIMMER_INTERVAL_MS} |
| 165 | primaryColor={theme.secondary} |
| 166 | /> |
| 167 | ) |
| 168 | |
| 169 | case 'paused': |
| 170 | return null |
| 171 | |
| 172 | case 'idle': |
| 173 | if (sessionProgress !== null) { |
| 174 | const isUrgent = sessionProgress.remainingMs < COUNTDOWN_VISIBLE_MS |
| 175 | const modelName = |
| 176 | freebuffSession?.status === 'active' |
| 177 | ? getFreebuffModel(freebuffSession.model).displayName |
| 178 | : null |
| 179 | return ( |
| 180 | <span fg={isUrgent ? theme.warning : theme.secondary}> |
| 181 | {modelName ? `${modelName} · ` : ''} |
| 182 | {formatSessionRemaining(sessionProgress.remainingMs)} |
| 183 | </span> |
| 184 | ) |
no test coverage detected