From 7c981549a26368b1a716cbccaf1aef7bf4cec524 Mon Sep 17 00:00:00 2001 From: Godopu Date: Thu, 16 Jul 2026 21:18:14 +0900 Subject: [PATCH] fix(ui): implement cached startup pre-flight check in SessionService and propagate errors in StaleBanner --- .../lib/src/widgets/stale_banner.dart | 13 +++++++----- .../test/incremental_kernel.Ly9AZGFydD0zLjA= | Bin 4027600 -> 4028768 bytes .../lib/src/services/session_service.dart | 20 ++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/.agents/skills/multi-agent-mux-ui/apps/mam_desktop/lib/src/widgets/stale_banner.dart b/.agents/skills/multi-agent-mux-ui/apps/mam_desktop/lib/src/widgets/stale_banner.dart index 9102f0f..b3f93ae 100644 --- a/.agents/skills/multi-agent-mux-ui/apps/mam_desktop/lib/src/widgets/stale_banner.dart +++ b/.agents/skills/multi-agent-mux-ui/apps/mam_desktop/lib/src/widgets/stale_banner.dart @@ -33,11 +33,14 @@ class StaleBanner extends StatelessWidget { size: 18, ), const SizedBox(width: 8), - Text( - '⚠ status snapshot stale (last ok: $lastOkText)', - style: const TextStyle( - color: AppColors.warning, - fontWeight: FontWeight.w600, + Expanded( + child: Text( + '⚠ status snapshot stale (last ok: $lastOkText)${poll.error != null ? ' — Error: ${poll.error}' : ''}', + style: const TextStyle( + color: AppColors.warning, + fontWeight: FontWeight.w600, + ), + overflow: TextOverflow.ellipsis, ), ), ], diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= b/.agents/skills/multi-agent-mux-ui/packages/mam_core/.dart_tool/test/incremental_kernel.Ly9AZGFydD0zLjA= index 46da49855c1ef6989ef28edeaa0b9bec97e9337e..de3177fe12c3838fc5d01865ff72c5d7a7d04caa 100644 GIT binary patch delta 8993 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 delta 7960 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 diff --git a/.agents/skills/multi-agent-mux-ui/packages/mam_core/lib/src/services/session_service.dart b/.agents/skills/multi-agent-mux-ui/packages/mam_core/lib/src/services/session_service.dart index 6ffd014..0d129ea 100644 --- a/.agents/skills/multi-agent-mux-ui/packages/mam_core/lib/src/services/session_service.dart +++ b/.agents/skills/multi-agent-mux-ui/packages/mam_core/lib/src/services/session_service.dart @@ -27,7 +27,27 @@ class SessionService { this.timeout = const Duration(seconds: 5), }); + bool _preflightChecked = false; + + Future _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 fetchSnapshot() async { + await _checkPreflight(); + final result = await runCommand( ['bash', statusScriptPath, '--json'], timeout: timeout,