feat: guided-setup wizard — localized explained options + plain-language plan
Some checks failed
Security / Security check (push) Failing after 1s

Reworks the Setup-Assistent toward the zero-learning-curve bar
(docs/architecture/guided-setup.md, phase 1.1):

- Every scenario/intent/target choice is now a localized option CARD
  with a one-line plain-language explanation of what it configures
  (DE+EN, Sie-form) — replacing the bare dropdowns whose labels were
  English enum humanizations ('Regulated Production', 'This Laptop').
- Three explained steps with a 'Schritt n von 3' progress line
  (stakes → task → environment); the two adaptive toggles move to the
  last step in plain language (no 'air-gapped' jargon).
- The review step renders a localized PLAIN-LANGUAGE summary built
  from 'chain init --answers --plan-json' (the structured SetupPlan) —
  'Ch∆In richtet einen regulierten Betrieb ein: signierte Module
  verlangt · … · geändert wird nur ~/.chain/config.yaml' — instead of
  echoing the CLI's English prose. Warns when an existing config will
  be overwritten. After apply: a plain 'Fertig' + next steps.

flutter analyze clean; widget tests for the step flow + German option
labels. Remaining per plan: clickable follow-up actions, signature
dead-end fix, placement/auto-open, and the LLM free-text path.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-07-12 22:19:56 +02:00
parent 0073d77a67
commit 140408d26a
7 changed files with 1133 additions and 146 deletions

View file

@ -1695,5 +1695,59 @@
"workspaceSealedSwitchFailed": "Wechsel in den abgeschotteten Bereich fehlgeschlagen: {error}",
"@workspaceSealedSwitchFailed": {"placeholders": {"error": {"type": "String"}}},
"sealedIdentityBar": "Abgeschotteter Bereich — isolierter Hub, eigene Daten und Audit-Kette",
"sealedLeave": "Verlassen"
"sealedLeave": "Verlassen",
"setupStepOf": "Schritt {n} von {total}",
"@setupStepOf": {"placeholders": {"n": {"type": "int"}, "total": {"type": "int"}}},
"setupStep1Title": "Worum geht es?",
"setupStep2Title": "Was möchten Sie zuerst tun?",
"setupStep3Title": "Wo läuft es?",
"setupReviewTitle": "Das wird Ch∆In einrichten",
"setupChooseFreeText": "Oder beschreiben Sie einfach, was Sie vorhaben",
"setupScenTryingOut": "Erst mal ausprobieren",
"setupScenTryingOutSub": "Ein unkomplizierter Arbeitsplatz auf diesem Rechner — ohne Signaturen, ohne Audit-Sperre.",
"setupScenTeamHub": "Ein Team-Server",
"setupScenTeamHubSub": "Ein abgesicherter Hub für mehrere Personen — signierte Module, Ressourcen-Grenzen.",
"setupScenRegulated": "Regulierter Produktivbetrieb",
"setupScenRegulatedSub": "Signierte Module, ein lückenloses, manipulationssicheres Prüfprotokoll und eine menschliche Freigabe vor jedem KI-Schritt.",
"setupScenBuildModules": "Module entwickeln",
"setupScenBuildModulesSub": "Eine Entwickler-Einrichtung zum Schreiben und Testen eigener Module.",
"setupIntentHello": "Das Hallo-Beispiel ausführen",
"setupIntentHelloSub": "Einfach einen Flow einmal von Anfang bis Ende sehen.",
"setupIntentExtract": "Text aus Dokumenten extrahieren",
"setupIntentExtractSub": "Reinen Text aus PDF- und DOCX-Dateien holen.",
"setupIntentExtractSummarize": "Extrahieren und zusammenfassen",
"setupIntentExtractSummarizeSub": "Text extrahieren und anschließend zusammenfassen.",
"setupIntentClassify": "Eingehende Dokumente einsortieren",
"setupIntentClassifySub": "Text extrahieren und mit einem KI-Schritt klassifizieren.",
"setupIntentBuildModule": "Ein eigenes Modul bauen",
"setupIntentBuildModuleSub": "Mit einem Modul-Gerüst starten.",
"setupTargetLaptop": "Dieser Rechner",
"setupTargetLaptopSub": "Läuft lokal auf dem Gerät, an dem Sie gerade sitzen.",
"setupTargetHomeServer": "Ein eigener Server",
"setupTargetHomeServerSub": "Ein Server im eigenen Haus — startet beim Hochfahren, läuft im Hintergrund.",
"setupTargetAirgapped": "Ein vollständig lokaler Server (ohne Internet)",
"setupTargetAirgappedSub": "Ein isolierter Server ohne Internet — die strengste, privateste Betriebsart.",
"setupTargetContainer": "Ein Container",
"setupTargetContainerSub": "Docker oder Podman, mit fertigem Compose-Schnipsel.",
"setupApprovalPlain": "Vor jedem KI-Schritt einen Menschen um Freigabe bitten",
"setupDataLocalPlain": "Daten dürfen das Haus nie verlassen (vollständig lokal)",
"setupPlanIntroDev": "Ch∆In richtet einen unkomplizierten Arbeitsplatz ein.",
"setupPlanIntroEnterprise": "Ch∆In richtet einen abgesicherten Betrieb für ein Team ein.",
"setupPlanIntroAirgapped": "Ch∆In richtet einen vollständig lokalen, regulierten Betrieb ein.",
"setupPlanSignatures": "Es werden nur signierte Module zugelassen.",
"setupPlanWorm": "Das Prüfprotokoll wird zusätzlich manipulationssicher (WORM) gesichert.",
"setupPlanApproval": "Vor jedem KI-Schritt fragt das System einen Menschen um Freigabe.",
"setupPlanModules": "Diese Module werden vorbereitet: {modules}.",
"@setupPlanModules": {"placeholders": {"modules": {"type": "String"}}},
"setupPlanFlow": "Ein Beispiel-Flow „{flow}“ wird angelegt.",
"@setupPlanFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupPlanFileChanged": "Geändert wird nur eine Datei: {path}.",
"@setupPlanFileChanged": {"placeholders": {"path": {"type": "String"}}},
"setupPlanOverwriteWarn": "Eine vorhandene Konfiguration wird überschrieben.",
"setupApplied": "Fertig — Ch∆In ist eingerichtet.",
"setupNextTitle": "Nächste Schritte",
"setupNextHubStart": "Hub starten",
"setupNextInstall": "Die Module installieren",
"setupNextRunFlow": "Den Beispiel-Flow ausführen",
"setupStartCta": "In 3 Fragen loslegen"
}

View file

@ -1734,5 +1734,59 @@
"workspaceSealedSwitchFailed": "Could not switch to the sealed area: {error}",
"@workspaceSealedSwitchFailed": {"placeholders": {"error": {"type": "String"}}},
"sealedIdentityBar": "Sealed area — isolated hub, own data and audit chain",
"sealedLeave": "Leave"
"sealedLeave": "Leave",
"setupStepOf": "Step {n} of {total}",
"@setupStepOf": {"placeholders": {"n": {"type": "int"}, "total": {"type": "int"}}},
"setupStep1Title": "What are the stakes?",
"setupStep2Title": "What do you want to do first?",
"setupStep3Title": "Where will it run?",
"setupReviewTitle": "This is what Ch∆In will set up",
"setupChooseFreeText": "Or just describe what you want to do",
"setupScenTryingOut": "Just trying it out",
"setupScenTryingOutSub": "A relaxed workspace on this machine — no signing, no audit locking.",
"setupScenTeamHub": "A shared team hub",
"setupScenTeamHubSub": "A secured hub for several people — signed modules, resource limits.",
"setupScenRegulated": "Regulated production",
"setupScenRegulatedSub": "Signed modules, a complete tamper-evident audit trail, and a human approval before every AI step.",
"setupScenBuildModules": "Building modules",
"setupScenBuildModulesSub": "A developer setup for writing and testing your own modules.",
"setupIntentHello": "Run the hello example",
"setupIntentHelloSub": "Just see one flow run end to end.",
"setupIntentExtract": "Extract text from documents",
"setupIntentExtractSub": "Pull plain text out of PDF and DOCX files.",
"setupIntentExtractSummarize": "Extract and summarize",
"setupIntentExtractSummarizeSub": "Extract text, then summarize it.",
"setupIntentClassify": "Sort incoming documents",
"setupIntentClassifySub": "Extract text, then classify it with an AI step.",
"setupIntentBuildModule": "Build my own module",
"setupIntentBuildModuleSub": "Start from a module scaffold.",
"setupTargetLaptop": "This computer",
"setupTargetLaptopSub": "Runs locally on the machine you are on now.",
"setupTargetHomeServer": "An on-premise server",
"setupTargetHomeServerSub": "A server in your own house — starts on boot, runs in the background.",
"setupTargetAirgapped": "A fully local server (no internet)",
"setupTargetAirgappedSub": "An isolated server with no internet — the strictest, most private posture.",
"setupTargetContainer": "A container",
"setupTargetContainerSub": "Docker or Podman, with a ready-made compose snippet.",
"setupApprovalPlain": "Ask a person for approval before every AI step",
"setupDataLocalPlain": "Data must never leave the building (fully local)",
"setupPlanIntroDev": "Ch∆In sets up a straightforward workspace.",
"setupPlanIntroEnterprise": "Ch∆In sets up a secured operation for a team.",
"setupPlanIntroAirgapped": "Ch∆In sets up a fully local, regulated operation.",
"setupPlanSignatures": "Only signed modules are allowed.",
"setupPlanWorm": "The audit log is additionally sealed tamper-proof (WORM).",
"setupPlanApproval": "Before every AI step, the system asks a person for approval.",
"setupPlanModules": "These modules are prepared: {modules}.",
"@setupPlanModules": {"placeholders": {"modules": {"type": "String"}}},
"setupPlanFlow": "An example flow “{flow}” is created.",
"@setupPlanFlow": {"placeholders": {"flow": {"type": "String"}}},
"setupPlanFileChanged": "Only one file is changed: {path}.",
"@setupPlanFileChanged": {"placeholders": {"path": {"type": "String"}}},
"setupPlanOverwriteWarn": "An existing configuration will be overwritten.",
"setupApplied": "Done — Ch∆In is set up.",
"setupNextTitle": "Next steps",
"setupNextHubStart": "Start the hub",
"setupNextInstall": "Install the modules",
"setupNextRunFlow": "Run the example flow",
"setupStartCta": "Get started in 3 questions"
}

View file

@ -5046,6 +5046,306 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Leave'**
String get sealedLeave;
/// No description provided for @setupStepOf.
///
/// In en, this message translates to:
/// **'Step {n} of {total}'**
String setupStepOf(int n, int total);
/// No description provided for @setupStep1Title.
///
/// In en, this message translates to:
/// **'What are the stakes?'**
String get setupStep1Title;
/// No description provided for @setupStep2Title.
///
/// In en, this message translates to:
/// **'What do you want to do first?'**
String get setupStep2Title;
/// No description provided for @setupStep3Title.
///
/// In en, this message translates to:
/// **'Where will it run?'**
String get setupStep3Title;
/// No description provided for @setupReviewTitle.
///
/// In en, this message translates to:
/// **'This is what Ch∆In will set up'**
String get setupReviewTitle;
/// No description provided for @setupChooseFreeText.
///
/// In en, this message translates to:
/// **'Or just describe what you want to do'**
String get setupChooseFreeText;
/// No description provided for @setupScenTryingOut.
///
/// In en, this message translates to:
/// **'Just trying it out'**
String get setupScenTryingOut;
/// No description provided for @setupScenTryingOutSub.
///
/// In en, this message translates to:
/// **'A relaxed workspace on this machine — no signing, no audit locking.'**
String get setupScenTryingOutSub;
/// No description provided for @setupScenTeamHub.
///
/// In en, this message translates to:
/// **'A shared team hub'**
String get setupScenTeamHub;
/// No description provided for @setupScenTeamHubSub.
///
/// In en, this message translates to:
/// **'A secured hub for several people — signed modules, resource limits.'**
String get setupScenTeamHubSub;
/// No description provided for @setupScenRegulated.
///
/// In en, this message translates to:
/// **'Regulated production'**
String get setupScenRegulated;
/// No description provided for @setupScenRegulatedSub.
///
/// In en, this message translates to:
/// **'Signed modules, a complete tamper-evident audit trail, and a human approval before every AI step.'**
String get setupScenRegulatedSub;
/// No description provided for @setupScenBuildModules.
///
/// In en, this message translates to:
/// **'Building modules'**
String get setupScenBuildModules;
/// No description provided for @setupScenBuildModulesSub.
///
/// In en, this message translates to:
/// **'A developer setup for writing and testing your own modules.'**
String get setupScenBuildModulesSub;
/// No description provided for @setupIntentHello.
///
/// In en, this message translates to:
/// **'Run the hello example'**
String get setupIntentHello;
/// No description provided for @setupIntentHelloSub.
///
/// In en, this message translates to:
/// **'Just see one flow run end to end.'**
String get setupIntentHelloSub;
/// No description provided for @setupIntentExtract.
///
/// In en, this message translates to:
/// **'Extract text from documents'**
String get setupIntentExtract;
/// No description provided for @setupIntentExtractSub.
///
/// In en, this message translates to:
/// **'Pull plain text out of PDF and DOCX files.'**
String get setupIntentExtractSub;
/// No description provided for @setupIntentExtractSummarize.
///
/// In en, this message translates to:
/// **'Extract and summarize'**
String get setupIntentExtractSummarize;
/// No description provided for @setupIntentExtractSummarizeSub.
///
/// In en, this message translates to:
/// **'Extract text, then summarize it.'**
String get setupIntentExtractSummarizeSub;
/// No description provided for @setupIntentClassify.
///
/// In en, this message translates to:
/// **'Sort incoming documents'**
String get setupIntentClassify;
/// No description provided for @setupIntentClassifySub.
///
/// In en, this message translates to:
/// **'Extract text, then classify it with an AI step.'**
String get setupIntentClassifySub;
/// No description provided for @setupIntentBuildModule.
///
/// In en, this message translates to:
/// **'Build my own module'**
String get setupIntentBuildModule;
/// No description provided for @setupIntentBuildModuleSub.
///
/// In en, this message translates to:
/// **'Start from a module scaffold.'**
String get setupIntentBuildModuleSub;
/// No description provided for @setupTargetLaptop.
///
/// In en, this message translates to:
/// **'This computer'**
String get setupTargetLaptop;
/// No description provided for @setupTargetLaptopSub.
///
/// In en, this message translates to:
/// **'Runs locally on the machine you are on now.'**
String get setupTargetLaptopSub;
/// No description provided for @setupTargetHomeServer.
///
/// In en, this message translates to:
/// **'An on-premise server'**
String get setupTargetHomeServer;
/// No description provided for @setupTargetHomeServerSub.
///
/// In en, this message translates to:
/// **'A server in your own house — starts on boot, runs in the background.'**
String get setupTargetHomeServerSub;
/// No description provided for @setupTargetAirgapped.
///
/// In en, this message translates to:
/// **'A fully local server (no internet)'**
String get setupTargetAirgapped;
/// No description provided for @setupTargetAirgappedSub.
///
/// In en, this message translates to:
/// **'An isolated server with no internet — the strictest, most private posture.'**
String get setupTargetAirgappedSub;
/// No description provided for @setupTargetContainer.
///
/// In en, this message translates to:
/// **'A container'**
String get setupTargetContainer;
/// No description provided for @setupTargetContainerSub.
///
/// In en, this message translates to:
/// **'Docker or Podman, with a ready-made compose snippet.'**
String get setupTargetContainerSub;
/// No description provided for @setupApprovalPlain.
///
/// In en, this message translates to:
/// **'Ask a person for approval before every AI step'**
String get setupApprovalPlain;
/// No description provided for @setupDataLocalPlain.
///
/// In en, this message translates to:
/// **'Data must never leave the building (fully local)'**
String get setupDataLocalPlain;
/// No description provided for @setupPlanIntroDev.
///
/// In en, this message translates to:
/// **'Ch∆In sets up a straightforward workspace.'**
String get setupPlanIntroDev;
/// No description provided for @setupPlanIntroEnterprise.
///
/// In en, this message translates to:
/// **'Ch∆In sets up a secured operation for a team.'**
String get setupPlanIntroEnterprise;
/// No description provided for @setupPlanIntroAirgapped.
///
/// In en, this message translates to:
/// **'Ch∆In sets up a fully local, regulated operation.'**
String get setupPlanIntroAirgapped;
/// No description provided for @setupPlanSignatures.
///
/// In en, this message translates to:
/// **'Only signed modules are allowed.'**
String get setupPlanSignatures;
/// No description provided for @setupPlanWorm.
///
/// In en, this message translates to:
/// **'The audit log is additionally sealed tamper-proof (WORM).'**
String get setupPlanWorm;
/// No description provided for @setupPlanApproval.
///
/// In en, this message translates to:
/// **'Before every AI step, the system asks a person for approval.'**
String get setupPlanApproval;
/// No description provided for @setupPlanModules.
///
/// In en, this message translates to:
/// **'These modules are prepared: {modules}.'**
String setupPlanModules(String modules);
/// No description provided for @setupPlanFlow.
///
/// In en, this message translates to:
/// **'An example flow “{flow}” is created.'**
String setupPlanFlow(String flow);
/// No description provided for @setupPlanFileChanged.
///
/// In en, this message translates to:
/// **'Only one file is changed: {path}.'**
String setupPlanFileChanged(String path);
/// No description provided for @setupPlanOverwriteWarn.
///
/// In en, this message translates to:
/// **'An existing configuration will be overwritten.'**
String get setupPlanOverwriteWarn;
/// No description provided for @setupApplied.
///
/// In en, this message translates to:
/// **'Done — Ch∆In is set up.'**
String get setupApplied;
/// No description provided for @setupNextTitle.
///
/// In en, this message translates to:
/// **'Next steps'**
String get setupNextTitle;
/// No description provided for @setupNextHubStart.
///
/// In en, this message translates to:
/// **'Start the hub'**
String get setupNextHubStart;
/// No description provided for @setupNextInstall.
///
/// In en, this message translates to:
/// **'Install the modules'**
String get setupNextInstall;
/// No description provided for @setupNextRunFlow.
///
/// In en, this message translates to:
/// **'Run the example flow'**
String get setupNextRunFlow;
/// No description provided for @setupStartCta.
///
/// In en, this message translates to:
/// **'Get started in 3 questions'**
String get setupStartCta;
}
class _AppLocalizationsDelegate

View file

@ -2964,4 +2964,185 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get sealedLeave => 'Verlassen';
@override
String setupStepOf(int n, int total) {
return 'Schritt $n von $total';
}
@override
String get setupStep1Title => 'Worum geht es?';
@override
String get setupStep2Title => 'Was möchten Sie zuerst tun?';
@override
String get setupStep3Title => 'Wo läuft es?';
@override
String get setupReviewTitle => 'Das wird Ch∆In einrichten';
@override
String get setupChooseFreeText =>
'Oder beschreiben Sie einfach, was Sie vorhaben';
@override
String get setupScenTryingOut => 'Erst mal ausprobieren';
@override
String get setupScenTryingOutSub =>
'Ein unkomplizierter Arbeitsplatz auf diesem Rechner — ohne Signaturen, ohne Audit-Sperre.';
@override
String get setupScenTeamHub => 'Ein Team-Server';
@override
String get setupScenTeamHubSub =>
'Ein abgesicherter Hub für mehrere Personen — signierte Module, Ressourcen-Grenzen.';
@override
String get setupScenRegulated => 'Regulierter Produktivbetrieb';
@override
String get setupScenRegulatedSub =>
'Signierte Module, ein lückenloses, manipulationssicheres Prüfprotokoll und eine menschliche Freigabe vor jedem KI-Schritt.';
@override
String get setupScenBuildModules => 'Module entwickeln';
@override
String get setupScenBuildModulesSub =>
'Eine Entwickler-Einrichtung zum Schreiben und Testen eigener Module.';
@override
String get setupIntentHello => 'Das Hallo-Beispiel ausführen';
@override
String get setupIntentHelloSub =>
'Einfach einen Flow einmal von Anfang bis Ende sehen.';
@override
String get setupIntentExtract => 'Text aus Dokumenten extrahieren';
@override
String get setupIntentExtractSub =>
'Reinen Text aus PDF- und DOCX-Dateien holen.';
@override
String get setupIntentExtractSummarize => 'Extrahieren und zusammenfassen';
@override
String get setupIntentExtractSummarizeSub =>
'Text extrahieren und anschließend zusammenfassen.';
@override
String get setupIntentClassify => 'Eingehende Dokumente einsortieren';
@override
String get setupIntentClassifySub =>
'Text extrahieren und mit einem KI-Schritt klassifizieren.';
@override
String get setupIntentBuildModule => 'Ein eigenes Modul bauen';
@override
String get setupIntentBuildModuleSub => 'Mit einem Modul-Gerüst starten.';
@override
String get setupTargetLaptop => 'Dieser Rechner';
@override
String get setupTargetLaptopSub =>
'Läuft lokal auf dem Gerät, an dem Sie gerade sitzen.';
@override
String get setupTargetHomeServer => 'Ein eigener Server';
@override
String get setupTargetHomeServerSub =>
'Ein Server im eigenen Haus — startet beim Hochfahren, läuft im Hintergrund.';
@override
String get setupTargetAirgapped =>
'Ein vollständig lokaler Server (ohne Internet)';
@override
String get setupTargetAirgappedSub =>
'Ein isolierter Server ohne Internet — die strengste, privateste Betriebsart.';
@override
String get setupTargetContainer => 'Ein Container';
@override
String get setupTargetContainerSub =>
'Docker oder Podman, mit fertigem Compose-Schnipsel.';
@override
String get setupApprovalPlain =>
'Vor jedem KI-Schritt einen Menschen um Freigabe bitten';
@override
String get setupDataLocalPlain =>
'Daten dürfen das Haus nie verlassen (vollständig lokal)';
@override
String get setupPlanIntroDev =>
'Ch∆In richtet einen unkomplizierten Arbeitsplatz ein.';
@override
String get setupPlanIntroEnterprise =>
'Ch∆In richtet einen abgesicherten Betrieb für ein Team ein.';
@override
String get setupPlanIntroAirgapped =>
'Ch∆In richtet einen vollständig lokalen, regulierten Betrieb ein.';
@override
String get setupPlanSignatures =>
'Es werden nur signierte Module zugelassen.';
@override
String get setupPlanWorm =>
'Das Prüfprotokoll wird zusätzlich manipulationssicher (WORM) gesichert.';
@override
String get setupPlanApproval =>
'Vor jedem KI-Schritt fragt das System einen Menschen um Freigabe.';
@override
String setupPlanModules(String modules) {
return 'Diese Module werden vorbereitet: $modules.';
}
@override
String setupPlanFlow(String flow) {
return 'Ein Beispiel-Flow „$flow“ wird angelegt.';
}
@override
String setupPlanFileChanged(String path) {
return 'Geändert wird nur eine Datei: $path.';
}
@override
String get setupPlanOverwriteWarn =>
'Eine vorhandene Konfiguration wird überschrieben.';
@override
String get setupApplied => 'Fertig — Ch∆In ist eingerichtet.';
@override
String get setupNextTitle => 'Nächste Schritte';
@override
String get setupNextHubStart => 'Hub starten';
@override
String get setupNextInstall => 'Die Module installieren';
@override
String get setupNextRunFlow => 'Den Beispiel-Flow ausführen';
@override
String get setupStartCta => 'In 3 Fragen loslegen';
}

View file

@ -2967,4 +2967,180 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get sealedLeave => 'Leave';
@override
String setupStepOf(int n, int total) {
return 'Step $n of $total';
}
@override
String get setupStep1Title => 'What are the stakes?';
@override
String get setupStep2Title => 'What do you want to do first?';
@override
String get setupStep3Title => 'Where will it run?';
@override
String get setupReviewTitle => 'This is what Ch∆In will set up';
@override
String get setupChooseFreeText => 'Or just describe what you want to do';
@override
String get setupScenTryingOut => 'Just trying it out';
@override
String get setupScenTryingOutSub =>
'A relaxed workspace on this machine — no signing, no audit locking.';
@override
String get setupScenTeamHub => 'A shared team hub';
@override
String get setupScenTeamHubSub =>
'A secured hub for several people — signed modules, resource limits.';
@override
String get setupScenRegulated => 'Regulated production';
@override
String get setupScenRegulatedSub =>
'Signed modules, a complete tamper-evident audit trail, and a human approval before every AI step.';
@override
String get setupScenBuildModules => 'Building modules';
@override
String get setupScenBuildModulesSub =>
'A developer setup for writing and testing your own modules.';
@override
String get setupIntentHello => 'Run the hello example';
@override
String get setupIntentHelloSub => 'Just see one flow run end to end.';
@override
String get setupIntentExtract => 'Extract text from documents';
@override
String get setupIntentExtractSub =>
'Pull plain text out of PDF and DOCX files.';
@override
String get setupIntentExtractSummarize => 'Extract and summarize';
@override
String get setupIntentExtractSummarizeSub =>
'Extract text, then summarize it.';
@override
String get setupIntentClassify => 'Sort incoming documents';
@override
String get setupIntentClassifySub =>
'Extract text, then classify it with an AI step.';
@override
String get setupIntentBuildModule => 'Build my own module';
@override
String get setupIntentBuildModuleSub => 'Start from a module scaffold.';
@override
String get setupTargetLaptop => 'This computer';
@override
String get setupTargetLaptopSub =>
'Runs locally on the machine you are on now.';
@override
String get setupTargetHomeServer => 'An on-premise server';
@override
String get setupTargetHomeServerSub =>
'A server in your own house — starts on boot, runs in the background.';
@override
String get setupTargetAirgapped => 'A fully local server (no internet)';
@override
String get setupTargetAirgappedSub =>
'An isolated server with no internet — the strictest, most private posture.';
@override
String get setupTargetContainer => 'A container';
@override
String get setupTargetContainerSub =>
'Docker or Podman, with a ready-made compose snippet.';
@override
String get setupApprovalPlain =>
'Ask a person for approval before every AI step';
@override
String get setupDataLocalPlain =>
'Data must never leave the building (fully local)';
@override
String get setupPlanIntroDev => 'Ch∆In sets up a straightforward workspace.';
@override
String get setupPlanIntroEnterprise =>
'Ch∆In sets up a secured operation for a team.';
@override
String get setupPlanIntroAirgapped =>
'Ch∆In sets up a fully local, regulated operation.';
@override
String get setupPlanSignatures => 'Only signed modules are allowed.';
@override
String get setupPlanWorm =>
'The audit log is additionally sealed tamper-proof (WORM).';
@override
String get setupPlanApproval =>
'Before every AI step, the system asks a person for approval.';
@override
String setupPlanModules(String modules) {
return 'These modules are prepared: $modules.';
}
@override
String setupPlanFlow(String flow) {
return 'An example flow “$flow” is created.';
}
@override
String setupPlanFileChanged(String path) {
return 'Only one file is changed: $path.';
}
@override
String get setupPlanOverwriteWarn =>
'An existing configuration will be overwritten.';
@override
String get setupApplied => 'Done — Ch∆In is set up.';
@override
String get setupNextTitle => 'Next steps';
@override
String get setupNextHubStart => 'Start the hub';
@override
String get setupNextInstall => 'Install the modules';
@override
String get setupNextRunFlow => 'Run the example flow';
@override
String get setupStartCta => 'Get started in 3 questions';
}