import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;

import 'app_localizations_de.dart';
import 'app_localizations_en.dart';

// ignore_for_file: type=lint

/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
///   localizationsDelegates: AppLocalizations.localizationsDelegates,
///   supportedLocales: AppLocalizations.supportedLocales,
///   home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
///   # Internationalization support.
///   flutter_localizations:
///     sdk: flutter
///   intl: any # Use the pinned version from flutter_localizations
///
///   # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
  AppLocalizations(String locale)
    : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations? of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  /// A list of this localizations delegate along with the default localizations
  /// delegates.
  ///
  /// Returns a list of localizations delegates containing this delegate along with
  /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
  /// and GlobalWidgetsLocalizations.delegate.
  ///
  /// Additional delegates can be added by appending to this list in
  /// MaterialApp. This list does not have to be used at all if a custom list
  /// of delegates is preferred or required.
  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
      <LocalizationsDelegate<dynamic>>[
        delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ];

  /// A list of this localizations delegate's supported locales.
  static const List<Locale> supportedLocales = <Locale>[
    Locale('de'),
    Locale('en'),
  ];

  /// App-bar title in the OS task switcher.
  ///
  /// In en, this message translates to:
  /// **'Ch∆In Studio'**
  String get appTitle;

  /// No description provided for @navWelcome.
  ///
  /// In en, this message translates to:
  /// **'Welcome'**
  String get navWelcome;

  /// No description provided for @welcomeHeroTitle.
  ///
  /// In en, this message translates to:
  /// **'Ch∆In Platform'**
  String get welcomeHeroTitle;

  /// No description provided for @welcomeHeroSubtitle.
  ///
  /// In en, this message translates to:
  /// **'Deterministic workflow engine for AI-assisted document processing in regulated environments.'**
  String get welcomeHeroSubtitle;

  /// No description provided for @welcomePillarHubTitle.
  ///
  /// In en, this message translates to:
  /// **'Hub'**
  String get welcomePillarHubTitle;

  /// No description provided for @welcomePillarHubBody.
  ///
  /// In en, this message translates to:
  /// **'One Rust binary that loads modules and runs flows. SQLite for state. No Docker, no message broker, no background services to babysit.'**
  String get welcomePillarHubBody;

  /// No description provided for @welcomePillarModuleTitle.
  ///
  /// In en, this message translates to:
  /// **'Module'**
  String get welcomePillarModuleTitle;

  /// No description provided for @welcomePillarModuleBody.
  ///
  /// In en, this message translates to:
  /// **'A small WebAssembly component that does one thing. Declares the network endpoints, files, and environment variables it touches; the hub enforces the list.'**
  String get welcomePillarModuleBody;

  /// No description provided for @welcomePillarFlowTitle.
  ///
  /// In en, this message translates to:
  /// **'Flow'**
  String get welcomePillarFlowTitle;

  /// No description provided for @welcomePillarFlowBody.
  ///
  /// In en, this message translates to:
  /// **'A YAML file that chains modules together. Inputs go in, modules run in declared order, outputs come out — every step recorded in a hash-chained audit log.'**
  String get welcomePillarFlowBody;

  /// No description provided for @welcomeTrustHeader.
  ///
  /// In en, this message translates to:
  /// **'TRUST POSTURE'**
  String get welcomeTrustHeader;

  /// No description provided for @welcomeTrustSandboxTitle.
  ///
  /// In en, this message translates to:
  /// **'Sandbox by default'**
  String get welcomeTrustSandboxTitle;

  /// No description provided for @welcomeTrustSandboxBody.
  ///
  /// In en, this message translates to:
  /// **'Every module ships with an explicit permission list — network endpoints, files, environment variables. The hub enforces it; nothing reaches outside the sandbox without operator approval.'**
  String get welcomeTrustSandboxBody;

  /// No description provided for @welcomeTrustAuditTitle.
  ///
  /// In en, this message translates to:
  /// **'Tamper-evident audit log'**
  String get welcomeTrustAuditTitle;

  /// No description provided for @welcomeTrustAuditBody.
  ///
  /// In en, this message translates to:
  /// **'Flow runs, install / uninstall actions, approval decisions — all of them write into a hash-chained audit log. The Doctor page verifies the chain end-to-end on every load.'**
  String get welcomeTrustAuditBody;

  /// No description provided for @welcomeTrustAirgapTitle.
  ///
  /// In en, this message translates to:
  /// **'Air-gap ready'**
  String get welcomeTrustAirgapTitle;

  /// No description provided for @welcomeTrustAirgapBody.
  ///
  /// In en, this message translates to:
  /// **'The whole hub fits in a single binary that runs on Linux, macOS and Windows. Once a module is installed, the flow it powers runs without further network access — perfect for regulated environments.'**
  String get welcomeTrustAirgapBody;

  /// No description provided for @welcomeDocsHeader.
  ///
  /// In en, this message translates to:
  /// **'DOCUMENTATION'**
  String get welcomeDocsHeader;

  /// No description provided for @welcomeDocsBody.
  ///
  /// In en, this message translates to:
  /// **'Operator-facing explainers, rendered inline. No browser, no external link — air-gap-friendly.'**
  String get welcomeDocsBody;

  /// No description provided for @welcomeDocArchitectureTitle.
  ///
  /// In en, this message translates to:
  /// **'Architecture in one paragraph'**
  String get welcomeDocArchitectureTitle;

  /// No description provided for @welcomeDocArchitectureBlurb.
  ///
  /// In en, this message translates to:
  /// **'Hub, Module, Flow — and how the three fit together.'**
  String get welcomeDocArchitectureBlurb;

  /// No description provided for @welcomeDocSecurityTitle.
  ///
  /// In en, this message translates to:
  /// **'Sandbox model'**
  String get welcomeDocSecurityTitle;

  /// No description provided for @welcomeDocSecurityBlurb.
  ///
  /// In en, this message translates to:
  /// **'What a module declares, what the operator caps, what the hub enforces.'**
  String get welcomeDocSecurityBlurb;

  /// No description provided for @welcomeDocAuditTitle.
  ///
  /// In en, this message translates to:
  /// **'Tamper-evident audit log'**
  String get welcomeDocAuditTitle;

  /// No description provided for @welcomeDocAuditBlurb.
  ///
  /// In en, this message translates to:
  /// **'How the hash chain works and why WORM-1 is enough for KRITIS.'**
  String get welcomeDocAuditBlurb;

  /// No description provided for @welcomeDocFlowsTitle.
  ///
  /// In en, this message translates to:
  /// **'Flow composition'**
  String get welcomeDocFlowsTitle;

  /// No description provided for @welcomeDocFlowsBlurb.
  ///
  /// In en, this message translates to:
  /// **'YAML basics, templating reference, the extract→summarize example.'**
  String get welcomeDocFlowsBlurb;

  /// No description provided for @welcomeDocApprovalsTitle.
  ///
  /// In en, this message translates to:
  /// **'Approvals'**
  String get welcomeDocApprovalsTitle;

  /// No description provided for @welcomeDocApprovalsBlurb.
  ///
  /// In en, this message translates to:
  /// **'Human-in-the-loop checkpoints — when to use them, how the audit log records them.'**
  String get welcomeDocApprovalsBlurb;

  /// No description provided for @helpTooltip.
  ///
  /// In en, this message translates to:
  /// **'Help'**
  String get helpTooltip;

  /// No description provided for @errApprovalRejected.
  ///
  /// In en, this message translates to:
  /// **'Approval rejected by reviewer.'**
  String get errApprovalRejected;

  /// No description provided for @errApprovalRejectedHint.
  ///
  /// In en, this message translates to:
  /// **'The reviewer marked this step as rejected. Check the audit log for the reviewer\'s reason.'**
  String get errApprovalRejectedHint;

  /// No description provided for @errApprovalTimedOut.
  ///
  /// In en, this message translates to:
  /// **'Approval timed out.'**
  String get errApprovalTimedOut;

  /// No description provided for @errApprovalTimedOutHint.
  ///
  /// In en, this message translates to:
  /// **'No reviewer decided within the configured time. Raise `timeout_seconds` on the approval step or alert the reviewer.'**
  String get errApprovalTimedOutHint;

  /// No description provided for @errOutputTooLarge.
  ///
  /// In en, this message translates to:
  /// **'Step output exceeded the size limit.'**
  String get errOutputTooLarge;

  /// No description provided for @errOutputTooLargeHint.
  ///
  /// In en, this message translates to:
  /// **'Either trim the output (truncate text, downsample bytes) or raise `max_output_size_mb` in the operator config.'**
  String get errOutputTooLargeHint;

  /// No description provided for @errServiceUnavailableForStep.
  ///
  /// In en, this message translates to:
  /// **'Host service not configured.'**
  String get errServiceUnavailableForStep;

  /// No description provided for @errServiceUnavailableForStepHint.
  ///
  /// In en, this message translates to:
  /// **'The module requires a service (e.g. ollama, playwright) the operator hasn\'t declared. Add it under `services:` in ~/.chain/config.yaml.'**
  String get errServiceUnavailableForStepHint;

  /// No description provided for @errMissingValue.
  ///
  /// In en, this message translates to:
  /// **'Required value is missing.'**
  String get errMissingValue;

  /// No description provided for @errMissingValueHint.
  ///
  /// In en, this message translates to:
  /// **'The step expected an input that wasn\'t wired up — either supply it at run time or fix the upstream `\$ref`.'**
  String get errMissingValueHint;

  /// No description provided for @errMcpUnreachable.
  ///
  /// In en, this message translates to:
  /// **'MCP endpoint unreachable.'**
  String get errMcpUnreachable;

  /// No description provided for @errMcpUnreachableHint.
  ///
  /// In en, this message translates to:
  /// **'The MCP server didn\'t respond. Check the endpoint in Settings → Integrations and confirm it\'s running.'**
  String get errMcpUnreachableHint;

  /// No description provided for @errCapabilityNotInstalled.
  ///
  /// In en, this message translates to:
  /// **'Required capability is not installed.'**
  String get errCapabilityNotInstalled;

  /// No description provided for @errCapabilityNotInstalledHint.
  ///
  /// In en, this message translates to:
  /// **'Open the flow\'s Text tab — the analyzer\'s Fix button installs the capability if it\'s in the store.'**
  String get errCapabilityNotInstalledHint;

  /// No description provided for @welcomeDocClose.
  ///
  /// In en, this message translates to:
  /// **'Close'**
  String get welcomeDocClose;

  /// No description provided for @welcomeDocFailedToLoad.
  ///
  /// In en, this message translates to:
  /// **'Could not load documentation: {error}'**
  String welcomeDocFailedToLoad(String error);

  /// No description provided for @welcomeChecklistHeader.
  ///
  /// In en, this message translates to:
  /// **'GETTING STARTED'**
  String get welcomeChecklistHeader;

  /// No description provided for @welcomeChecklistBody.
  ///
  /// In en, this message translates to:
  /// **'Four steps to a working hub. Live state — refresh after changing anything.'**
  String get welcomeChecklistBody;

  /// No description provided for @welcomeChecklistAi.
  ///
  /// In en, this message translates to:
  /// **'Configure System AI'**
  String get welcomeChecklistAi;

  /// No description provided for @welcomeChecklistAiHint.
  ///
  /// In en, this message translates to:
  /// **'Settings → System AI. Required for the AI search and inline failure explanations.'**
  String get welcomeChecklistAiHint;

  /// No description provided for @welcomeChecklistMcp.
  ///
  /// In en, this message translates to:
  /// **'Add a public capability source'**
  String get welcomeChecklistMcp;

  /// No description provided for @welcomeChecklistMcpHint.
  ///
  /// In en, this message translates to:
  /// **'Add an MCP source from the Store, or configure one under Settings → MCP Clients.'**
  String get welcomeChecklistMcpHint;

  /// No description provided for @welcomeChecklistModule.
  ///
  /// In en, this message translates to:
  /// **'Install a text module'**
  String get welcomeChecklistModule;

  /// No description provided for @welcomeChecklistModuleHint.
  ///
  /// In en, this message translates to:
  /// **'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.'**
  String get welcomeChecklistModuleHint;

  /// No description provided for @welcomeChecklistFlow.
  ///
  /// In en, this message translates to:
  /// **'Run a saved flow'**
  String get welcomeChecklistFlow;

  /// No description provided for @welcomeChecklistFlowHint.
  ///
  /// In en, this message translates to:
  /// **'Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.'**
  String get welcomeChecklistFlowHint;

  /// No description provided for @welcomeChecklistAllDone.
  ///
  /// In en, this message translates to:
  /// **'All four steps complete.'**
  String get welcomeChecklistAllDone;

  /// No description provided for @welcomeChecklistDismiss.
  ///
  /// In en, this message translates to:
  /// **'Hide checklist'**
  String get welcomeChecklistDismiss;

  /// No description provided for @welcomeChecklistRefresh.
  ///
  /// In en, this message translates to:
  /// **'Refresh'**
  String get welcomeChecklistRefresh;

  /// No description provided for @welcomeChecklistRefreshing.
  ///
  /// In en, this message translates to:
  /// **'Checking…'**
  String get welcomeChecklistRefreshing;

  /// No description provided for @welcomeChecklistDone.
  ///
  /// In en, this message translates to:
  /// **'Done'**
  String get welcomeChecklistDone;

  /// No description provided for @welcomeChecklistTodo.
  ///
  /// In en, this message translates to:
  /// **'Pending'**
  String get welcomeChecklistTodo;

  /// No description provided for @navDoctor.
  ///
  /// In en, this message translates to:
  /// **'Doctor'**
  String get navDoctor;

  /// No description provided for @navModules.
  ///
  /// In en, this message translates to:
  /// **'Modules'**
  String get navModules;

  /// No description provided for @navStore.
  ///
  /// In en, this message translates to:
  /// **'Store'**
  String get navStore;

  /// No description provided for @navFlows.
  ///
  /// In en, this message translates to:
  /// **'Flows'**
  String get navFlows;

  /// No description provided for @navAudit.
  ///
  /// In en, this message translates to:
  /// **'Audit'**
  String get navAudit;

  /// No description provided for @navApprovals.
  ///
  /// In en, this message translates to:
  /// **'Approvals'**
  String get navApprovals;

  /// No description provided for @connectionConnected.
  ///
  /// In en, this message translates to:
  /// **'connected'**
  String get connectionConnected;

  /// No description provided for @connectionUnreachable.
  ///
  /// In en, this message translates to:
  /// **'unreachable'**
  String get connectionUnreachable;

  /// No description provided for @connectionConnecting.
  ///
  /// In en, this message translates to:
  /// **'connecting…'**
  String get connectionConnecting;

  /// No description provided for @connectionStartHub.
  ///
  /// In en, this message translates to:
  /// **'Start hub'**
  String get connectionStartHub;

  /// No description provided for @connectionTapToStart.
  ///
  /// In en, this message translates to:
  /// **'tap to start'**
  String get connectionTapToStart;

  /// No description provided for @sidebarSettingsTooltip.
  ///
  /// In en, this message translates to:
  /// **'Settings (⌘;)'**
  String get sidebarSettingsTooltip;

  /// No description provided for @sidebarChannelTooltip.
  ///
  /// In en, this message translates to:
  /// **'Active channel — click to switch.\nproduction = stable · beta = pre-release · dev = rolling · local = workspace'**
  String get sidebarChannelTooltip;

  /// No description provided for @buttonCancel.
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get buttonCancel;

  /// No description provided for @buttonSave.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get buttonSave;

  /// No description provided for @buttonClose.
  ///
  /// In en, this message translates to:
  /// **'Close'**
  String get buttonClose;

  /// No description provided for @buttonRetry.
  ///
  /// In en, this message translates to:
  /// **'Retry'**
  String get buttonRetry;

  /// No description provided for @buttonRefresh.
  ///
  /// In en, this message translates to:
  /// **'Refresh'**
  String get buttonRefresh;

  /// No description provided for @buttonInstall.
  ///
  /// In en, this message translates to:
  /// **'Install'**
  String get buttonInstall;

  /// No description provided for @buttonUninstall.
  ///
  /// In en, this message translates to:
  /// **'Uninstall'**
  String get buttonUninstall;

  /// No description provided for @buttonDetails.
  ///
  /// In en, this message translates to:
  /// **'Details'**
  String get buttonDetails;

  /// No description provided for @buttonAdd.
  ///
  /// In en, this message translates to:
  /// **'Add'**
  String get buttonAdd;

  /// No description provided for @buttonRemove.
  ///
  /// In en, this message translates to:
  /// **'Remove'**
  String get buttonRemove;

  /// No description provided for @buttonOpen.
  ///
  /// In en, this message translates to:
  /// **'Open'**
  String get buttonOpen;

  /// No description provided for @buttonExplain.
  ///
  /// In en, this message translates to:
  /// **'Explain'**
  String get buttonExplain;

  /// No description provided for @buttonReadDocs.
  ///
  /// In en, this message translates to:
  /// **'Read docs'**
  String get buttonReadDocs;

  /// No description provided for @buttonCopy.
  ///
  /// In en, this message translates to:
  /// **'Copy to clipboard'**
  String get buttonCopy;

  /// No description provided for @buttonCopied.
  ///
  /// In en, this message translates to:
  /// **'Copied'**
  String get buttonCopied;

  /// No description provided for @buttonShowDetails.
  ///
  /// In en, this message translates to:
  /// **'Show details'**
  String get buttonShowDetails;

  /// No description provided for @buttonHideDetails.
  ///
  /// In en, this message translates to:
  /// **'Hide details'**
  String get buttonHideDetails;

  /// No description provided for @storeInstallableOnly.
  ///
  /// In en, this message translates to:
  /// **'Installable only'**
  String get storeInstallableOnly;

  /// No description provided for @storePillComingSoon.
  ///
  /// In en, this message translates to:
  /// **'Coming soon'**
  String get storePillComingSoon;

  /// No description provided for @storeNotInstallableInline.
  ///
  /// In en, this message translates to:
  /// **'This module is on the roadmap (status: {status}). It has no installable bundle yet — follow the repository for updates.'**
  String storeNotInstallableInline(String status);

  /// No description provided for @mcpSuggestionDeepwikiDesc.
  ///
  /// In en, this message translates to:
  /// **'Public HTTPS — GitHub repo documentation search (AI-powered). No Node, no API key.'**
  String get mcpSuggestionDeepwikiDesc;

  /// No description provided for @mcpSuggestionSemgrepDesc.
  ///
  /// In en, this message translates to:
  /// **'Public HTTPS — security scanning for code vulnerabilities. No Node, no API key.'**
  String get mcpSuggestionSemgrepDesc;

  /// No description provided for @mcpSuggestionFilesystemDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — read / write files in /tmp. Edit the path before saving.'**
  String get mcpSuggestionFilesystemDesc;

  /// No description provided for @mcpSuggestionFetchDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — fetch arbitrary HTTP(S) URLs as markdown.'**
  String get mcpSuggestionFetchDesc;

  /// No description provided for @mcpSuggestionGithubDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — issues, PRs, repo files. Needs a GitHub PAT in the env var.'**
  String get mcpSuggestionGithubDesc;

  /// No description provided for @mcpSuggestionPuppeteerDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — headless browser automation for screenshots / scraping.'**
  String get mcpSuggestionPuppeteerDesc;

  /// No description provided for @mcpSuggestionPostgresDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — read-only SQL queries against a Postgres database. Edit the URL.'**
  String get mcpSuggestionPostgresDesc;

  /// No description provided for @mcpSuggestionSqliteDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — query a local SQLite file. Edit the path.'**
  String get mcpSuggestionSqliteDesc;

  /// No description provided for @mcpSuggestionBraveSearchDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — web search via Brave. API key required.'**
  String get mcpSuggestionBraveSearchDesc;

  /// No description provided for @mcpSuggestionMemoryDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — persistent knowledge graph for an agent\'s memory.'**
  String get mcpSuggestionMemoryDesc;

  /// No description provided for @mcpSuggestionTimeDesc.
  ///
  /// In en, this message translates to:
  /// **'Anthropic — current time + timezone conversion.'**
  String get mcpSuggestionTimeDesc;

  /// No description provided for @mcpServerEnLanguageBadge.
  ///
  /// In en, this message translates to:
  /// **'Server text in English — Studio shows it as supplied.'**
  String get mcpServerEnLanguageBadge;

  /// No description provided for @themePluginHeader.
  ///
  /// In en, this message translates to:
  /// **'Theme plugin (applies instantly)'**
  String get themePluginHeader;

  /// No description provided for @themeApplied.
  ///
  /// In en, this message translates to:
  /// **'Theme applied: {name}'**
  String themeApplied(String name);

  /// No description provided for @themePluginFailed.
  ///
  /// In en, this message translates to:
  /// **'Theme plugin could not load — keeping previous theme.'**
  String get themePluginFailed;

  /// No description provided for @themePluginNone.
  ///
  /// In en, this message translates to:
  /// **'Built-in (no plugin)'**
  String get themePluginNone;

  /// No description provided for @themePluginHint.
  ///
  /// In en, this message translates to:
  /// **'Built-in and plugin tiles ship hand-curated palettes. The Custom tile derives a full Material 3 palette (primary, secondary, tertiary, surface, …) from one seed colour you pick — it\'s a complete theme, not a single-colour tweak.'**
  String get themePluginHint;

  /// No description provided for @themePluginEmpty.
  ///
  /// In en, this message translates to:
  /// **'No theme plugins installed. Open the Store and pick one in the studio-plugin category.'**
  String get themePluginEmpty;

  /// No description provided for @themePluginCustom.
  ///
  /// In en, this message translates to:
  /// **'Custom colour'**
  String get themePluginCustom;

  /// No description provided for @themePluginCustomDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Custom theme — pick a seed colour'**
  String get themePluginCustomDialogTitle;

  /// No description provided for @themePluginCustomHexLabel.
  ///
  /// In en, this message translates to:
  /// **'Hex colour'**
  String get themePluginCustomHexLabel;

  /// No description provided for @themePluginCustomPreview.
  ///
  /// In en, this message translates to:
  /// **'Live preview'**
  String get themePluginCustomPreview;

  /// No description provided for @themePluginCustomCancel.
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get themePluginCustomCancel;

  /// No description provided for @themePluginCustomApply.
  ///
  /// In en, this message translates to:
  /// **'Apply'**
  String get themePluginCustomApply;

  /// No description provided for @settingsTitle.
  ///
  /// In en, this message translates to:
  /// **'Hub endpoint'**
  String get settingsTitle;

  /// No description provided for @settingsHost.
  ///
  /// In en, this message translates to:
  /// **'Host'**
  String get settingsHost;

  /// No description provided for @settingsPort.
  ///
  /// In en, this message translates to:
  /// **'Port'**
  String get settingsPort;

  /// No description provided for @settingsTls.
  ///
  /// In en, this message translates to:
  /// **'TLS'**
  String get settingsTls;

  /// No description provided for @settingsSaveAndConnect.
  ///
  /// In en, this message translates to:
  /// **'Connect to endpoint'**
  String get settingsSaveAndConnect;

  /// No description provided for @settingsLanguage.
  ///
  /// In en, this message translates to:
  /// **'Language'**
  String get settingsLanguage;

  /// No description provided for @settingsLanguageHint.
  ///
  /// In en, this message translates to:
  /// **'App language. Affects every page; bilingual store entries also flip via this toggle.'**
  String get settingsLanguageHint;

  /// No description provided for @settingsHubEndpointHint.
  ///
  /// In en, this message translates to:
  /// **'Where should Studio connect? Default is the local hub at 127.0.0.1:50051.'**
  String get settingsHubEndpointHint;

  /// No description provided for @settingsTlsSubtitle.
  ///
  /// In en, this message translates to:
  /// **'https/grpc-secure'**
  String get settingsTlsSubtitle;

  /// No description provided for @settingsPortError.
  ///
  /// In en, this message translates to:
  /// **'port must be 1–65535'**
  String get settingsPortError;

  /// No description provided for @channelsBlurb.
  ///
  /// In en, this message translates to:
  /// **'Switch hub channel (writes ~/.chain/current-channel and restarts the daemon). Connect just changes Studio\'s wire.'**
  String get channelsBlurb;

  /// No description provided for @channelsActionsTooltip.
  ///
  /// In en, this message translates to:
  /// **'Channel actions'**
  String get channelsActionsTooltip;

  /// No description provided for @systemAiHeader.
  ///
  /// In en, this message translates to:
  /// **'SYSTEM AI'**
  String get systemAiHeader;

  /// No description provided for @systemAiEnabled.
  ///
  /// In en, this message translates to:
  /// **'enabled'**
  String get systemAiEnabled;

  /// No description provided for @systemAiOff.
  ///
  /// In en, this message translates to:
  /// **'off'**
  String get systemAiOff;

  /// No description provided for @systemAiEdit.
  ///
  /// In en, this message translates to:
  /// **'Edit…'**
  String get systemAiEdit;

  /// No description provided for @systemAiConfigure.
  ///
  /// In en, this message translates to:
  /// **'Configure…'**
  String get systemAiConfigure;

  /// No description provided for @systemAiOffBlurb.
  ///
  /// In en, this message translates to:
  /// **'Off — failure explanations on the audit page are disabled. Click Configure… to pick a provider (Ollama / OpenAI / LM Studio / vLLM / Custom). Operator config is rewritten in place; no daemon restart needed.'**
  String get systemAiOffBlurb;

  /// No description provided for @mcpServersCount.
  ///
  /// In en, this message translates to:
  /// **'{n} {n, plural, =1{server} other{servers}}'**
  String mcpServersCount(int n);

  /// No description provided for @mcpRediscoverTooltip.
  ///
  /// In en, this message translates to:
  /// **'Re-run discovery'**
  String get mcpRediscoverTooltip;

  /// No description provided for @mcpAddTooltip.
  ///
  /// In en, this message translates to:
  /// **'Add MCP server'**
  String get mcpAddTooltip;

  /// No description provided for @mcpRemoveTooltip.
  ///
  /// In en, this message translates to:
  /// **'Remove server'**
  String get mcpRemoveTooltip;

  /// No description provided for @mcpToolsCount.
  ///
  /// In en, this message translates to:
  /// **'{n} {n, plural, =1{tool} other{tools}}'**
  String mcpToolsCount(int n);

  /// No description provided for @n8nEndpointsCount.
  ///
  /// In en, this message translates to:
  /// **'{n} {n, plural, =1{endpoint} other{endpoints}}'**
  String n8nEndpointsCount(int n);

  /// No description provided for @n8nWorkflowsCount.
  ///
  /// In en, this message translates to:
  /// **'{n} {n, plural, =1{workflow} other{workflows}}'**
  String n8nWorkflowsCount(int n);

  /// No description provided for @n8nRediscoverTooltip.
  ///
  /// In en, this message translates to:
  /// **'Re-run discovery'**
  String get n8nRediscoverTooltip;

  /// No description provided for @n8nAddTooltip.
  ///
  /// In en, this message translates to:
  /// **'Add n8n endpoint'**
  String get n8nAddTooltip;

  /// No description provided for @n8nRemoveTooltip.
  ///
  /// In en, this message translates to:
  /// **'Remove endpoint'**
  String get n8nRemoveTooltip;

  /// No description provided for @addMcpTitle.
  ///
  /// In en, this message translates to:
  /// **'Add MCP server'**
  String get addMcpTitle;

  /// No description provided for @addMcpIntro.
  ///
  /// In en, this message translates to:
  /// **'Tools the server advertises via `tools/list` appear in the Store as `mcp.<name>.<tool>` capabilities.'**
  String get addMcpIntro;

  /// No description provided for @addMcpSuggestionsLabel.
  ///
  /// In en, this message translates to:
  /// **'Suggested servers — click to pre-fill'**
  String get addMcpSuggestionsLabel;

  /// No description provided for @addMcpNameLabel.
  ///
  /// In en, this message translates to:
  /// **'Name (no dots)'**
  String get addMcpNameLabel;

  /// No description provided for @addMcpNameHint.
  ///
  /// In en, this message translates to:
  /// **'filesystem'**
  String get addMcpNameHint;

  /// No description provided for @addMcpEndpointLabel.
  ///
  /// In en, this message translates to:
  /// **'Endpoint'**
  String get addMcpEndpointLabel;

  /// No description provided for @addMcpEndpointHint.
  ///
  /// In en, this message translates to:
  /// **'http://127.0.0.1:3001/mcp'**
  String get addMcpEndpointHint;

  /// No description provided for @addMcpApiKeyLabel.
  ///
  /// In en, this message translates to:
  /// **'API key env var (optional)'**
  String get addMcpApiKeyLabel;

  /// No description provided for @addMcpApiKeyHint.
  ///
  /// In en, this message translates to:
  /// **'MCP_FILESYSTEM_TOKEN'**
  String get addMcpApiKeyHint;

  /// No description provided for @addMcpNotesLabel.
  ///
  /// In en, this message translates to:
  /// **'Notes (optional)'**
  String get addMcpNotesLabel;

  /// No description provided for @addMcpAddButton.
  ///
  /// In en, this message translates to:
  /// **'Add + discover'**
  String get addMcpAddButton;

  /// No description provided for @addN8nTitle.
  ///
  /// In en, this message translates to:
  /// **'Add n8n endpoint'**
  String get addN8nTitle;

  /// No description provided for @addN8nIntro.
  ///
  /// In en, this message translates to:
  /// **'Active workflows surface in the Store as `n8n.<name>.<workflow_slug>` capabilities.'**
  String get addN8nIntro;

  /// No description provided for @addN8nNameLabel.
  ///
  /// In en, this message translates to:
  /// **'Name (no dots)'**
  String get addN8nNameLabel;

  /// No description provided for @addN8nNameHint.
  ///
  /// In en, this message translates to:
  /// **'ops'**
  String get addN8nNameHint;

  /// No description provided for @addN8nBaseUrlLabel.
  ///
  /// In en, this message translates to:
  /// **'Base URL (without /api/v1)'**
  String get addN8nBaseUrlLabel;

  /// No description provided for @addN8nBaseUrlHint.
  ///
  /// In en, this message translates to:
  /// **'https://n8n.example.com'**
  String get addN8nBaseUrlHint;

  /// No description provided for @addN8nApiKeyLabel.
  ///
  /// In en, this message translates to:
  /// **'API key env var (optional)'**
  String get addN8nApiKeyLabel;

  /// No description provided for @addN8nApiKeyHint.
  ///
  /// In en, this message translates to:
  /// **'N8N_OPS_KEY'**
  String get addN8nApiKeyHint;

  /// No description provided for @addN8nNotesLabel.
  ///
  /// In en, this message translates to:
  /// **'Notes (optional)'**
  String get addN8nNotesLabel;

  /// No description provided for @addN8nAddButton.
  ///
  /// In en, this message translates to:
  /// **'Add + discover'**
  String get addN8nAddButton;

  /// No description provided for @addedMcpToast.
  ///
  /// In en, this message translates to:
  /// **'Added MCP server \"{name}\".'**
  String addedMcpToast(String name);

  /// No description provided for @addedN8nToast.
  ///
  /// In en, this message translates to:
  /// **'Added n8n endpoint \"{name}\".'**
  String addedN8nToast(String name);

  /// No description provided for @addFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Add failed: {error}'**
  String addFailedToast(String error);

  /// No description provided for @removeFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Remove failed: {error}'**
  String removeFailedToast(String error);

  /// No description provided for @refreshFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Refresh failed: {error}'**
  String refreshFailedToast(String error);

  /// No description provided for @channelsHeader.
  ///
  /// In en, this message translates to:
  /// **'CHANNELS'**
  String get channelsHeader;

  /// No description provided for @channelsActive.
  ///
  /// In en, this message translates to:
  /// **'active'**
  String get channelsActive;

  /// No description provided for @channelsRunning.
  ///
  /// In en, this message translates to:
  /// **'running'**
  String get channelsRunning;

  /// No description provided for @channelsStopped.
  ///
  /// In en, this message translates to:
  /// **'stopped'**
  String get channelsStopped;

  /// No description provided for @channelsConnect.
  ///
  /// In en, this message translates to:
  /// **'Connect Studio to this channel'**
  String get channelsConnect;

  /// No description provided for @channelsSwitch.
  ///
  /// In en, this message translates to:
  /// **'Make this the active channel'**
  String get channelsSwitch;

  /// No description provided for @channelsEnableAutostart.
  ///
  /// In en, this message translates to:
  /// **'Enable autostart at login'**
  String get channelsEnableAutostart;

  /// No description provided for @channelsDisableAutostart.
  ///
  /// In en, this message translates to:
  /// **'Disable autostart'**
  String get channelsDisableAutostart;

  /// No description provided for @storeSearchHint.
  ///
  /// In en, this message translates to:
  /// **'Search modules — name, tagline, tag, capability…'**
  String get storeSearchHint;

  /// No description provided for @storeAskHint.
  ///
  /// In en, this message translates to:
  /// **'What do you need? Try \"a module that reads tabular data\" or just type a keyword.'**
  String get storeAskHint;

  /// No description provided for @storeAskSubmit.
  ///
  /// In en, this message translates to:
  /// **'Search'**
  String get storeAskSubmit;

  /// No description provided for @storeAskAi.
  ///
  /// In en, this message translates to:
  /// **'Ask the AI'**
  String get storeAskAi;

  /// No description provided for @storeAskClear.
  ///
  /// In en, this message translates to:
  /// **'Clear question'**
  String get storeAskClear;

  /// No description provided for @storeAskAiThinking.
  ///
  /// In en, this message translates to:
  /// **'Looking through modules…'**
  String get storeAskAiThinking;

  /// No description provided for @storeAskAiUnavailable.
  ///
  /// In en, this message translates to:
  /// **'Configure a System AI in Settings to ask questions in plain language.'**
  String get storeAskAiUnavailable;

  /// No description provided for @storeAskNoMatches.
  ///
  /// In en, this message translates to:
  /// **'No matches yet — refine the question or browse the grid below.'**
  String get storeAskNoMatches;

  /// No description provided for @storeAskAnswerLabel.
  ///
  /// In en, this message translates to:
  /// **'AI suggestion'**
  String get storeAskAnswerLabel;

  /// No description provided for @storeAskAnswerWhy.
  ///
  /// In en, this message translates to:
  /// **'Why this matches'**
  String get storeAskAnswerWhy;

  /// No description provided for @storeAskMatchPill.
  ///
  /// In en, this message translates to:
  /// **'match'**
  String get storeAskMatchPill;

  /// No description provided for @storeFilterLabel.
  ///
  /// In en, this message translates to:
  /// **'Filter'**
  String get storeFilterLabel;

  /// No description provided for @storeFilterActiveCount.
  ///
  /// In en, this message translates to:
  /// **'{n} active'**
  String storeFilterActiveCount(int n);

  /// No description provided for @storeFilterReset.
  ///
  /// In en, this message translates to:
  /// **'Reset filters'**
  String get storeFilterReset;

  /// No description provided for @storeFilterApply.
  ///
  /// In en, this message translates to:
  /// **'Done'**
  String get storeFilterApply;

  /// No description provided for @storeFilterStatusGroup.
  ///
  /// In en, this message translates to:
  /// **'Status'**
  String get storeFilterStatusGroup;

  /// No description provided for @storeFilterSourceGroup.
  ///
  /// In en, this message translates to:
  /// **'Source'**
  String get storeFilterSourceGroup;

  /// No description provided for @storeFilterInstalledGroup.
  ///
  /// In en, this message translates to:
  /// **'Show only installed'**
  String get storeFilterInstalledGroup;

  /// No description provided for @storeFeatured.
  ///
  /// In en, this message translates to:
  /// **'FEATURED'**
  String get storeFeatured;

  /// No description provided for @storeFeaturedHint.
  ///
  /// In en, this message translates to:
  /// **'curated picks · click for details'**
  String get storeFeaturedHint;

  /// No description provided for @storeNoMatches.
  ///
  /// In en, this message translates to:
  /// **'No matches'**
  String get storeNoMatches;

  /// No description provided for @storeNoMatchesHint.
  ///
  /// In en, this message translates to:
  /// **'Adjust the filters or clear the search to see all entries.'**
  String get storeNoMatchesHint;

  /// No description provided for @storeClearFilters.
  ///
  /// In en, this message translates to:
  /// **'Clear filters'**
  String get storeClearFilters;

  /// No description provided for @storeStatusAll.
  ///
  /// In en, this message translates to:
  /// **'All'**
  String get storeStatusAll;

  /// No description provided for @storeStatusPublished.
  ///
  /// In en, this message translates to:
  /// **'stable'**
  String get storeStatusPublished;

  /// No description provided for @storeStatusAlpha.
  ///
  /// In en, this message translates to:
  /// **'experimental'**
  String get storeStatusAlpha;

  /// No description provided for @storeStatusPlanned.
  ///
  /// In en, this message translates to:
  /// **'coming soon'**
  String get storeStatusPlanned;

  /// No description provided for @storeInstalledOnly.
  ///
  /// In en, this message translates to:
  /// **'Installed'**
  String get storeInstalledOnly;

  /// No description provided for @storeCategoryLabel.
  ///
  /// In en, this message translates to:
  /// **'Category'**
  String get storeCategoryLabel;

  /// No description provided for @storeCategoryAll.
  ///
  /// In en, this message translates to:
  /// **'All categories'**
  String get storeCategoryAll;

  /// No description provided for @storeCategoryBridge.
  ///
  /// In en, this message translates to:
  /// **'Connectors'**
  String get storeCategoryBridge;

  /// No description provided for @storeCategoryDebug.
  ///
  /// In en, this message translates to:
  /// **'Sample modules'**
  String get storeCategoryDebug;

  /// No description provided for @storeCategoryText.
  ///
  /// In en, this message translates to:
  /// **'Text'**
  String get storeCategoryText;

  /// No description provided for @storeCategoryLlm.
  ///
  /// In en, this message translates to:
  /// **'AI models'**
  String get storeCategoryLlm;

  /// No description provided for @storeCategorySystem.
  ///
  /// In en, this message translates to:
  /// **'System'**
  String get storeCategorySystem;

  /// No description provided for @storeCategoryAuth.
  ///
  /// In en, this message translates to:
  /// **'Authentication'**
  String get storeCategoryAuth;

  /// No description provided for @storeCategoryStorage.
  ///
  /// In en, this message translates to:
  /// **'Storage'**
  String get storeCategoryStorage;

  /// No description provided for @storeCategoryChannel.
  ///
  /// In en, this message translates to:
  /// **'Channels'**
  String get storeCategoryChannel;

  /// No description provided for @storeCategoryWeb.
  ///
  /// In en, this message translates to:
  /// **'Web'**
  String get storeCategoryWeb;

  /// No description provided for @storeCategoryOrchestrator.
  ///
  /// In en, this message translates to:
  /// **'Orchestration'**
  String get storeCategoryOrchestrator;

  /// No description provided for @storeNResults.
  ///
  /// In en, this message translates to:
  /// **'{n} result{n, plural, =1{} other{s}}'**
  String storeNResults(int n);

  /// No description provided for @storeReloadTooltip.
  ///
  /// In en, this message translates to:
  /// **'Reload'**
  String get storeReloadTooltip;

  /// No description provided for @storesManagerButton.
  ///
  /// In en, this message translates to:
  /// **'Add store'**
  String get storesManagerButton;

  /// No description provided for @storesManagerTitle.
  ///
  /// In en, this message translates to:
  /// **'Module stores'**
  String get storesManagerTitle;

  /// No description provided for @storesManagerIntro.
  ///
  /// In en, this message translates to:
  /// **'The hub merges the modules from every store below into one index. Add a store\'s index URL to make its modules installable here.'**
  String get storesManagerIntro;

  /// No description provided for @storesManagerAddSection.
  ///
  /// In en, this message translates to:
  /// **'Add a store'**
  String get storesManagerAddSection;

  /// No description provided for @storesManagerNameLabel.
  ///
  /// In en, this message translates to:
  /// **'Name'**
  String get storesManagerNameLabel;

  /// No description provided for @storesManagerUrlLabel.
  ///
  /// In en, this message translates to:
  /// **'Index URL (https:// or file://)'**
  String get storesManagerUrlLabel;

  /// No description provided for @storesManagerAddAction.
  ///
  /// In en, this message translates to:
  /// **'Add store'**
  String get storesManagerAddAction;

  /// No description provided for @storesManagerBundled.
  ///
  /// In en, this message translates to:
  /// **'{count} modules · bundled'**
  String storesManagerBundled(int count);

  /// No description provided for @storesManagerModuleCount.
  ///
  /// In en, this message translates to:
  /// **'{count} modules'**
  String storesManagerModuleCount(int count);

  /// No description provided for @storesManagerAddFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not add store'**
  String get storesManagerAddFailed;

  /// No description provided for @storesManagerRemoveFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not remove store'**
  String get storesManagerRemoveFailed;

  /// No description provided for @storesManagerSuggested.
  ///
  /// In en, this message translates to:
  /// **'Suggested stores'**
  String get storesManagerSuggested;

  /// No description provided for @storesManagerAddShort.
  ///
  /// In en, this message translates to:
  /// **'Add'**
  String get storesManagerAddShort;

  /// No description provided for @storesManagerPinnedKeyLabel.
  ///
  /// In en, this message translates to:
  /// **'Pinned public key — PEM (optional)'**
  String get storesManagerPinnedKeyLabel;

  /// No description provided for @storesManagerPinnedKeyHint.
  ///
  /// In en, this message translates to:
  /// **'Signed modules from this store verify against this key instead of the built-in vendor key. Paste a PEM public key.'**
  String get storesManagerPinnedKeyHint;

  /// No description provided for @storesManagerNotAvailable.
  ///
  /// In en, this message translates to:
  /// **'Not available yet'**
  String get storesManagerNotAvailable;

  /// No description provided for @storesManagerNotAvailableHint.
  ///
  /// In en, this message translates to:
  /// **'The provider hasn\'t published this store index yet. It will become installable once they do.'**
  String get storesManagerNotAvailableHint;

  /// No description provided for @storesSuggestedReclaimDesc.
  ///
  /// In en, this message translates to:
  /// **'Recl∆Im — modules for law & duty reform-mapping'**
  String get storesSuggestedReclaimDesc;

  /// No description provided for @storeTodayBadge.
  ///
  /// In en, this message translates to:
  /// **'TODAY'**
  String get storeTodayBadge;

  /// No description provided for @storeTodayDeck.
  ///
  /// In en, this message translates to:
  /// **'From the Ch∆In editor'**
  String get storeTodayDeck;

  /// No description provided for @storeTodayDismissTooltip.
  ///
  /// In en, this message translates to:
  /// **'Hide for this session'**
  String get storeTodayDismissTooltip;

  /// No description provided for @storePillInstalled.
  ///
  /// In en, this message translates to:
  /// **'installed'**
  String get storePillInstalled;

  /// No description provided for @storePillUpdate.
  ///
  /// In en, this message translates to:
  /// **'update'**
  String get storePillUpdate;

  /// No description provided for @storeUpdateButton.
  ///
  /// In en, this message translates to:
  /// **'Update to {version}'**
  String storeUpdateButton(String version);

  /// No description provided for @storeUpdateTooltip.
  ///
  /// In en, this message translates to:
  /// **'Installed {installed} — store has v{best}'**
  String storeUpdateTooltip(String installed, String best);

  /// No description provided for @storeNoTagline.
  ///
  /// In en, this message translates to:
  /// **'(no tagline)'**
  String get storeNoTagline;

  /// No description provided for @storeUninstallTitle.
  ///
  /// In en, this message translates to:
  /// **'Uninstall module?'**
  String get storeUninstallTitle;

  /// No description provided for @storeUninstallBody.
  ///
  /// In en, this message translates to:
  /// **'Removes {name} from this hub. Flows that reference it will fail at the next run.'**
  String storeUninstallBody(String name);

  /// No description provided for @storeInstalledToast.
  ///
  /// In en, this message translates to:
  /// **'{name} v{version} installed.'**
  String storeInstalledToast(String name, String version);

  /// No description provided for @storeInstallFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Install failed: {error}'**
  String storeInstallFailedToast(String error);

  /// No description provided for @storeUninstalledToast.
  ///
  /// In en, this message translates to:
  /// **'{name} v{version} uninstalled.'**
  String storeUninstalledToast(String name, String version);

  /// No description provided for @storeUninstallFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Uninstall failed: {error}'**
  String storeUninstallFailedToast(String error);

  /// No description provided for @storeOpenBrowserFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not open browser: {error}'**
  String storeOpenBrowserFailed(String error);

  /// No description provided for @storeSectionTags.
  ///
  /// In en, this message translates to:
  /// **'Tags'**
  String get storeSectionTags;

  /// No description provided for @storeSectionRequiredCapabilities.
  ///
  /// In en, this message translates to:
  /// **'Required capabilities'**
  String get storeSectionRequiredCapabilities;

  /// No description provided for @storeSectionRequiredHostServices.
  ///
  /// In en, this message translates to:
  /// **'Required host services'**
  String get storeSectionRequiredHostServices;

  /// No description provided for @storeSectionScreenshots.
  ///
  /// In en, this message translates to:
  /// **'Screenshots'**
  String get storeSectionScreenshots;

  /// No description provided for @storeSectionDocumentation.
  ///
  /// In en, this message translates to:
  /// **'Documentation'**
  String get storeSectionDocumentation;

  /// No description provided for @storeSectionSource.
  ///
  /// In en, this message translates to:
  /// **'Source'**
  String get storeSectionSource;

  /// No description provided for @storeSectionPermissions.
  ///
  /// In en, this message translates to:
  /// **'Declared permissions'**
  String get storeSectionPermissions;

  /// No description provided for @storeSectionDirectory.
  ///
  /// In en, this message translates to:
  /// **'Module directory'**
  String get storeSectionDirectory;

  /// No description provided for @storeSectionPermissionsNone.
  ///
  /// In en, this message translates to:
  /// **'(none — pure-computation module)'**
  String get storeSectionPermissionsNone;

  /// No description provided for @storeInstallingButton.
  ///
  /// In en, this message translates to:
  /// **'Installing…'**
  String get storeInstallingButton;

  /// No description provided for @storeNotInstallable.
  ///
  /// In en, this message translates to:
  /// **'Not installable'**
  String get storeNotInstallable;

  /// No description provided for @storeNotInstallableTooltip.
  ///
  /// In en, this message translates to:
  /// **'Status \"{status}\" — install path not yet wired.'**
  String storeNotInstallableTooltip(String status);

  /// No description provided for @storeInstallProgressTitle.
  ///
  /// In en, this message translates to:
  /// **'Installing {name}'**
  String storeInstallProgressTitle(String name);

  /// No description provided for @storeInstallProgressBody.
  ///
  /// In en, this message translates to:
  /// **'Fetching, verifying, unpacking…'**
  String get storeInstallProgressBody;

  /// No description provided for @storeLoadDocs.
  ///
  /// In en, this message translates to:
  /// **'Load documentation'**
  String get storeLoadDocs;

  /// No description provided for @storeDocsHint.
  ///
  /// In en, this message translates to:
  /// **'README rendered inline; uses the hub\'s registry token when needed.'**
  String get storeDocsHint;

  /// No description provided for @storeDocsFetching.
  ///
  /// In en, this message translates to:
  /// **'Fetching README…'**
  String get storeDocsFetching;

  /// No description provided for @storeOpenRepoButton.
  ///
  /// In en, this message translates to:
  /// **'Open repository in browser'**
  String get storeOpenRepoButton;

  /// No description provided for @storeDocsErrorNotFound.
  ///
  /// In en, this message translates to:
  /// **'This module is not in the hub\'s store index.'**
  String get storeDocsErrorNotFound;

  /// No description provided for @storeDocsErrorNoDocs.
  ///
  /// In en, this message translates to:
  /// **'No repository URL is recorded for this module.'**
  String get storeDocsErrorNoDocs;

  /// No description provided for @storeDocsErrorAuth.
  ///
  /// In en, this message translates to:
  /// **'The registry requires authentication to fetch this README. Set CHAIN_REGISTRY_TOKEN in the daemon\'s environment and restart the hub.'**
  String get storeDocsErrorAuth;

  /// No description provided for @storeDocsErrorNetwork.
  ///
  /// In en, this message translates to:
  /// **'Network error while fetching the README. {detail}'**
  String storeDocsErrorNetwork(String detail);

  /// No description provided for @storeDocsErrorParse.
  ///
  /// In en, this message translates to:
  /// **'README is not valid UTF-8.'**
  String get storeDocsErrorParse;

  /// No description provided for @storeDocsErrorGeneric.
  ///
  /// In en, this message translates to:
  /// **'Could not load README.'**
  String get storeDocsErrorGeneric;

  /// No description provided for @storeSourceLabel.
  ///
  /// In en, this message translates to:
  /// **'Source'**
  String get storeSourceLabel;

  /// No description provided for @storeSourceAll.
  ///
  /// In en, this message translates to:
  /// **'All sources'**
  String get storeSourceAll;

  /// No description provided for @storeSourceNative.
  ///
  /// In en, this message translates to:
  /// **'Native'**
  String get storeSourceNative;

  /// No description provided for @storeSourceMcp.
  ///
  /// In en, this message translates to:
  /// **'MCP'**
  String get storeSourceMcp;

  /// No description provided for @storeSourceN8n.
  ///
  /// In en, this message translates to:
  /// **'n8n'**
  String get storeSourceN8n;

  /// No description provided for @storeProvenanceNative.
  ///
  /// In en, this message translates to:
  /// **'native'**
  String get storeProvenanceNative;

  /// No description provided for @storeProvenanceMcp.
  ///
  /// In en, this message translates to:
  /// **'mcp · {provider}'**
  String storeProvenanceMcp(String provider);

  /// No description provided for @storeProvenanceN8n.
  ///
  /// In en, this message translates to:
  /// **'n8n · {provider}'**
  String storeProvenanceN8n(String provider);

  /// No description provided for @storeRecommendedTitle.
  ///
  /// In en, this message translates to:
  /// **'Add a public source — one click'**
  String get storeRecommendedTitle;

  /// No description provided for @storeRecommendedBody.
  ///
  /// In en, this message translates to:
  /// **'Curated MCP servers reachable over HTTPS. No subprocess, no API key, no Node. Federated capabilities appear in the store immediately.'**
  String get storeRecommendedBody;

  /// No description provided for @storeRecommendedAddTooltip.
  ///
  /// In en, this message translates to:
  /// **'Add and discover'**
  String get storeRecommendedAddTooltip;

  /// No description provided for @storeRecommendedAdding.
  ///
  /// In en, this message translates to:
  /// **'Adding…'**
  String get storeRecommendedAdding;

  /// No description provided for @storeRecommendedDeepWikiTagline.
  ///
  /// In en, this message translates to:
  /// **'GitHub repo documentation search (AI-powered)'**
  String get storeRecommendedDeepWikiTagline;

  /// No description provided for @storeRecommendedSemgrepTagline.
  ///
  /// In en, this message translates to:
  /// **'Security scanning for code vulnerabilities'**
  String get storeRecommendedSemgrepTagline;

  /// No description provided for @storeProviderAddedToast.
  ///
  /// In en, this message translates to:
  /// **'Added {name} — {n} federated {n, plural, =1{capability} other{capabilities}}.'**
  String storeProviderAddedToast(String name, int n);

  /// No description provided for @storeProviderAddedZeroToast.
  ///
  /// In en, this message translates to:
  /// **'{name} registered, but the server returned no capabilities yet. Open Settings → MCP Clients to retry discovery or check the server.'**
  String storeProviderAddedZeroToast(String name);

  /// No description provided for @storeProviderAddFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not add {name}: {error}'**
  String storeProviderAddFailed(String name, String error);

  /// No description provided for @auditTitle.
  ///
  /// In en, this message translates to:
  /// **'Audit'**
  String get auditTitle;

  /// No description provided for @auditNoEvents.
  ///
  /// In en, this message translates to:
  /// **'No events yet'**
  String get auditNoEvents;

  /// No description provided for @auditNoEventsHint.
  ///
  /// In en, this message translates to:
  /// **'Run a flow to populate the audit stream.\nEvents appear here within seconds.'**
  String get auditNoEventsHint;

  /// No description provided for @auditFilterAll.
  ///
  /// In en, this message translates to:
  /// **'all'**
  String get auditFilterAll;

  /// No description provided for @auditFilterFlow.
  ///
  /// In en, this message translates to:
  /// **'flow'**
  String get auditFilterFlow;

  /// No description provided for @auditFilterStep.
  ///
  /// In en, this message translates to:
  /// **'step'**
  String get auditFilterStep;

  /// No description provided for @auditFilterModule.
  ///
  /// In en, this message translates to:
  /// **'module'**
  String get auditFilterModule;

  /// No description provided for @auditClearLogTooltip.
  ///
  /// In en, this message translates to:
  /// **'Clear log (local/dev channels only)'**
  String get auditClearLogTooltip;

  /// No description provided for @auditClearedToast.
  ///
  /// In en, this message translates to:
  /// **'Cleared {n} events on channel \"{channel}\". Chain reseeded with marker.'**
  String auditClearedToast(int n, String channel);

  /// No description provided for @auditClearFailed.
  ///
  /// In en, this message translates to:
  /// **'Clear failed: {detail}'**
  String auditClearFailed(String detail);

  /// No description provided for @auditExplain.
  ///
  /// In en, this message translates to:
  /// **'Explain'**
  String get auditExplain;

  /// No description provided for @auditReask.
  ///
  /// In en, this message translates to:
  /// **'Re-ask'**
  String get auditReask;

  /// No description provided for @auditAsking.
  ///
  /// In en, this message translates to:
  /// **'Asking…'**
  String get auditAsking;

  /// No description provided for @auditSystemAi.
  ///
  /// In en, this message translates to:
  /// **'SYSTEM AI'**
  String get auditSystemAi;

  /// No description provided for @auditCachedPill.
  ///
  /// In en, this message translates to:
  /// **'cached'**
  String get auditCachedPill;

  /// No description provided for @auditOriginalLatency.
  ///
  /// In en, this message translates to:
  /// **'orig {ms} ms'**
  String auditOriginalLatency(int ms);

  /// No description provided for @auditLatency.
  ///
  /// In en, this message translates to:
  /// **'{ms} ms'**
  String auditLatency(int ms);

  /// No description provided for @auditRegenerateTooltip.
  ///
  /// In en, this message translates to:
  /// **'Regenerate — skip cache, ask the model again'**
  String get auditRegenerateTooltip;

  /// No description provided for @auditLiveStatus.
  ///
  /// In en, this message translates to:
  /// **'live · polling 2s · {n} {n, plural, =1{event} other{events}}'**
  String auditLiveStatus(int n);

  /// No description provided for @auditDisconnected.
  ///
  /// In en, this message translates to:
  /// **'disconnected · {error}'**
  String auditDisconnected(String error);

  /// No description provided for @auditHashChainVerified.
  ///
  /// In en, this message translates to:
  /// **'hash chain verified'**
  String get auditHashChainVerified;

  /// No description provided for @auditDetailHeader.
  ///
  /// In en, this message translates to:
  /// **'DETAIL'**
  String get auditDetailHeader;

  /// No description provided for @auditAskingFull.
  ///
  /// In en, this message translates to:
  /// **'Asking the configured System AI…'**
  String get auditAskingFull;

  /// No description provided for @auditFixLabel.
  ///
  /// In en, this message translates to:
  /// **'FIX'**
  String get auditFixLabel;

  /// No description provided for @auditCachedTooltipKnown.
  ///
  /// In en, this message translates to:
  /// **'Served from the local cache. Originally generated on {at}{hits}.'**
  String auditCachedTooltipKnown(String at, String hits);

  /// No description provided for @auditCachedTooltipUnknown.
  ///
  /// In en, this message translates to:
  /// **'Served from the local cache. Originally generated at unknown time{hits}.'**
  String auditCachedTooltipUnknown(String hits);

  /// No description provided for @auditCachedTooltipHits.
  ///
  /// In en, this message translates to:
  /// **' · {n} hits'**
  String auditCachedTooltipHits(int n);

  /// No description provided for @auditConfigureSystemAi.
  ///
  /// In en, this message translates to:
  /// **'Configure System AI in Settings (Cmd+,)'**
  String get auditConfigureSystemAi;

  /// No description provided for @auditClearDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Clear audit log?'**
  String get auditClearDialogTitle;

  /// No description provided for @auditClearDialogBody.
  ///
  /// In en, this message translates to:
  /// **'Wipes every audit event on the active channel and seeds a fresh chain.reset marker carrying reviewer + reason. Refused on beta / production. Irreversible.'**
  String get auditClearDialogBody;

  /// No description provided for @auditClearReviewerLabel.
  ///
  /// In en, this message translates to:
  /// **'Reviewer'**
  String get auditClearReviewerLabel;

  /// No description provided for @auditClearReasonLabel.
  ///
  /// In en, this message translates to:
  /// **'Reason (recorded in chain.reset marker)'**
  String get auditClearReasonLabel;

  /// No description provided for @auditClearReasonHelper.
  ///
  /// In en, this message translates to:
  /// **'Required — auditors will read this.'**
  String get auditClearReasonHelper;

  /// No description provided for @auditClearLogButton.
  ///
  /// In en, this message translates to:
  /// **'Clear log'**
  String get auditClearLogButton;

  /// No description provided for @modulesTitle.
  ///
  /// In en, this message translates to:
  /// **'Modules'**
  String get modulesTitle;

  /// No description provided for @modulesNoneTitle.
  ///
  /// In en, this message translates to:
  /// **'No modules yet'**
  String get modulesNoneTitle;

  /// No description provided for @modulesNoneHint.
  ///
  /// In en, this message translates to:
  /// **'Run `chain install <capability-name>` or check ~/.chain/modules/.'**
  String get modulesNoneHint;

  /// No description provided for @modulesReloadTooltip.
  ///
  /// In en, this message translates to:
  /// **'Reload'**
  String get modulesReloadTooltip;

  /// No description provided for @modulesRecentActivity.
  ///
  /// In en, this message translates to:
  /// **'RECENT ACTIVITY'**
  String get modulesRecentActivity;

  /// No description provided for @modulesRecentActivityHint.
  ///
  /// In en, this message translates to:
  /// **'last {n} install/uninstall events from the audit log'**
  String modulesRecentActivityHint(int n);

  /// No description provided for @modulesActivityInstalled.
  ///
  /// In en, this message translates to:
  /// **'installed'**
  String get modulesActivityInstalled;

  /// No description provided for @modulesActivityUninstalled.
  ///
  /// In en, this message translates to:
  /// **'uninstalled'**
  String get modulesActivityUninstalled;

  /// No description provided for @modulesCapabilitiesLabel.
  ///
  /// In en, this message translates to:
  /// **'Capabilities'**
  String get modulesCapabilitiesLabel;

  /// No description provided for @modulesUninstallTitle.
  ///
  /// In en, this message translates to:
  /// **'Uninstall module?'**
  String get modulesUninstallTitle;

  /// No description provided for @modulesUninstallBody.
  ///
  /// In en, this message translates to:
  /// **'Removes {name} v{version} from this hub. Flows that reference it will fail at the next run. A `module.uninstalled` audit event is recorded.'**
  String modulesUninstallBody(String name, String version);

  /// No description provided for @modulesUninstalledToast.
  ///
  /// In en, this message translates to:
  /// **'Uninstalled {name} v{version}.'**
  String modulesUninstalledToast(String name, String version);

  /// No description provided for @modulesUninstallFailed.
  ///
  /// In en, this message translates to:
  /// **'Uninstall failed: {error}'**
  String modulesUninstallFailed(String error);

  /// No description provided for @modulesUninstalling.
  ///
  /// In en, this message translates to:
  /// **'Uninstalling…'**
  String get modulesUninstalling;

  /// No description provided for @moduleSheetFailedToLoad.
  ///
  /// In en, this message translates to:
  /// **'Failed to load: {error}'**
  String moduleSheetFailedToLoad(String error);

  /// No description provided for @moduleSheetCapabilities.
  ///
  /// In en, this message translates to:
  /// **'Capabilities'**
  String get moduleSheetCapabilities;

  /// No description provided for @moduleSheetPermissions.
  ///
  /// In en, this message translates to:
  /// **'Declared permissions'**
  String get moduleSheetPermissions;

  /// No description provided for @moduleSheetNoPermissions.
  ///
  /// In en, this message translates to:
  /// **'(none — pure-computation module)'**
  String get moduleSheetNoPermissions;

  /// No description provided for @flowsTitle.
  ///
  /// In en, this message translates to:
  /// **'Flows'**
  String get flowsTitle;

  /// No description provided for @flowsReloadTooltip.
  ///
  /// In en, this message translates to:
  /// **'Reload'**
  String get flowsReloadTooltip;

  /// No description provided for @flowsNoneTitle.
  ///
  /// In en, this message translates to:
  /// **'No saved flows'**
  String get flowsNoneTitle;

  /// No description provided for @flowsNoneHint.
  ///
  /// In en, this message translates to:
  /// **'Save a flow with `chain admin flows save <name> <flow.yaml>` and it shows up here.'**
  String get flowsNoneHint;

  /// No description provided for @flowsRunDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Run {name}'**
  String flowsRunDialogTitle(String name);

  /// No description provided for @flowsRunDialogBody.
  ///
  /// In en, this message translates to:
  /// **'One field per declared input. Pick a file for bytes-shaped inputs; type plain text for the rest. The Run button enables when every required input is set.'**
  String get flowsRunDialogBody;

  /// No description provided for @flowsLoadingDefinition.
  ///
  /// In en, this message translates to:
  /// **'Loading inputs…'**
  String get flowsLoadingDefinition;

  /// No description provided for @flowsDefinitionFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not load flow definition'**
  String get flowsDefinitionFailed;

  /// No description provided for @flowsNoInputs.
  ///
  /// In en, this message translates to:
  /// **'This flow declares no inputs. Click Run to start.'**
  String get flowsNoInputs;

  /// No description provided for @flowsTypeBytesPick.
  ///
  /// In en, this message translates to:
  /// **'Choose file…'**
  String get flowsTypeBytesPick;

  /// No description provided for @flowsTypeBytesChange.
  ///
  /// In en, this message translates to:
  /// **'Change file'**
  String get flowsTypeBytesChange;

  /// No description provided for @flowsTypeBytesNoFile.
  ///
  /// In en, this message translates to:
  /// **'No file selected'**
  String get flowsTypeBytesNoFile;

  /// No description provided for @flowsTypeBytesSize.
  ///
  /// In en, this message translates to:
  /// **'{n} bytes'**
  String flowsTypeBytesSize(int n);

  /// No description provided for @flowsRunErrorTitle.
  ///
  /// In en, this message translates to:
  /// **'Flow run failed'**
  String get flowsRunErrorTitle;

  /// No description provided for @flowsFileReadFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not read \"{path}\": {error}'**
  String flowsFileReadFailed(String path, String error);

  /// No description provided for @flowsMissingModulesLabel.
  ///
  /// In en, this message translates to:
  /// **'Needs:'**
  String get flowsMissingModulesLabel;

  /// No description provided for @flowsRunDisabledTooltip.
  ///
  /// In en, this message translates to:
  /// **'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 @flowsInstallAuthWallButton.
  ///
  /// In en, this message translates to:
  /// **'Add registry token'**
  String get flowsInstallAuthWallButton;

  /// No description provided for @flowsOpenInEditorTooltip.
  ///
  /// In en, this message translates to:
  /// **'Open in Studio\'s flow 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 @registryCredentialsHeader.
  ///
  /// In en, this message translates to:
  /// **'REGISTRY CREDENTIALS'**
  String get registryCredentialsHeader;

  /// No description provided for @registryCredentialsBlurb.
  ///
  /// In en, this message translates to:
  /// **'Token used to download .fai modules from a registry behind a signin wall (Forgejo, GitHub-private). Stored at ~/.chain/registry-token, mode 0600. The CHAIN_REGISTRY_TOKEN env var still wins when set.'**
  String get registryCredentialsBlurb;

  /// No description provided for @registryTokenStatusConfigured.
  ///
  /// In en, this message translates to:
  /// **'Configured ({chars} chars)'**
  String registryTokenStatusConfigured(int chars);

  /// No description provided for @registryTokenStatusNotSet.
  ///
  /// In en, this message translates to:
  /// **'Not set'**
  String get registryTokenStatusNotSet;

  /// No description provided for @registryTokenFieldLabel.
  ///
  /// In en, this message translates to:
  /// **'Token'**
  String get registryTokenFieldLabel;

  /// No description provided for @registryTokenFieldHint.
  ///
  /// In en, this message translates to:
  /// **'Paste your Forgejo or GitHub personal access token'**
  String get registryTokenFieldHint;

  /// No description provided for @registryTokenSaveButton.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get registryTokenSaveButton;

  /// No description provided for @registryTokenClearButton.
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get registryTokenClearButton;

  /// No description provided for @registryTokenStorageHint.
  ///
  /// In en, this message translates to:
  /// **'Saved locally to ~/.chain/registry-token. Never sent to a remote service.'**
  String get registryTokenStorageHint;

  /// No description provided for @registryTokenSavedToast.
  ///
  /// In en, this message translates to:
  /// **'Registry token saved.'**
  String get registryTokenSavedToast;

  /// No description provided for @registryTokenClearedToast.
  ///
  /// In en, this message translates to:
  /// **'Registry token cleared.'**
  String get registryTokenClearedToast;

  /// No description provided for @registryTokenSaveFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Could not save: {error}'**
  String registryTokenSaveFailedToast(String error);

  /// No description provided for @hubAuthTokenHeader.
  ///
  /// In en, this message translates to:
  /// **'HUB AUTHENTICATION'**
  String get hubAuthTokenHeader;

  /// No description provided for @hubAuthTokenBlurb.
  ///
  /// In en, this message translates to:
  /// **'Bearer token used to authenticate Studio against a hub that has auth.tokens: configured (RBAC Level 2). Stored at ~/.chain/hub-auth-token, mode 0600. Studio sends it as Authorization: Bearer on every gRPC call.'**
  String get hubAuthTokenBlurb;

  /// No description provided for @hubAuthTokenStatusConfigured.
  ///
  /// In en, this message translates to:
  /// **'Configured ({chars} chars)'**
  String hubAuthTokenStatusConfigured(int chars);

  /// No description provided for @hubAuthTokenStatusNotSet.
  ///
  /// In en, this message translates to:
  /// **'Not set (anonymous)'**
  String get hubAuthTokenStatusNotSet;

  /// No description provided for @hubAuthTokenFieldLabel.
  ///
  /// In en, this message translates to:
  /// **'Token'**
  String get hubAuthTokenFieldLabel;

  /// No description provided for @hubAuthTokenFieldHint.
  ///
  /// In en, this message translates to:
  /// **'Paste a token from the hub operator\'s auth.tokens entry'**
  String get hubAuthTokenFieldHint;

  /// No description provided for @hubAuthTokenSaveButton.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get hubAuthTokenSaveButton;

  /// No description provided for @hubAuthTokenClearButton.
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get hubAuthTokenClearButton;

  /// No description provided for @hubAuthTokenStorageHint.
  ///
  /// In en, this message translates to:
  /// **'Saved locally to ~/.chain/hub-auth-token. Studio reconnects after save so the new token takes effect immediately.'**
  String get hubAuthTokenStorageHint;

  /// No description provided for @hubAuthTokenSavedToast.
  ///
  /// In en, this message translates to:
  /// **'Hub auth token saved.'**
  String get hubAuthTokenSavedToast;

  /// No description provided for @hubAuthTokenClearedToast.
  ///
  /// In en, this message translates to:
  /// **'Hub auth token cleared.'**
  String get hubAuthTokenClearedToast;

  /// No description provided for @hubAuthTokenSaveFailedToast.
  ///
  /// In en, this message translates to:
  /// **'Could not save: {error}'**
  String hubAuthTokenSaveFailedToast(String error);

  /// No description provided for @storeAdvisoryVersionTooltip.
  ///
  /// In en, this message translates to:
  /// **'Federated upstream service — version is advisory; the upstream may break compatibility without bumping it.'**
  String get storeAdvisoryVersionTooltip;

  /// No description provided for @uninstallVersionPickerTitle.
  ///
  /// In en, this message translates to:
  /// **'Pick a version to uninstall'**
  String get uninstallVersionPickerTitle;

  /// No description provided for @uninstallVersionPickerBody.
  ///
  /// In en, this message translates to:
  /// **'Several versions of `{module}` are installed side-by-side. Select the exact version to remove — the others stay in place.'**
  String uninstallVersionPickerBody(String module);

  /// No description provided for @uninstallVersionPickerContinue.
  ///
  /// In en, this message translates to:
  /// **'Continue'**
  String get uninstallVersionPickerContinue;

  /// No description provided for @defaultScopeHeader.
  ///
  /// In en, this message translates to:
  /// **'DEFAULT SCOPE'**
  String get defaultScopeHeader;

  /// No description provided for @defaultScopeBlurb.
  ///
  /// In en, this message translates to:
  /// **'Ordered list of publisher segments the hub consults when a flow names a capability without an explicit `<provider>/` prefix. First match wins — promote the segments your team uses most to the top. Catalog-known publishers appear as chips; arbitrary entries are accepted for private segments.'**
  String get defaultScopeBlurb;

  /// No description provided for @defaultScopeAddLabel.
  ///
  /// In en, this message translates to:
  /// **'Add publisher segment'**
  String get defaultScopeAddLabel;

  /// No description provided for @defaultScopeAddHint.
  ///
  /// In en, this message translates to:
  /// **'e.g. acme.team'**
  String get defaultScopeAddHint;

  /// No description provided for @defaultScopeAddButton.
  ///
  /// In en, this message translates to:
  /// **'Add'**
  String get defaultScopeAddButton;

  /// No description provided for @defaultScopeSuggestions.
  ///
  /// In en, this message translates to:
  /// **'Catalog suggestions:'**
  String get defaultScopeSuggestions;

  /// No description provided for @defaultScopeSavedToast.
  ///
  /// In en, this message translates to:
  /// **'Default scope updated.'**
  String get defaultScopeSavedToast;

  /// No description provided for @defaultScopeLoadFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not load default scope.'**
  String get defaultScopeLoadFailed;

  /// No description provided for @defaultScopeNonEmptyError.
  ///
  /// In en, this message translates to:
  /// **'Default scope cannot be empty — keep at least one segment.'**
  String get defaultScopeNonEmptyError;

  /// No description provided for @maintenanceHeader.
  ///
  /// In en, this message translates to:
  /// **'HUB MAINTENANCE'**
  String get maintenanceHeader;

  /// No description provided for @maintenanceResetBlurb.
  ///
  /// In en, this message translates to:
  /// **'Wipe operator state and start over with a clean hub. Stops every running daemon, atomically backs ~/.chain/ up, then recreates it with the binary, channel state, MCP / n8n / system-AI config, and registry token preserved. Restore by moving the backup directory back.'**
  String get maintenanceResetBlurb;

  /// No description provided for @maintenanceKeepModulesTitle.
  ///
  /// In en, this message translates to:
  /// **'Keep installed modules'**
  String get maintenanceKeepModulesTitle;

  /// No description provided for @maintenanceKeepModulesSubtitle.
  ///
  /// In en, this message translates to:
  /// **'Default behaviour wipes ~/.chain/modules/ so a fresh install can verify the module-fetch path end-to-end.'**
  String get maintenanceKeepModulesSubtitle;

  /// No description provided for @maintenanceKeepDataTitle.
  ///
  /// In en, this message translates to:
  /// **'Keep audit log + saved flows'**
  String get maintenanceKeepDataTitle;

  /// No description provided for @maintenanceKeepDataSubtitle.
  ///
  /// In en, this message translates to:
  /// **'Default behaviour wipes ~/.chain/data/ so the audit chain restarts from a fresh genesis and the bundled sample flows re-import on first daemon start.'**
  String get maintenanceKeepDataSubtitle;

  /// No description provided for @maintenanceResetButton.
  ///
  /// In en, this message translates to:
  /// **'Reset hub state'**
  String get maintenanceResetButton;

  /// No description provided for @maintenanceResetInProgress.
  ///
  /// In en, this message translates to:
  /// **'Resetting…'**
  String get maintenanceResetInProgress;

  /// No description provided for @maintenanceResetConfirmTitle.
  ///
  /// In en, this message translates to:
  /// **'Reset hub state?'**
  String get maintenanceResetConfirmTitle;

  /// No description provided for @maintenanceResetConfirmBody.
  ///
  /// In en, this message translates to:
  /// **'This stops every daemon, moves ~/.chain/ to a timestamped backup, and starts fresh. The backup is fully restorable. Continue?'**
  String get maintenanceResetConfirmBody;

  /// No description provided for @maintenanceResetConfirmButton.
  ///
  /// In en, this message translates to:
  /// **'Reset'**
  String get maintenanceResetConfirmButton;

  /// No description provided for @welcomeChecklistAllSetTitle.
  ///
  /// In en, this message translates to:
  /// **'You\'re set up.'**
  String get welcomeChecklistAllSetTitle;

  /// No description provided for @welcomeChecklistAllSetBody.
  ///
  /// In en, this message translates to:
  /// **'Three threads to pull on next:'**
  String get welcomeChecklistAllSetBody;

  /// No description provided for @welcomeChecklistNextAuditTitle.
  ///
  /// In en, this message translates to:
  /// **'Read the audit log'**
  String get welcomeChecklistNextAuditTitle;

  /// No description provided for @welcomeChecklistNextAuditBody.
  ///
  /// In en, this message translates to:
  /// **'Every install, flow run, and approval lives in the hash-chained log. Open the Audit tab to see what your hub has been up to.'**
  String get welcomeChecklistNextAuditBody;

  /// No description provided for @welcomeChecklistNextAuditButton.
  ///
  /// In en, this message translates to:
  /// **'Open Audit'**
  String get welcomeChecklistNextAuditButton;

  /// No description provided for @welcomeChecklistNextTodayTitle.
  ///
  /// In en, this message translates to:
  /// **'Set up the daily Today story'**
  String get welcomeChecklistNextTodayTitle;

  /// No description provided for @welcomeChecklistNextTodayBody.
  ///
  /// In en, this message translates to:
  /// **'Run tools/today/propose.sh on a cron and the editorial card on the store auto-fills with operator-curated narratives.'**
  String get welcomeChecklistNextTodayBody;

  /// No description provided for @welcomeChecklistNextTodayButton.
  ///
  /// In en, this message translates to:
  /// **'Open Today docs'**
  String get welcomeChecklistNextTodayButton;

  /// No description provided for @welcomeChecklistNextModuleTitle.
  ///
  /// In en, this message translates to:
  /// **'Build your own module'**
  String get welcomeChecklistNextModuleTitle;

  /// No description provided for @welcomeChecklistNextModuleBody.
  ///
  /// In en, this message translates to:
  /// **'Generate a Rust+WASM scaffold with `chain new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.'**
  String get welcomeChecklistNextModuleBody;

  /// No description provided for @welcomeChecklistNextModuleButton.
  ///
  /// In en, this message translates to:
  /// **'Read the docs'**
  String get welcomeChecklistNextModuleButton;

  /// No description provided for @auditGroupToday.
  ///
  /// In en, this message translates to:
  /// **'TODAY'**
  String get auditGroupToday;

  /// No description provided for @auditGroupYesterday.
  ///
  /// In en, this message translates to:
  /// **'YESTERDAY'**
  String get auditGroupYesterday;

  /// No description provided for @auditGroupThisWeek.
  ///
  /// In en, this message translates to:
  /// **'EARLIER THIS WEEK'**
  String get auditGroupThisWeek;

  /// No description provided for @auditGroupOlder.
  ///
  /// In en, this message translates to:
  /// **'OLDER'**
  String get auditGroupOlder;

  /// No description provided for @auditEventViewFlowRun.
  ///
  /// In en, this message translates to:
  /// **'View flow run'**
  String get auditEventViewFlowRun;

  /// No description provided for @auditFlowRunDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Flow run · {flow}'**
  String auditFlowRunDialogTitle(String flow);

  /// No description provided for @auditFlowRunDialogSubtitle.
  ///
  /// In en, this message translates to:
  /// **'{n} {n, plural, =1{event} other{events}} for execution {execution}'**
  String auditFlowRunDialogSubtitle(int n, String execution);

  /// No description provided for @approvalsSelectAll.
  ///
  /// In en, this message translates to:
  /// **'Select all'**
  String get approvalsSelectAll;

  /// No description provided for @approvalsClearSelection.
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get approvalsClearSelection;

  /// No description provided for @approvalsBatchSelected.
  ///
  /// In en, this message translates to:
  /// **'{n} selected'**
  String approvalsBatchSelected(int n);

  /// No description provided for @approvalsBatchApprove.
  ///
  /// In en, this message translates to:
  /// **'Approve all'**
  String get approvalsBatchApprove;

  /// No description provided for @approvalsBatchReject.
  ///
  /// In en, this message translates to:
  /// **'Reject all'**
  String get approvalsBatchReject;

  /// No description provided for @approvalsBatchApproveDoneToast.
  ///
  /// In en, this message translates to:
  /// **'{n} approvals approved.'**
  String approvalsBatchApproveDoneToast(int n);

  /// No description provided for @approvalsBatchRejectDoneToast.
  ///
  /// In en, this message translates to:
  /// **'{n} approvals rejected.'**
  String approvalsBatchRejectDoneToast(int n);

  /// No description provided for @approvalsBatchPartialFailure.
  ///
  /// In en, this message translates to:
  /// **'{ok} done, {failed} failed.'**
  String approvalsBatchPartialFailure(int ok, int failed);

  /// No description provided for @flowsRunButton.
  ///
  /// In en, this message translates to:
  /// **'Run'**
  String get flowsRunButton;

  /// No description provided for @flowsRunningTitle.
  ///
  /// In en, this message translates to:
  /// **'Running {name}'**
  String flowsRunningTitle(String name);

  /// No description provided for @flowsResultTitle.
  ///
  /// In en, this message translates to:
  /// **'{name} — result'**
  String flowsResultTitle(String name);

  /// No description provided for @flowsErrorTitle.
  ///
  /// In en, this message translates to:
  /// **'{name} — failed'**
  String flowsErrorTitle(String name);

  /// No description provided for @flowsRunning.
  ///
  /// In en, this message translates to:
  /// **'Flow running…'**
  String get flowsRunning;

  /// No description provided for @flowsNoOutputs.
  ///
  /// In en, this message translates to:
  /// **'Flow completed with no declared outputs.'**
  String get flowsNoOutputs;

  /// No description provided for @errGeneric.
  ///
  /// In en, this message translates to:
  /// **'Something went wrong.'**
  String get errGeneric;

  /// No description provided for @errInvalidArgument.
  ///
  /// In en, this message translates to:
  /// **'Invalid input.'**
  String get errInvalidArgument;

  /// No description provided for @errInvalidArgumentHint.
  ///
  /// In en, this message translates to:
  /// **'Check the form values and try again.'**
  String get errInvalidArgumentHint;

  /// No description provided for @errNotFound.
  ///
  /// In en, this message translates to:
  /// **'Not found.'**
  String get errNotFound;

  /// No description provided for @errNotFoundHint.
  ///
  /// In en, this message translates to:
  /// **'The item you asked for isn\'t here — it may have been removed or never existed.'**
  String get errNotFoundHint;

  /// No description provided for @errAlreadyExists.
  ///
  /// In en, this message translates to:
  /// **'Already exists.'**
  String get errAlreadyExists;

  /// No description provided for @errPermissionDenied.
  ///
  /// In en, this message translates to:
  /// **'Permission denied.'**
  String get errPermissionDenied;

  /// No description provided for @errPermissionDeniedHint.
  ///
  /// In en, this message translates to:
  /// **'The hub\'s operator policy blocks this action. Check `~/.chain/config.yaml`.'**
  String get errPermissionDeniedHint;

  /// No description provided for @errFailedPrecondition.
  ///
  /// In en, this message translates to:
  /// **'Setup issue blocked this.'**
  String get errFailedPrecondition;

  /// No description provided for @errFailedPreconditionHint.
  ///
  /// In en, this message translates to:
  /// **'The hub couldn\'t proceed because something it needs isn\'t ready. The detail below explains what.'**
  String get errFailedPreconditionHint;

  /// No description provided for @errInternal.
  ///
  /// In en, this message translates to:
  /// **'Unexpected internal error.'**
  String get errInternal;

  /// No description provided for @errInternalHint.
  ///
  /// In en, this message translates to:
  /// **'Check the hub logs at `~/.chain/logs/`. If this repeats, please report it.'**
  String get errInternalHint;

  /// No description provided for @errUnavailable.
  ///
  /// In en, this message translates to:
  /// **'Hub not reachable.'**
  String get errUnavailable;

  /// No description provided for @errUnavailableHint.
  ///
  /// In en, this message translates to:
  /// **'Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio\'s settings.'**
  String get errUnavailableHint;

  /// No description provided for @errUnauthenticated.
  ///
  /// In en, this message translates to:
  /// **'Authentication required.'**
  String get errUnauthenticated;

  /// No description provided for @errUnauthenticatedHint.
  ///
  /// In en, this message translates to:
  /// **'Set `CHAIN_REGISTRY_TOKEN` or sign in through Settings before retrying.'**
  String get errUnauthenticatedHint;

  /// No description provided for @errCopyDetail.
  ///
  /// In en, this message translates to:
  /// **'Copy detail'**
  String get errCopyDetail;

  /// No description provided for @errDetailCopied.
  ///
  /// In en, this message translates to:
  /// **'Detail copied to clipboard.'**
  String get errDetailCopied;

  /// No description provided for @flowsOutputUnknown.
  ///
  /// In en, this message translates to:
  /// **'Output payload variant not recognised.'**
  String get flowsOutputUnknown;

  /// No description provided for @flowsOutputBytesUnknownMime.
  ///
  /// In en, this message translates to:
  /// **'binary'**
  String get flowsOutputBytesUnknownMime;

  /// No description provided for @flowsOutputSaveAs.
  ///
  /// In en, this message translates to:
  /// **'Save as…'**
  String get flowsOutputSaveAs;

  /// No description provided for @flowsOutputSaveAsTitle.
  ///
  /// In en, this message translates to:
  /// **'Save flow output'**
  String get flowsOutputSaveAsTitle;

  /// No description provided for @flowsOutputSavedAt.
  ///
  /// In en, this message translates to:
  /// **'Saved to {path}'**
  String flowsOutputSavedAt(String path);

  /// No description provided for @flowsOutputSaveFailed.
  ///
  /// In en, this message translates to:
  /// **'Save failed: {error}'**
  String flowsOutputSaveFailed(String error);

  /// No description provided for @flowsOutputOpen.
  ///
  /// In en, this message translates to:
  /// **'Open'**
  String get flowsOutputOpen;

  /// No description provided for @flowsOutputOpenFailed.
  ///
  /// In en, this message translates to:
  /// **'Open failed: {error}'**
  String flowsOutputOpenFailed(String error);

  /// No description provided for @approvalsTitle.
  ///
  /// In en, this message translates to:
  /// **'Approvals'**
  String get approvalsTitle;

  /// No description provided for @approvalsTabPending.
  ///
  /// In en, this message translates to:
  /// **'Pending'**
  String get approvalsTabPending;

  /// No description provided for @approvalsTabHistory.
  ///
  /// In en, this message translates to:
  /// **'History'**
  String get approvalsTabHistory;

  /// No description provided for @approvalsInboxZero.
  ///
  /// In en, this message translates to:
  /// **'Inbox zero'**
  String get approvalsInboxZero;

  /// No description provided for @approvalsInboxHint.
  ///
  /// In en, this message translates to:
  /// **'All caught up. New `system.approval@^0` steps land here automatically.'**
  String get approvalsInboxHint;

  /// No description provided for @approvalsReloadTooltip.
  ///
  /// In en, this message translates to:
  /// **'Reload'**
  String get approvalsReloadTooltip;

  /// No description provided for @approvalsPillPending.
  ///
  /// In en, this message translates to:
  /// **'pending'**
  String get approvalsPillPending;

  /// No description provided for @approvalsPillApproved.
  ///
  /// In en, this message translates to:
  /// **'approved'**
  String get approvalsPillApproved;

  /// No description provided for @approvalsPillRejected.
  ///
  /// In en, this message translates to:
  /// **'rejected'**
  String get approvalsPillRejected;

  /// No description provided for @approvalsPillExpired.
  ///
  /// In en, this message translates to:
  /// **'expired'**
  String get approvalsPillExpired;

  /// No description provided for @approvalsPayloadPreview.
  ///
  /// In en, this message translates to:
  /// **'DATA TO REVIEW'**
  String get approvalsPayloadPreview;

  /// No description provided for @approvalsNoPayload.
  ///
  /// In en, this message translates to:
  /// **'No data was attached for review. The flow\'s approval step chooses what to show via its \"show:\" field — set it to surface the data behind this decision.'**
  String get approvalsNoPayload;

  /// No description provided for @approvalsRequestFallback.
  ///
  /// In en, this message translates to:
  /// **'Approval required for this step'**
  String get approvalsRequestFallback;

  /// No description provided for @approvalsFlowStepMeta.
  ///
  /// In en, this message translates to:
  /// **'Flow: {flow} · Step: {step}'**
  String approvalsFlowStepMeta(String flow, String step);

  /// No description provided for @approvalsApproveButton.
  ///
  /// In en, this message translates to:
  /// **'Approve'**
  String get approvalsApproveButton;

  /// No description provided for @approvalsRejectButton.
  ///
  /// In en, this message translates to:
  /// **'Reject'**
  String get approvalsRejectButton;

  /// No description provided for @approvalsRejectDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Reject approval'**
  String get approvalsRejectDialogTitle;

  /// No description provided for @approvalsRejectReasonLabel.
  ///
  /// In en, this message translates to:
  /// **'Reason (recorded in audit log)'**
  String get approvalsRejectReasonLabel;

  /// No description provided for @approvalsApprovedToast.
  ///
  /// In en, this message translates to:
  /// **'approved · {flow} › {step}'**
  String approvalsApprovedToast(String flow, String step);

  /// No description provided for @approvalsRejectedToast.
  ///
  /// In en, this message translates to:
  /// **'rejected · {flow} › {step}'**
  String approvalsRejectedToast(String flow, String step);

  /// No description provided for @approvalsApproveFailed.
  ///
  /// In en, this message translates to:
  /// **'approve failed: {error}'**
  String approvalsApproveFailed(String error);

  /// No description provided for @approvalsRejectFailed.
  ///
  /// In en, this message translates to:
  /// **'reject failed: {error}'**
  String approvalsRejectFailed(String error);

  /// No description provided for @approvalsHistoryEmpty.
  ///
  /// In en, this message translates to:
  /// **'No history yet'**
  String get approvalsHistoryEmpty;

  /// No description provided for @approvalsHistoryEmptyHint.
  ///
  /// In en, this message translates to:
  /// **'Decided approvals (approved / rejected / expired) appear here.\nThe audit log keeps the full hash-chained record.'**
  String get approvalsHistoryEmptyHint;

  /// No description provided for @approvalsDialogDecided.
  ///
  /// In en, this message translates to:
  /// **'decided'**
  String get approvalsDialogDecided;

  /// No description provided for @approvalsDialogCreated.
  ///
  /// In en, this message translates to:
  /// **'created'**
  String get approvalsDialogCreated;

  /// No description provided for @approvalsDialogReason.
  ///
  /// In en, this message translates to:
  /// **'reason'**
  String get approvalsDialogReason;

  /// No description provided for @approvalsDialogPrompt.
  ///
  /// In en, this message translates to:
  /// **'PROMPT'**
  String get approvalsDialogPrompt;

  /// No description provided for @approvalsExpiresIn.
  ///
  /// In en, this message translates to:
  /// **'{minutes}m'**
  String approvalsExpiresIn(int minutes);

  /// No description provided for @approvalsExpiresInHours.
  ///
  /// In en, this message translates to:
  /// **'{hours}h'**
  String approvalsExpiresInHours(int hours);

  /// No description provided for @doctorTitle.
  ///
  /// In en, this message translates to:
  /// **'Doctor'**
  String get doctorTitle;

  /// No description provided for @doctorSummaryModules.
  ///
  /// In en, this message translates to:
  /// **'Modules'**
  String get doctorSummaryModules;

  /// No description provided for @doctorSummaryApprovals.
  ///
  /// In en, this message translates to:
  /// **'Approvals'**
  String get doctorSummaryApprovals;

  /// No description provided for @doctorSummaryAudit.
  ///
  /// In en, this message translates to:
  /// **'Audit'**
  String get doctorSummaryAudit;

  /// No description provided for @doctorSummaryServices.
  ///
  /// In en, this message translates to:
  /// **'Services'**
  String get doctorSummaryServices;

  /// No description provided for @doctorSummaryCapabilities.
  ///
  /// In en, this message translates to:
  /// **'{n} capabilities'**
  String doctorSummaryCapabilities(int n);

  /// No description provided for @doctorSummaryPending.
  ///
  /// In en, this message translates to:
  /// **'pending'**
  String get doctorSummaryPending;

  /// No description provided for @doctorSummaryChain.
  ///
  /// In en, this message translates to:
  /// **'{verified}/{total} chain'**
  String doctorSummaryChain(int verified, int total);

  /// No description provided for @doctorSummaryDeclared.
  ///
  /// In en, this message translates to:
  /// **'declared'**
  String get doctorSummaryDeclared;

  /// No description provided for @doctorModulesPanelSummary.
  ///
  /// In en, this message translates to:
  /// **'{n} modules · {m} capabilities'**
  String doctorModulesPanelSummary(int n, int m);

  /// No description provided for @doctorApprovalsNone.
  ///
  /// In en, this message translates to:
  /// **'No pending approvals'**
  String get doctorApprovalsNone;

  /// No description provided for @doctorApprovalsCount.
  ///
  /// In en, this message translates to:
  /// **'{n, plural, =1{1 approval awaiting review} other{{n} approvals awaiting review}}'**
  String doctorApprovalsCount(int n);

  /// No description provided for @doctorApprovalsAttentionPill.
  ///
  /// In en, this message translates to:
  /// **'attention'**
  String get doctorApprovalsAttentionPill;

  /// No description provided for @doctorServicesEmpty.
  ///
  /// In en, this message translates to:
  /// **'No host services declared'**
  String get doctorServicesEmpty;

  /// No description provided for @doctorServicesEmptyHint.
  ///
  /// In en, this message translates to:
  /// **'add to ~/.chain/config.yaml under services:'**
  String get doctorServicesEmptyHint;

  /// No description provided for @doctorPillLoaded.
  ///
  /// In en, this message translates to:
  /// **'loaded'**
  String get doctorPillLoaded;

  /// No description provided for @doctorPillEmpty.
  ///
  /// In en, this message translates to:
  /// **'empty'**
  String get doctorPillEmpty;

  /// No description provided for @doctorRecheckTooltip.
  ///
  /// In en, this message translates to:
  /// **'Re-check'**
  String get doctorRecheckTooltip;

  /// No description provided for @doctorEventLogSection.
  ///
  /// In en, this message translates to:
  /// **'Event log'**
  String get doctorEventLogSection;

  /// No description provided for @doctorModulesApprovalsSection.
  ///
  /// In en, this message translates to:
  /// **'Modules & approvals'**
  String get doctorModulesApprovalsSection;

  /// No description provided for @doctorHostServicesSection.
  ///
  /// In en, this message translates to:
  /// **'Host services'**
  String get doctorHostServicesSection;

  /// No description provided for @doctorDaemonFilesSection.
  ///
  /// In en, this message translates to:
  /// **'Daemon files'**
  String get doctorDaemonFilesSection;

  /// No description provided for @doctorDaemonControlSection.
  ///
  /// In en, this message translates to:
  /// **'Daemon control'**
  String get doctorDaemonControlSection;

  /// No description provided for @doctorChainIntact.
  ///
  /// In en, this message translates to:
  /// **'Hash chain intact'**
  String get doctorChainIntact;

  /// No description provided for @doctorChainIntactDetail.
  ///
  /// In en, this message translates to:
  /// **'{n} events · prev_event_sha256 verified end-to-end'**
  String doctorChainIntactDetail(int n);

  /// No description provided for @doctorChainTampered.
  ///
  /// In en, this message translates to:
  /// **'Tampering detected'**
  String get doctorChainTampered;

  /// No description provided for @doctorChainTamperedDetail.
  ///
  /// In en, this message translates to:
  /// **'{verified} of {total} verified before mismatch at {id}'**
  String doctorChainTamperedDetail(int verified, int total, String id);

  /// No description provided for @doctorChainPillOk.
  ///
  /// In en, this message translates to:
  /// **'WORM-1'**
  String get doctorChainPillOk;

  /// No description provided for @doctorChainPillTamper.
  ///
  /// In en, this message translates to:
  /// **'TAMPER'**
  String get doctorChainPillTamper;

  /// No description provided for @doctorVerifyNow.
  ///
  /// In en, this message translates to:
  /// **'Verify now'**
  String get doctorVerifyNow;

  /// No description provided for @doctorRestart.
  ///
  /// In en, this message translates to:
  /// **'Restart'**
  String get doctorRestart;

  /// No description provided for @doctorStart.
  ///
  /// In en, this message translates to:
  /// **'Start'**
  String get doctorStart;

  /// No description provided for @doctorStop.
  ///
  /// In en, this message translates to:
  /// **'Stop'**
  String get doctorStop;

  /// No description provided for @doctorStatusAction.
  ///
  /// In en, this message translates to:
  /// **'Status'**
  String get doctorStatusAction;

  /// No description provided for @doctorRunningOn.
  ///
  /// In en, this message translates to:
  /// **'Running on {name}: {endpoint}'**
  String doctorRunningOn(String name, String endpoint);

  /// No description provided for @doctorStoppedOn.
  ///
  /// In en, this message translates to:
  /// **'{name} daemon stopped'**
  String doctorStoppedOn(String name);

  /// No description provided for @doctorStatusUnknown.
  ///
  /// In en, this message translates to:
  /// **'Daemon status: …'**
  String get doctorStatusUnknown;

  /// No description provided for @doctorPillRunning.
  ///
  /// In en, this message translates to:
  /// **'running'**
  String get doctorPillRunning;

  /// No description provided for @doctorPillStopped.
  ///
  /// In en, this message translates to:
  /// **'stopped'**
  String get doctorPillStopped;

  /// No description provided for @doctorDaemonControlHint.
  ///
  /// In en, this message translates to:
  /// **'Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.'**
  String get doctorDaemonControlHint;

  /// No description provided for @doctorDaemonControlWorking.
  ///
  /// In en, this message translates to:
  /// **'Working…'**
  String get doctorDaemonControlWorking;

  /// No description provided for @doctorPathLog.
  ///
  /// In en, this message translates to:
  /// **'Log'**
  String get doctorPathLog;

  /// No description provided for @doctorPathConfig.
  ///
  /// In en, this message translates to:
  /// **'Config'**
  String get doctorPathConfig;

  /// No description provided for @doctorPathDb.
  ///
  /// In en, this message translates to:
  /// **'Audit DB'**
  String get doctorPathDb;

  /// No description provided for @doctorPathModules.
  ///
  /// In en, this message translates to:
  /// **'Modules dir'**
  String get doctorPathModules;

  /// No description provided for @doctorPathFlows.
  ///
  /// In en, this message translates to:
  /// **'Flows dir'**
  String get doctorPathFlows;

  /// No description provided for @doctorPathPid.
  ///
  /// In en, this message translates to:
  /// **'PID file'**
  String get doctorPathPid;

  /// No description provided for @doctorPathsEmpty.
  ///
  /// In en, this message translates to:
  /// **'Daemon did not report file paths. Update the running hub via `chain daemon restart`.'**
  String get doctorPathsEmpty;

  /// No description provided for @doctorOpenError.
  ///
  /// In en, this message translates to:
  /// **'Could not open: {detail}'**
  String doctorOpenError(String detail);

  /// No description provided for @doctorUpdateAvailable.
  ///
  /// In en, this message translates to:
  /// **'Update available — {version}'**
  String doctorUpdateAvailable(String version);

  /// No description provided for @doctorUpdateBody.
  ///
  /// In en, this message translates to:
  /// **'Channel {channel} now offers {version}. Apply via the button — Studio shells out to `chain update apply --channel {channel}`.'**
  String doctorUpdateBody(String channel, String version);

  /// No description provided for @doctorUpdateUnreachable.
  ///
  /// In en, this message translates to:
  /// **'Release host unreachable'**
  String get doctorUpdateUnreachable;

  /// No description provided for @doctorUpdateUnreachableBody.
  ///
  /// In en, this message translates to:
  /// **'Could not contact the release feed for {channel}.'**
  String doctorUpdateUnreachableBody(String channel);

  /// No description provided for @doctorReleaseNotes.
  ///
  /// In en, this message translates to:
  /// **'notes: {url}'**
  String doctorReleaseNotes(String url);

  /// No description provided for @doctorPillNew.
  ///
  /// In en, this message translates to:
  /// **'new'**
  String get doctorPillNew;

  /// No description provided for @doctorPillOffline.
  ///
  /// In en, this message translates to:
  /// **'offline'**
  String get doctorPillOffline;

  /// No description provided for @doctorApplyUpdate.
  ///
  /// In en, this message translates to:
  /// **'Apply update'**
  String get doctorApplyUpdate;

  /// No description provided for @doctorApplying.
  ///
  /// In en, this message translates to:
  /// **'Applying…'**
  String get doctorApplying;

  /// No description provided for @doctorApplyDone.
  ///
  /// In en, this message translates to:
  /// **'Update applied. Restart Studio to see the new daemon version.'**
  String get doctorApplyDone;

  /// No description provided for @mcpHeader.
  ///
  /// In en, this message translates to:
  /// **'MCP CLIENTS'**
  String get mcpHeader;

  /// No description provided for @mcpHint.
  ///
  /// In en, this message translates to:
  /// **'External MCP servers federate their tools as `mcp.<server>.<tool>` capabilities. Configure once, see them in the Store.'**
  String get mcpHint;

  /// No description provided for @mcpEmpty.
  ///
  /// In en, this message translates to:
  /// **'No MCP servers configured. Click + to add one.'**
  String get mcpEmpty;

  /// No description provided for @n8nHeader.
  ///
  /// In en, this message translates to:
  /// **'N8N ENDPOINTS'**
  String get n8nHeader;

  /// No description provided for @n8nHint.
  ///
  /// In en, this message translates to:
  /// **'Active n8n workflows surface as `n8n.<endpoint>.<slug>` capabilities. Configure once, see them in the Store.'**
  String get n8nHint;

  /// No description provided for @n8nEmpty.
  ///
  /// In en, this message translates to:
  /// **'No n8n endpoints configured. Click + to add one.'**
  String get n8nEmpty;

  /// No description provided for @hubUnreachable.
  ///
  /// In en, this message translates to:
  /// **'Hub unreachable'**
  String get hubUnreachable;

  /// No description provided for @hubUnreachableHint.
  ///
  /// In en, this message translates to:
  /// **'Start the hub with `chain serve`.'**
  String get hubUnreachableHint;

  /// No description provided for @languageEnglish.
  ///
  /// In en, this message translates to:
  /// **'English'**
  String get languageEnglish;

  /// No description provided for @languageGerman.
  ///
  /// In en, this message translates to:
  /// **'Deutsch'**
  String get languageGerman;

  /// No description provided for @searchHint.
  ///
  /// In en, this message translates to:
  /// **'Jump anywhere — modules, store, flows, pages…'**
  String get searchHint;

  /// No description provided for @searchIndexing.
  ///
  /// In en, this message translates to:
  /// **'Indexing…'**
  String get searchIndexing;

  /// No description provided for @searchNoMatches.
  ///
  /// In en, this message translates to:
  /// **'No matches.'**
  String get searchNoMatches;

  /// No description provided for @searchHintNavigate.
  ///
  /// In en, this message translates to:
  /// **'↑↓ navigate'**
  String get searchHintNavigate;

  /// No description provided for @searchHintOpen.
  ///
  /// In en, this message translates to:
  /// **'enter open'**
  String get searchHintOpen;

  /// No description provided for @searchHintClose.
  ///
  /// In en, this message translates to:
  /// **'esc close'**
  String get searchHintClose;

  /// No description provided for @searchGroupPages.
  ///
  /// In en, this message translates to:
  /// **'Pages'**
  String get searchGroupPages;

  /// No description provided for @searchGroupModules.
  ///
  /// In en, this message translates to:
  /// **'Modules'**
  String get searchGroupModules;

  /// No description provided for @searchGroupStore.
  ///
  /// In en, this message translates to:
  /// **'Store'**
  String get searchGroupStore;

  /// No description provided for @searchGroupFlows.
  ///
  /// In en, this message translates to:
  /// **'Flows'**
  String get searchGroupFlows;

  /// No description provided for @searchSettingsLabel.
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get searchSettingsLabel;

  /// No description provided for @searchPageHint.
  ///
  /// In en, this message translates to:
  /// **'page · ⌘{n}'**
  String searchPageHint(int n);

  /// No description provided for @searchSettingsHint.
  ///
  /// In en, this message translates to:
  /// **'hub endpoint, channels, system AI · ⌘;'**
  String get searchSettingsHint;

  /// No description provided for @searchInstalledModuleHint.
  ///
  /// In en, this message translates to:
  /// **'installed module · v{version}'**
  String searchInstalledModuleHint(String version);

  /// No description provided for @searchStoreUncategorized.
  ///
  /// In en, this message translates to:
  /// **'uncategorized'**
  String get searchStoreUncategorized;

  /// No description provided for @searchStoreHintWithTagline.
  ///
  /// In en, this message translates to:
  /// **'store · {tagline}'**
  String searchStoreHintWithTagline(String tagline);

  /// No description provided for @searchStoreHintWithCategory.
  ///
  /// In en, this message translates to:
  /// **'store · {category}'**
  String searchStoreHintWithCategory(String category);

  /// No description provided for @searchSavedFlowHint.
  ///
  /// In en, this message translates to:
  /// **'saved flow'**
  String get searchSavedFlowHint;

  /// No description provided for @systemAiTitle.
  ///
  /// In en, this message translates to:
  /// **'System AI'**
  String get systemAiTitle;

  /// No description provided for @systemAiIntro.
  ///
  /// In en, this message translates to:
  /// **'The hub-internal LLM the platform itself uses for inline failure explanations and operator help. Off by default; configure here. See docs/architecture/system-ai.md for what crosses the wire.'**
  String get systemAiIntro;

  /// No description provided for @systemAiProviderLabel.
  ///
  /// In en, this message translates to:
  /// **'Provider'**
  String get systemAiProviderLabel;

  /// No description provided for @systemAiEndpointLabel.
  ///
  /// In en, this message translates to:
  /// **'Endpoint URL (up to /v1)'**
  String get systemAiEndpointLabel;

  /// No description provided for @systemAiApiKeyRequired.
  ///
  /// In en, this message translates to:
  /// **'API key env var (required)'**
  String get systemAiApiKeyRequired;

  /// No description provided for @systemAiApiKeyOptional.
  ///
  /// In en, this message translates to:
  /// **'API key env var (optional)'**
  String get systemAiApiKeyOptional;

  /// No description provided for @systemAiApiKeyDisclaimer.
  ///
  /// In en, this message translates to:
  /// **'Studio never reads or stores the key value — only its env-var name. The hub reads `\${name}` at request time.'**
  String systemAiApiKeyDisclaimer(String name);

  /// No description provided for @systemAiTestConnection.
  ///
  /// In en, this message translates to:
  /// **'Test connection'**
  String get systemAiTestConnection;

  /// No description provided for @systemAiTesting.
  ///
  /// In en, this message translates to:
  /// **'Testing…'**
  String get systemAiTesting;

  /// No description provided for @systemAiSave.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get systemAiSave;

  /// No description provided for @systemAiPrivacyHeader.
  ///
  /// In en, this message translates to:
  /// **'PRIVACY MODE'**
  String get systemAiPrivacyHeader;

  /// No description provided for @systemAiPrivacyOffLabel.
  ///
  /// In en, this message translates to:
  /// **'Off'**
  String get systemAiPrivacyOffLabel;

  /// No description provided for @systemAiPrivacyOffDesc.
  ///
  /// In en, this message translates to:
  /// **'Feature disabled. No requests leave the hub.'**
  String get systemAiPrivacyOffDesc;

  /// No description provided for @systemAiPrivacyRedactedLabel.
  ///
  /// In en, this message translates to:
  /// **'Redacted'**
  String get systemAiPrivacyRedactedLabel;

  /// No description provided for @systemAiPrivacyRedactedDesc.
  ///
  /// In en, this message translates to:
  /// **'Only event_type / error / module names. KRITIS-friendly default.'**
  String get systemAiPrivacyRedactedDesc;

  /// No description provided for @systemAiPrivacyFullLabel.
  ///
  /// In en, this message translates to:
  /// **'Full'**
  String get systemAiPrivacyFullLabel;

  /// No description provided for @systemAiPrivacyFullDesc.
  ///
  /// In en, this message translates to:
  /// **'Includes the audit detail JSON (hash-only — no raw payloads).'**
  String get systemAiPrivacyFullDesc;

  /// No description provided for @systemAiConnectionOk.
  ///
  /// In en, this message translates to:
  /// **'Connection ok'**
  String get systemAiConnectionOk;

  /// No description provided for @systemAiConnectionFailed.
  ///
  /// In en, this message translates to:
  /// **'Connection failed'**
  String get systemAiConnectionFailed;

  /// No description provided for @systemAiReplyPrefix.
  ///
  /// In en, this message translates to:
  /// **'Reply: {text}'**
  String systemAiReplyPrefix(String text);

  /// No description provided for @systemAiModelLabel.
  ///
  /// In en, this message translates to:
  /// **'Model (required)'**
  String get systemAiModelLabel;

  /// No description provided for @systemAiModelHintFallback.
  ///
  /// In en, this message translates to:
  /// **'model identifier the provider expects'**
  String get systemAiModelHintFallback;

  /// No description provided for @systemAiModelHelperBase.
  ///
  /// In en, this message translates to:
  /// **'Required: pick from the list (Refresh) or type one.'**
  String get systemAiModelHelperBase;

  /// No description provided for @systemAiModelHelperOllama.
  ///
  /// In en, this message translates to:
  /// **'Required: pick from the list (Refresh) or type one. Use Pull to download from Ollama.'**
  String get systemAiModelHelperOllama;

  /// No description provided for @systemAiRefresh.
  ///
  /// In en, this message translates to:
  /// **'Refresh'**
  String get systemAiRefresh;

  /// No description provided for @systemAiPull.
  ///
  /// In en, this message translates to:
  /// **'Pull'**
  String get systemAiPull;

  /// No description provided for @systemAiPulling.
  ///
  /// In en, this message translates to:
  /// **'Pulling…'**
  String get systemAiPulling;

  /// No description provided for @systemAiCouldNotListModels.
  ///
  /// In en, this message translates to:
  /// **'Could not list models: {error}'**
  String systemAiCouldNotListModels(String error);

  /// No description provided for @systemAiNoModelsOllama.
  ///
  /// In en, this message translates to:
  /// **'No models on the Ollama server yet. Type one above and click Pull.'**
  String get systemAiNoModelsOllama;

  /// No description provided for @systemAiNoModelsGeneric.
  ///
  /// In en, this message translates to:
  /// **'Provider returned no models.'**
  String get systemAiNoModelsGeneric;

  /// No description provided for @systemAiSuitabilityRecommended.
  ///
  /// In en, this message translates to:
  /// **'recommended'**
  String get systemAiSuitabilityRecommended;

  /// No description provided for @systemAiSuitabilityBalanced.
  ///
  /// In en, this message translates to:
  /// **'balanced'**
  String get systemAiSuitabilityBalanced;

  /// No description provided for @systemAiSuitabilitySmall.
  ///
  /// In en, this message translates to:
  /// **'small — quality may be limited'**
  String get systemAiSuitabilitySmall;

  /// No description provided for @systemAiSuitabilityLarge.
  ///
  /// In en, this message translates to:
  /// **'large — slower'**
  String get systemAiSuitabilityLarge;

  /// No description provided for @systemAiSuitabilityHuge.
  ///
  /// In en, this message translates to:
  /// **'huge — likely too slow on a laptop'**
  String get systemAiSuitabilityHuge;

  /// No description provided for @systemAiSuitabilityUnknown.
  ///
  /// In en, this message translates to:
  /// **'size unknown'**
  String get systemAiSuitabilityUnknown;

  /// No description provided for @systemAiHwDetected.
  ///
  /// In en, this message translates to:
  /// **'Detected: {summary}'**
  String systemAiHwDetected(String summary);

  /// No description provided for @systemAiHwReviewed.
  ///
  /// In en, this message translates to:
  /// **' · curation reviewed {date}'**
  String systemAiHwReviewed(String date);

  /// No description provided for @systemAiLegendRecommended.
  ///
  /// In en, this message translates to:
  /// **'recommended for this hardware{tier}'**
  String systemAiLegendRecommended(String tier);

  /// No description provided for @systemAiLegendBalanced.
  ///
  /// In en, this message translates to:
  /// **'balanced (4-8B)'**
  String get systemAiLegendBalanced;

  /// No description provided for @systemAiLegendSmallLarge.
  ///
  /// In en, this message translates to:
  /// **'small <3B / large 9-15B / above hardware'**
  String get systemAiLegendSmallLarge;

  /// No description provided for @systemAiLegendHuge.
  ///
  /// In en, this message translates to:
  /// **'huge >15B'**
  String get systemAiLegendHuge;

  /// No description provided for @systemAiLegendUnknown.
  ///
  /// In en, this message translates to:
  /// **'size unknown'**
  String get systemAiLegendUnknown;

  /// No description provided for @systemAiCacheRow.
  ///
  /// In en, this message translates to:
  /// **'Cache: {n} cached {n, plural, =1{explanation} other{explanations}}. Identical prompts hit the cache; switching model or privacy mode flushes automatically.'**
  String systemAiCacheRow(int n);

  /// No description provided for @systemAiCacheClear.
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get systemAiCacheClear;

  /// No description provided for @systemAiCacheClearedToast.
  ///
  /// In en, this message translates to:
  /// **'Cleared {n} cached System-AI explanations.'**
  String systemAiCacheClearedToast(int n);

  /// No description provided for @systemAiCacheClearFailed.
  ///
  /// In en, this message translates to:
  /// **'Cache clear failed: {error}'**
  String systemAiCacheClearFailed(String error);

  /// No description provided for @systemAiPullEmptyError.
  ///
  /// In en, this message translates to:
  /// **'Type a model id (e.g. gemma3:4b) first.'**
  String get systemAiPullEmptyError;

  /// No description provided for @systemAiPullFailedError.
  ///
  /// In en, this message translates to:
  /// **'Pull failed: {error}'**
  String systemAiPullFailedError(String error);

  /// No description provided for @storeProvenanceTemporal.
  ///
  /// In en, this message translates to:
  /// **'temporal · {provider}'**
  String storeProvenanceTemporal(String provider);

  /// No description provided for @storeSourceTemporal.
  ///
  /// In en, this message translates to:
  /// **'Temporal'**
  String get storeSourceTemporal;

  /// No description provided for @navFlowEditor.
  ///
  /// In en, this message translates to:
  /// **'Editor'**
  String get navFlowEditor;

  /// No description provided for @flowEditorBackTooltip.
  ///
  /// In en, this message translates to:
  /// **'Back'**
  String get flowEditorBackTooltip;

  /// No description provided for @flowEditorNew.
  ///
  /// In en, this message translates to:
  /// **'New flow'**
  String get flowEditorNew;

  /// No description provided for @flowEditorSave.
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get flowEditorSave;

  /// No description provided for @flowEditorRun.
  ///
  /// In en, this message translates to:
  /// **'Run'**
  String get flowEditorRun;

  /// No description provided for @flowEditorRefresh.
  ///
  /// In en, this message translates to:
  /// **'Refresh file list'**
  String get flowEditorRefresh;

  /// No description provided for @flowEditorRunOutput.
  ///
  /// In en, this message translates to:
  /// **'RUN OUTPUT'**
  String get flowEditorRunOutput;

  /// No description provided for @flowEditorEmptyTitle.
  ///
  /// In en, this message translates to:
  /// **'No flow open'**
  String get flowEditorEmptyTitle;

  /// No description provided for @flowEditorEmptyBody.
  ///
  /// In en, this message translates to:
  /// **'Pick one from the left, or click New flow to start a fresh one.'**
  String get flowEditorEmptyBody;

  /// No description provided for @flowEditorListEmptyTitle.
  ///
  /// In en, this message translates to:
  /// **'No saved flows'**
  String get flowEditorListEmptyTitle;

  /// No description provided for @flowEditorListEmptyBody.
  ///
  /// In en, this message translates to:
  /// **'Click New flow to scaffold one from a template.'**
  String get flowEditorListEmptyBody;

  /// No description provided for @flowEditorDiscardTitle.
  ///
  /// In en, this message translates to:
  /// **'Discard unsaved changes?'**
  String get flowEditorDiscardTitle;

  /// No description provided for @flowEditorDiscardBody.
  ///
  /// In en, this message translates to:
  /// **'Switching files will throw away the edits you haven\'t saved.'**
  String get flowEditorDiscardBody;

  /// No description provided for @flowEditorDiscardKeep.
  ///
  /// In en, this message translates to:
  /// **'Keep editing'**
  String get flowEditorDiscardKeep;

  /// No description provided for @flowEditorDiscardThrow.
  ///
  /// In en, this message translates to:
  /// **'Throw away'**
  String get flowEditorDiscardThrow;

  /// No description provided for @flowEditorNewDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'New flow'**
  String get flowEditorNewDialogTitle;

  /// No description provided for @flowEditorNewDialogLabel.
  ///
  /// In en, this message translates to:
  /// **'Flow name'**
  String get flowEditorNewDialogLabel;

  /// No description provided for @flowEditorNewDialogHelper.
  ///
  /// In en, this message translates to:
  /// **'lowercase letters, digits, hyphen, underscore'**
  String get flowEditorNewDialogHelper;

  /// No description provided for @flowEditorNewDialogCancel.
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get flowEditorNewDialogCancel;

  /// No description provided for @flowEditorNewDialogCreate.
  ///
  /// In en, this message translates to:
  /// **'Create'**
  String get flowEditorNewDialogCreate;

  /// No description provided for @flowEditorNewTemplateComment.
  ///
  /// In en, this message translates to:
  /// **'Generated by Studio\'s Flow editor. Edit, save, run.'**
  String flowEditorNewTemplateComment(String name);

  /// No description provided for @flowEditorAlreadyExists.
  ///
  /// In en, this message translates to:
  /// **'A flow named \"{name}\" already exists.'**
  String flowEditorAlreadyExists(String name);

  /// No description provided for @buttonView.
  ///
  /// In en, this message translates to:
  /// **'View'**
  String get buttonView;

  /// No description provided for @logViewerTitle.
  ///
  /// In en, this message translates to:
  /// **'{title} — last {count} lines'**
  String logViewerTitle(String title, int count);

  /// No description provided for @logViewerEmpty.
  ///
  /// In en, this message translates to:
  /// **'Log file is empty or does not exist yet.'**
  String get logViewerEmpty;

  /// No description provided for @logViewerCopyAll.
  ///
  /// In en, this message translates to:
  /// **'Copy all'**
  String get logViewerCopyAll;

  /// No description provided for @logViewerOpenExternal.
  ///
  /// In en, this message translates to:
  /// **'Open in default editor'**
  String get logViewerOpenExternal;

  /// No description provided for @logViewerLineCount.
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 line} other{{count} lines}}'**
  String logViewerLineCount(int count);

  /// No description provided for @doctorPathStudioErrors.
  ///
  /// In en, this message translates to:
  /// **'Studio errors'**
  String get doctorPathStudioErrors;

  /// No description provided for @settingsCategoryGeneral.
  ///
  /// In en, this message translates to:
  /// **'General'**
  String get settingsCategoryGeneral;

  /// No description provided for @settingsCategoryAppearance.
  ///
  /// In en, this message translates to:
  /// **'Appearance'**
  String get settingsCategoryAppearance;

  /// No description provided for @settingsCategoryAi.
  ///
  /// In en, this message translates to:
  /// **'System AI'**
  String get settingsCategoryAi;

  /// No description provided for @settingsCategoryIntegrations.
  ///
  /// In en, this message translates to:
  /// **'Integrations'**
  String get settingsCategoryIntegrations;

  /// No description provided for @settingsCategorySecurity.
  ///
  /// In en, this message translates to:
  /// **'Security'**
  String get settingsCategorySecurity;

  /// No description provided for @settingsCategoryMaintenance.
  ///
  /// In en, this message translates to:
  /// **'Maintenance'**
  String get settingsCategoryMaintenance;

  /// No description provided for @settingsAiPanelTitle.
  ///
  /// In en, this message translates to:
  /// **'System AI'**
  String get settingsAiPanelTitle;

  /// No description provided for @settingsAiPanelBody.
  ///
  /// In en, this message translates to:
  /// **'Operator-managed LLM endpoint used by Studio for the AI helpers (system-ai-edit, install-suggest, doctor-summary). No flow ever calls this; modules speak to their own LLM.'**
  String get settingsAiPanelBody;

  /// No description provided for @settingsIntegrationsPanelTitle.
  ///
  /// In en, this message translates to:
  /// **'Integrations'**
  String get settingsIntegrationsPanelTitle;

  /// No description provided for @settingsIntegrationsPanelBody.
  ///
  /// In en, this message translates to:
  /// **'External tool servers the hub federates capabilities from. MCP servers expose tool-shaped endpoints; n8n endpoints expose hosted workflows.'**
  String get settingsIntegrationsPanelBody;

  /// No description provided for @settingsSecurityPanelTitle.
  ///
  /// In en, this message translates to:
  /// **'Security & credentials'**
  String get settingsSecurityPanelTitle;

  /// No description provided for @settingsSecurityPanelBody.
  ///
  /// In en, this message translates to:
  /// **'Tokens the hub holds on the operator\'s behalf. Stored in ~/.chain/ with mode 0600; never sent in telemetry.'**
  String get settingsSecurityPanelBody;

  /// No description provided for @settingsMaintenancePanelTitle.
  ///
  /// In en, this message translates to:
  /// **'Maintenance'**
  String get settingsMaintenancePanelTitle;

  /// No description provided for @settingsMaintenancePanelBody.
  ///
  /// In en, this message translates to:
  /// **'Destructive operations gated behind explicit confirm dialogs. Use when re-pilot-testing or debugging.'**
  String get settingsMaintenancePanelBody;

  /// No description provided for @tooltipMoveUp.
  ///
  /// In en, this message translates to:
  /// **'Move up'**
  String get tooltipMoveUp;

  /// No description provided for @tooltipMoveDown.
  ///
  /// In en, this message translates to:
  /// **'Move down'**
  String get tooltipMoveDown;

  /// No description provided for @tooltipRemove.
  ///
  /// In en, this message translates to:
  /// **'Remove'**
  String get tooltipRemove;

  /// No description provided for @daemonActionEnableAutostart.
  ///
  /// In en, this message translates to:
  /// **'enable autostart'**
  String get daemonActionEnableAutostart;

  /// No description provided for @daemonActionDisableAutostart.
  ///
  /// In en, this message translates to:
  /// **'disable autostart'**
  String get daemonActionDisableAutostart;

  /// No description provided for @daemonActionRestart.
  ///
  /// In en, this message translates to:
  /// **'daemon restart'**
  String get daemonActionRestart;

  /// No description provided for @daemonActionStart.
  ///
  /// In en, this message translates to:
  /// **'daemon start'**
  String get daemonActionStart;

  /// No description provided for @daemonActionStop.
  ///
  /// In en, this message translates to:
  /// **'daemon stop'**
  String get daemonActionStop;

  /// No description provided for @daemonActionStatus.
  ///
  /// In en, this message translates to:
  /// **'daemon status'**
  String get daemonActionStatus;

  /// No description provided for @daemonActionResultOk.
  ///
  /// In en, this message translates to:
  /// **'OK · {label}'**
  String daemonActionResultOk(String label);

  /// No description provided for @daemonActionResultFailed.
  ///
  /// In en, this message translates to:
  /// **'Failed · {label}'**
  String daemonActionResultFailed(String label);

  /// No description provided for @addSourceTitle.
  ///
  /// In en, this message translates to:
  /// **'Add module source'**
  String get addSourceTitle;

  /// No description provided for @addSourceIntro.
  ///
  /// In en, this message translates to:
  /// **'`{capability}` is not in the public store. Point the hub at a `.fai` bundle URL or a local bundle path; the hub downloads, verifies (sha256 + signature) and installs it.'**
  String addSourceIntro(String capability);

  /// No description provided for @addSourceField.
  ///
  /// In en, this message translates to:
  /// **'URL or path to .fai bundle'**
  String get addSourceField;

  /// No description provided for @addSourceHint.
  ///
  /// In en, this message translates to:
  /// **'https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.fai'**
  String get addSourceHint;

  /// No description provided for @addSourceHowItWorksTitle.
  ///
  /// In en, this message translates to:
  /// **'How private modules work'**
  String get addSourceHowItWorksTitle;

  /// No description provided for @addSourceHowItWorksBody.
  ///
  /// In en, this message translates to:
  /// **'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`chain pack <dir>`) and host the resulting `.fai` bundle anywhere (your own Forgejo / GitHub / S3). The hub installs by URL and verifies the signature against its trust store.\n\nDeveloping locally? Use the CLI — Studio cannot install from an unpacked directory (yet):'**
  String get addSourceHowItWorksBody;

  /// No description provided for @addSourceCliExample.
  ///
  /// In en, this message translates to:
  /// **'chain install --link /path/to/module'**
  String get addSourceCliExample;

  /// No description provided for @addSourceInstallButton.
  ///
  /// In en, this message translates to:
  /// **'Install'**
  String get addSourceInstallButton;

  /// No description provided for @addSourceCancel.
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get addSourceCancel;

  /// No description provided for @installFailed.
  ///
  /// In en, this message translates to:
  /// **'Install failed: {error}'**
  String installFailed(String error);

  /// No description provided for @welcomeHubDownTitle.
  ///
  /// In en, this message translates to:
  /// **'The hub isn\'t running yet'**
  String get welcomeHubDownTitle;

  /// No description provided for @welcomeHubDownBody.
  ///
  /// In en, this message translates to:
  /// **'Studio talks to a local hub — the engine that loads modules and runs flows. It isn\'t reachable right now. Start it to begin.'**
  String get welcomeHubDownBody;

  /// No description provided for @welcomeHubDownStart.
  ///
  /// In en, this message translates to:
  /// **'Start hub'**
  String get welcomeHubDownStart;

  /// No description provided for @welcomeHubDownStarting.
  ///
  /// In en, this message translates to:
  /// **'Starting…'**
  String get welcomeHubDownStarting;

  /// No description provided for @welcomeHubDownDocsLink.
  ///
  /// In en, this message translates to:
  /// **'Can\'t start it? Read the getting-started guide'**
  String get welcomeHubDownDocsLink;

  /// No description provided for @welcomeHubDownEndpoint.
  ///
  /// In en, this message translates to:
  /// **'Endpoint: {endpoint}'**
  String welcomeHubDownEndpoint(String endpoint);

  /// No description provided for @daemonStartRequested.
  ///
  /// In en, this message translates to:
  /// **'Daemon start requested. Reconnecting…'**
  String get daemonStartRequested;

  /// No description provided for @daemonStartFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not start daemon: {detail}'**
  String daemonStartFailed(String detail);

  /// No description provided for @chainBinaryNotFound.
  ///
  /// In en, this message translates to:
  /// **'Could not find the `chain` program on this machine.'**
  String get chainBinaryNotFound;

  /// No description provided for @chainBinaryNotFoundHint.
  ///
  /// In en, this message translates to:
  /// **'Install the Ch∆In platform, or point Studio at an existing `chain` binary.'**
  String get chainBinaryNotFoundHint;

  /// No description provided for @chainBinaryLocateButton.
  ///
  /// In en, this message translates to:
  /// **'Locate `chain` binary…'**
  String get chainBinaryLocateButton;

  /// No description provided for @chainBinaryInstallDocsButton.
  ///
  /// In en, this message translates to:
  /// **'Open install guide'**
  String get chainBinaryInstallDocsButton;

  /// No description provided for @chainBinaryPickerTitle.
  ///
  /// In en, this message translates to:
  /// **'Select the `chain` binary'**
  String get chainBinaryPickerTitle;

  /// No description provided for @chainBinarySetOk.
  ///
  /// In en, this message translates to:
  /// **'Using `chain` binary at {path}'**
  String chainBinarySetOk(String path);

  /// No description provided for @sysAiFixParse.
  ///
  /// In en, this message translates to:
  /// **'The provider sent a response in an unexpected format. Providers that aren\'t OpenAI-compatible may need a translation proxy.'**
  String get sysAiFixParse;

  /// No description provided for @sysAiFixUnknown.
  ///
  /// In en, this message translates to:
  /// **'Unexpected failure ({kind}). See the System AI documentation.'**
  String sysAiFixUnknown(String kind);

  /// No description provided for @sysAiFixDisabled.
  ///
  /// In en, this message translates to:
  /// **'Configure System AI in Settings (Cmd+,) → System AI panel.'**
  String get sysAiFixDisabled;

  /// No description provided for @sysAiFixEnvMissing.
  ///
  /// In en, this message translates to:
  /// **'The API-key environment variable is empty. Set it in your shell, then restart the daemon.'**
  String get sysAiFixEnvMissing;

  /// No description provided for @sysAiFixNetwork.
  ///
  /// In en, this message translates to:
  /// **'The hub can\'t reach the configured endpoint. Is your provider running?'**
  String get sysAiFixNetwork;

  /// No description provided for @sysAiFixHttp.
  ///
  /// In en, this message translates to:
  /// **'The provider returned a non-2xx status. Verify the endpoint, model name, and API key.'**
  String get sysAiFixHttp;

  /// No description provided for @sysAiFixEmptyResponse.
  ///
  /// In en, this message translates to:
  /// **'The provider answered with no content. Try a different model or rephrase the prompt.'**
  String get sysAiFixEmptyResponse;

  /// No description provided for @channelSwitchOk.
  ///
  /// In en, this message translates to:
  /// **'Switched active channel to \"{name}\". Daemon restarted.'**
  String channelSwitchOk(String name);

  /// No description provided for @channelSwitchFailed.
  ///
  /// In en, this message translates to:
  /// **'Channel switch failed: {detail}'**
  String channelSwitchFailed(String detail);

  /// No description provided for @providerDescOllama.
  ///
  /// In en, this message translates to:
  /// **'Local `ollama serve`. Models stay on your machine. No API key needed.'**
  String get providerDescOllama;

  /// No description provided for @providerDescOpenai.
  ///
  /// In en, this message translates to:
  /// **'OpenAI hosted API. Requires an API key. Data leaves your machine.'**
  String get providerDescOpenai;

  /// No description provided for @providerDescLmstudio.
  ///
  /// In en, this message translates to:
  /// **'Local LM Studio server. Models stay on your machine. No API key needed.'**
  String get providerDescLmstudio;

  /// No description provided for @providerDescVllm.
  ///
  /// In en, this message translates to:
  /// **'Self-hosted vLLM or any other OpenAI-compatible server. Endpoint required.'**
  String get providerDescVllm;

  /// No description provided for @providerDescCustom.
  ///
  /// In en, this message translates to:
  /// **'Anything else that speaks the OpenAI-compatible chat-completions wire (LiteLLM proxy, internal mirror, …).'**
  String get providerDescCustom;

  /// No description provided for @welcomeDocLoadFailedBody.
  ///
  /// In en, this message translates to:
  /// **'Could not load the bundled doc \"{slug}\" ({locale}).\nTried: {attempted}\nUnderlying: {underlying}\nThis usually means the Studio build on disk predates the doc bundle. Rebuild Studio or open the online copy.'**
  String welcomeDocLoadFailedBody(
    String slug,
    String locale,
    String attempted,
    String underlying,
  );

  /// No description provided for @hubUnreachableBanner.
  ///
  /// In en, this message translates to:
  /// **'Can\'t reach {endpoint} — open Settings'**
  String hubUnreachableBanner(String endpoint);

  /// No description provided for @hubUnreachableOpenSettings.
  ///
  /// In en, this message translates to:
  /// **'Open Settings'**
  String get hubUnreachableOpenSettings;

  /// No description provided for @navFederation.
  ///
  /// In en, this message translates to:
  /// **'Federation'**
  String get navFederation;

  /// No description provided for @federationTitle.
  ///
  /// In en, this message translates to:
  /// **'Federation'**
  String get federationTitle;

  /// No description provided for @federationReloadTooltip.
  ///
  /// In en, this message translates to:
  /// **'Reload satellites'**
  String get federationReloadTooltip;

  /// No description provided for @federationAddSatellite.
  ///
  /// In en, this message translates to:
  /// **'Add satellite'**
  String get federationAddSatellite;

  /// No description provided for @federationEmptyTitle.
  ///
  /// In en, this message translates to:
  /// **'No satellites connected'**
  String get federationEmptyTitle;

  /// No description provided for @federationEmptyHint.
  ///
  /// In en, this message translates to:
  /// **'Connect another hub as a satellite to run capabilities on it. Issue an enrollment token to get started.'**
  String get federationEmptyHint;

  /// No description provided for @federationPillConnected.
  ///
  /// In en, this message translates to:
  /// **'connected'**
  String get federationPillConnected;

  /// No description provided for @federationRegionNone.
  ///
  /// In en, this message translates to:
  /// **'no region'**
  String get federationRegionNone;

  /// No description provided for @federationCapabilities.
  ///
  /// In en, this message translates to:
  /// **'{count} advertised capabilities'**
  String federationCapabilities(int count);

  /// No description provided for @federationAddDialogTitle.
  ///
  /// In en, this message translates to:
  /// **'Issue an enrollment token'**
  String get federationAddDialogTitle;

  /// No description provided for @federationNameLabel.
  ///
  /// In en, this message translates to:
  /// **'Satellite name'**
  String get federationNameLabel;

  /// No description provided for @federationIssueButton.
  ///
  /// In en, this message translates to:
  /// **'Issue'**
  String get federationIssueButton;

  /// No description provided for @federationIssueFailed.
  ///
  /// In en, this message translates to:
  /// **'Could not issue token: {error}'**
  String federationIssueFailed(String error);

  /// No description provided for @federationEnrollmentTitle.
  ///
  /// In en, this message translates to:
  /// **'Enroll {name}'**
  String federationEnrollmentTitle(String name);

  /// No description provided for @federationTokenLabel.
  ///
  /// In en, this message translates to:
  /// **'Bootstrap token (single use)'**
  String get federationTokenLabel;

  /// No description provided for @federationConfigLabel.
  ///
  /// In en, this message translates to:
  /// **'Satellite config (paste into the satellite)'**
  String get federationConfigLabel;

  /// No description provided for @federationCopied.
  ///
  /// In en, this message translates to:
  /// **'Copied to clipboard'**
  String get federationCopied;

  /// No description provided for @federationEnrollmentHint.
  ///
  /// In en, this message translates to:
  /// **'Hand the token to the satellite operator over a secure channel. The bundled CA makes the satellite\'s first connect tamper-proof.'**
  String get federationEnrollmentHint;
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  @override
  bool isSupported(Locale locale) =>
      <String>['de', 'en'].contains(locale.languageCode);

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {
  // Lookup logic when only language code is specified.
  switch (locale.languageCode) {
    case 'de':
      return AppLocalizationsDe();
    case 'en':
      return AppLocalizationsEn();
  }

  throw FlutterError(
    'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
    'an issue with the localizations generation tool. Please file an issue '
    'on GitHub with a reproducible sample app and the gen-l10n configuration '
    'that was used.',
  );
}
