feat: detached-runs monitor page (T3 parity)
Some checks failed
Security / Security check (push) Failing after 1s

New Runs sidebar destination listing detached invocations (detach:true)
with phase, current step, project and a Cancel button while
pending/running. Workspace-scoped like Audit/Approvals, polls every 2s.
Detached runs are opt-in (detached.enabled) — the empty state explains
how to enable them. Inline help doc DE+EN. DetachedRun model +
listDetachedRuns/cancelDetachedRun in HubService, backed by the SDK's
listInvocations()/cancelInvocation(). flutter analyze clean; 29 tests
green (sidebar Y-stability updated for the new destination, model
mapping unit-tested).

Screenshot verification (light+dark) deferred — shared desktop in use.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-07-12 14:43:37 +02:00
parent 984c91f91d
commit 54ccd3936a
13 changed files with 764 additions and 2 deletions

View file

@ -4908,6 +4908,96 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Protected: logically separated in the shared hub — no hard process barrier. Critical engagements use a sealed area.'**
String get workspaceProtectedHint;
/// No description provided for @runsTitle.
///
/// In en, this message translates to:
/// **'Runs'**
String get runsTitle;
/// No description provided for @runsReloadTooltip.
///
/// In en, this message translates to:
/// **'Reload the runs list'**
String get runsReloadTooltip;
/// No description provided for @runsEmptyTitle.
///
/// In en, this message translates to:
/// **'No detached runs'**
String get runsEmptyTitle;
/// No description provided for @runsEmptyHint.
///
/// In en, this message translates to:
/// **'Runs submitted with detach stay here until they finish. Detached invocations are opt-in — enable detached.enabled in the operator config to use them.'**
String get runsEmptyHint;
/// No description provided for @runsCancelButton.
///
/// In en, this message translates to:
/// **'Cancel'**
String get runsCancelButton;
/// No description provided for @runsCancelSignalled.
///
/// In en, this message translates to:
/// **'Cancel signalled for {flow}.'**
String runsCancelSignalled(String flow);
/// No description provided for @runsCancelTooLate.
///
/// In en, this message translates to:
/// **'The run had already finished — nothing to cancel.'**
String get runsCancelTooLate;
/// No description provided for @runsCurrentStep.
///
/// In en, this message translates to:
/// **'Step: {step}'**
String runsCurrentStep(String step);
/// No description provided for @runsPhasePending.
///
/// In en, this message translates to:
/// **'Pending'**
String get runsPhasePending;
/// No description provided for @runsPhaseRunning.
///
/// In en, this message translates to:
/// **'Running'**
String get runsPhaseRunning;
/// No description provided for @runsPhaseSucceeded.
///
/// In en, this message translates to:
/// **'Succeeded'**
String get runsPhaseSucceeded;
/// No description provided for @runsPhaseFailed.
///
/// In en, this message translates to:
/// **'Failed'**
String get runsPhaseFailed;
/// No description provided for @runsPhaseCancelled.
///
/// In en, this message translates to:
/// **'Cancelled'**
String get runsPhaseCancelled;
/// No description provided for @runsPhaseUnknown.
///
/// In en, this message translates to:
/// **'Unknown'**
String get runsPhaseUnknown;
/// No description provided for @navRuns.
///
/// In en, this message translates to:
/// **'Runs'**
String get navRuns;
}
class _AppLocalizationsDelegate