feat(studio): clickable install pills + open-in-editor on flow cards (v0.43.0)

When a saved flow is missing modules, each capability pill in the
"Needs:" row is now clickable: tap one and a per-item progress
dialog walks the bare capability name through installModule, then
the flows page refreshes. When more than one capability is missing,
an extra "Install all (N)" button runs the same dialog over the
whole list sequentially so a fresh operator can take an unrunnable
flow and one click later have its dependencies resolved.

Also adds a pencil icon next to Run that hands the YAML path to
the OS via SystemActions.openInOs — the operator's default editor
for .yaml decides what opens. Makes the path next to the flow name
actionable instead of decorative.

The install dialog renders one row per spec with a status icon
(pending circle / spinner / check / error), shows the installed
version on success, and surfaces the full error in a copyable
FaiErrorBox on failure so the operator can paste it back.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-09 11:58:24 +02:00
parent 2002486828
commit c389876a2f
9 changed files with 662 additions and 59 deletions

View file

@ -1892,6 +1892,84 @@ abstract class AppLocalizations {
/// **'Install the missing modules first.'**
String get flowsRunDisabledTooltip;
/// No description provided for @flowsInstallAllButton.
///
/// In en, this message translates to:
/// **'Install all ({n})'**
String flowsInstallAllButton(int n);
/// No description provided for @flowsInstallPillTooltip.
///
/// In en, this message translates to:
/// **'Click to install'**
String get flowsInstallPillTooltip;
/// No description provided for @flowsInstallDepsTitle.
///
/// In en, this message translates to:
/// **'Install dependencies'**
String get flowsInstallDepsTitle;
/// No description provided for @flowsInstallDepsBody.
///
/// In en, this message translates to:
/// **'Walking through the missing modules in order. Existing installs are left alone.'**
String get flowsInstallDepsBody;
/// No description provided for @flowsInstallStatusPending.
///
/// In en, this message translates to:
/// **'Pending'**
String get flowsInstallStatusPending;
/// No description provided for @flowsInstallStatusInstalling.
///
/// In en, this message translates to:
/// **'Installing…'**
String get flowsInstallStatusInstalling;
/// No description provided for @flowsInstallStatusDone.
///
/// In en, this message translates to:
/// **'Installed v{version}'**
String flowsInstallStatusDone(String version);
/// No description provided for @flowsInstallStatusFailed.
///
/// In en, this message translates to:
/// **'Failed'**
String get flowsInstallStatusFailed;
/// No description provided for @flowsInstallStatusFailedDetail.
///
/// In en, this message translates to:
/// **'{error}'**
String flowsInstallStatusFailedDetail(String error);
/// No description provided for @flowsInstallDepsAllDone.
///
/// In en, this message translates to:
/// **'All dependencies installed.'**
String get flowsInstallDepsAllDone;
/// No description provided for @flowsInstallDepsAnyFailed.
///
/// In en, this message translates to:
/// **'{ok} installed, {failed} failed.'**
String flowsInstallDepsAnyFailed(int ok, int failed);
/// No description provided for @flowsOpenInEditorTooltip.
///
/// In en, this message translates to:
/// **'Open the YAML file in your default editor'**
String get flowsOpenInEditorTooltip;
/// No description provided for @flowsOpenInEditorFailed.
///
/// In en, this message translates to:
/// **'Could not open file: {error}'**
String flowsOpenInEditorFailed(String error);
/// No description provided for @welcomeChecklistAllSetTitle.
///
/// In en, this message translates to: