feat(ui): Flows page (5th destination) + keyboard shortcuts

Two operator-DX additions:

1. **Flows** is the new third destination in the sidebar.
   Lists saved flows from the hub via the new HubAdmin
   ListFlows RPC. Each row has a Run button that opens an
   input dialog (key=value pairs, one per line, all values
   sent as text payloads — the binary-input case stays in
   `fai run` CLI). Flow runs in a non-dismissable progress
   dialog; output is shown per-key with monospace
   selectable text. Errors render with the exception detail
   for diagnosis.

2. **Keyboard shortcuts** at the shell level:
   - Cmd+1 / Cmd+2 / Cmd+3 / Cmd+4 / Cmd+5 jump to the
     matching destination (Doctor / Modules / Flows / Audit
     / Approvals).
   - Cmd+, opens the Settings dialog (macOS convention).

   Implemented via Flutter's Shortcuts/Actions/Intent triple
   so the bindings are discoverable in IDE devtools and
   composable with platform-specific overrides later.

Bumps fai_studio 0.7.3 -> 0.8.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-05 23:35:48 +02:00
parent 2f32023322
commit 753db4fc60
5 changed files with 508 additions and 24 deletions

View file

@ -6,7 +6,7 @@ import 'package:fai_studio/data/hub.dart';
import 'package:fai_studio/main.dart';
void main() {
testWidgets('Studio shell shows the four destinations',
testWidgets('Studio shell shows the five destinations',
(tester) async {
await tester.pumpWidget(
const StudioApp(initialThemeMode: ThemeModeValue.system),
@ -15,7 +15,8 @@ void main() {
expect(find.text('F∆I Studio'), findsOneWidget);
expect(find.text('Doctor'), findsWidgets);
expect(find.text('Modules'), findsWidgets);
expect(find.text('Audit'), findsWidgets);
expect(find.text('Approvals'), findsWidgets);
expect(find.text('Flows'), findsOneWidget);
expect(find.text('Audit'), findsOneWidget);
expect(find.text('Approvals'), findsOneWidget);
});
}