From 5aae3285dfe3d1dc5db1559a32f213a4641abf1a Mon Sep 17 00:00:00 2001 From: flemming-it Date: Tue, 9 Jun 2026 09:32:37 +0200 Subject: [PATCH] =?UTF-8?q?feat(studio):=20module=20sheet=20permissions=20?= =?UTF-8?q?get=20a=20help=20icon=20=E2=86=92=20security=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When operators open a module's detail sheet from the Store, the Permissions section now grows a small help icon next to the section header. Tapping it opens the bundled security.md explainer in the existing bottom-sheet reader, the same in-app help system Approvals + Audit + Doctor already use. Closes the zero-learning-curve gap: every operator-facing declaration of permissions ('net: api.openai.com', 'fs.read: …') now has a clickable affordance to learn what those permission categories mean and how the sandbox enforces them. Signed-off-by: flemming-it --- lib/widgets/fai_module_sheet.dart | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/widgets/fai_module_sheet.dart b/lib/widgets/fai_module_sheet.dart index 5a9511d..65a7974 100644 --- a/lib/widgets/fai_module_sheet.dart +++ b/lib/widgets/fai_module_sheet.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import '../data/error_presentation.dart'; import '../data/hub.dart'; import '../l10n/app_localizations.dart'; +import '../pages/welcome.dart' show showFaiDoc; import '../theme/theme.dart'; import '../theme/tokens.dart'; import 'fai_pill.dart'; @@ -239,7 +240,24 @@ class _Body extends StatelessWidget { .toList(), ), const SizedBox(height: FaiSpace.xl), - _SectionHeader(l.moduleSheetPermissions), + Row( + children: [ + _SectionHeader(l.moduleSheetPermissions), + const SizedBox(width: 4), + InkWell( + onTap: () => showFaiDoc(context, 'security'), + borderRadius: BorderRadius.circular(8), + child: Padding( + padding: const EdgeInsets.all(4), + child: Icon( + Icons.help_outline, + size: 14, + color: theme.colorScheme.onSurfaceVariant, + ), + ), + ), + ], + ), const SizedBox(height: FaiSpace.sm), if (detail.permissions.isEmpty) Text(