feat(studio): friendlyError catches hub-specific patterns
Some checks failed
Security / Security check (push) Failing after 1s

Generic gRPC-code mapping was right but not specific enough.
A flow failing with an approval-timeout used to land on
'Deadline exceeded — try again later'; now it reads 'Freigabe-
Timeout abgelaufen — entweder timeout_seconds erhöhen oder
den Reviewer informieren.'

New pattern matchers in _matchHubPattern, runs before the
gRPC-code switch. Six FlowExecutionError shapes covered:

  - approval rejected ("rejected by")
  - approval timeout
  - output too large ("exceeding the X MB cap")
  - host service not declared
  - missing value reference
  - MCP endpoint unreachable
  - capability not installed (NotFound fallback)

Every match comes with a localised hint pointing at the
concrete fix path (audit log / timeout config / Integrations
panel / Text-tab Fix button).

Five new tests pin the matchers — would catch a silent
regression when the hub renames a variant Display string.
All 11 friendly_error tests + 19 Studio tests green.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-09 02:01:36 +02:00
parent 28fafce7dc
commit 971196518c
8 changed files with 370 additions and 4 deletions

View file

@ -111,6 +111,57 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get helpTooltip => 'Hilfe';
@override
String get errApprovalRejected => 'Freigabe vom Reviewer abgelehnt.';
@override
String get errApprovalRejectedHint =>
'Der Reviewer hat den Step abgelehnt. Begründung steht im Audit-Log.';
@override
String get errApprovalTimedOut => 'Freigabe-Timeout abgelaufen.';
@override
String get errApprovalTimedOutHint =>
'Es wurde nicht rechtzeitig entschieden. Entweder `timeout_seconds` am Freigabe-Step erhöhen oder den Reviewer informieren.';
@override
String get errOutputTooLarge =>
'Step-Output hat die Größenbegrenzung überschritten.';
@override
String get errOutputTooLargeHint =>
'Entweder Output kürzen (Text truncaten, Bytes komprimieren) oder `max_output_size_mb` in der Operator-Config erhöhen.';
@override
String get errServiceUnavailableForStep => 'Host-Service nicht konfiguriert.';
@override
String get errServiceUnavailableForStepHint =>
'Das Modul braucht einen Service (z.B. ollama, playwright), den der Operator nicht deklariert hat. Trage ihn unter `services:` in ~/.fai/config.yaml ein.';
@override
String get errMissingValue => 'Pflichtwert fehlt.';
@override
String get errMissingValueHint =>
'Der Step erwartet eine Eingabe, die nicht verdrahtet ist — entweder zur Laufzeit liefern oder den vorgelagerten `\$ref` korrigieren.';
@override
String get errMcpUnreachable => 'MCP-Endpunkt nicht erreichbar.';
@override
String get errMcpUnreachableHint =>
'Der MCP-Server hat nicht geantwortet. Endpunkt in Einstellungen → Integrationen prüfen und sicherstellen, dass er läuft.';
@override
String get errCapabilityNotInstalled =>
'Benötigte Capability nicht installiert.';
@override
String get errCapabilityNotInstalledHint =>
'Im Text-Tab des Flows klickst du auf den Fix-Button — der installiert die Capability, sofern sie im Store ist.';
@override
String get welcomeDocClose => 'Schließen';