fix(ui): implement cached startup pre-flight check in SessionService and propagate errors in StaleBanner

This commit is contained in:
2026-07-16 21:18:14 +09:00
parent 2eb85866b3
commit 7c981549a2
3 changed files with 28 additions and 5 deletions
@@ -33,11 +33,14 @@ class StaleBanner extends StatelessWidget {
size: 18, size: 18,
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Expanded(
'⚠ status snapshot stale (last ok: $lastOkText)', child: Text(
style: const TextStyle( '⚠ status snapshot stale (last ok: $lastOkText)${poll.error != null ? ' — Error: ${poll.error}' : ''}',
color: AppColors.warning, style: const TextStyle(
fontWeight: FontWeight.w600, color: AppColors.warning,
fontWeight: FontWeight.w600,
),
overflow: TextOverflow.ellipsis,
), ),
), ),
], ],
@@ -27,7 +27,27 @@ class SessionService {
this.timeout = const Duration(seconds: 5), this.timeout = const Duration(seconds: 5),
}); });
bool _preflightChecked = false;
Future<void> _checkPreflight() async {
if (_preflightChecked) return;
final bashResult = await runCommand(['bash', '--version'], timeout: timeout);
if (bashResult.rc != 0) {
throw StatusFetchException('preflight failed: bash is missing or not executable');
}
final tmuxResult = await runCommand(['tmux', '-V'], timeout: timeout);
if (tmuxResult.rc != 0) {
throw StatusFetchException('preflight failed: tmux is missing or not executable');
}
_preflightChecked = true;
}
Future<SessionsSnapshot> fetchSnapshot() async { Future<SessionsSnapshot> fetchSnapshot() async {
await _checkPreflight();
final result = await runCommand( final result = await runCommand(
['bash', statusScriptPath, '--json'], ['bash', statusScriptPath, '--json'],
timeout: timeout, timeout: timeout,