refactor(brand): rename F∆I -> Ch∆In + hub binary fai -> chain
Some checks failed
Security / Security check (push) Failing after 2s

Studio follows the platform rename: product branding F∆I -> Ch∆In in UI
strings, command examples fai -> chain, and — critically — the spawned
hub binary path ~/.fai/bin/fai -> ~/.fai/bin/chain so Studio launches
the renamed binary. The fai_* Dart identifiers (FaiLog, widget files,
the generated SDK) stay = vendor/internal namespace. flutter analyze:
no issues.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-15 16:22:22 +02:00
parent a0007b9178
commit 7ff4fda2a3
36 changed files with 141 additions and 141 deletions

View file

@ -24,7 +24,7 @@ import 'fai_log.dart';
///
/// [source] is a short tag (`flows.run`, `audit.clear`, )
/// used to group entries in the on-disk log so an operator or
/// `fai doctor` can scan recent failures by area without
/// `chain doctor` can scan recent failures by area without
/// reading the full free-text. Keep it stable; treat it like
/// a metric label, not free-form text.
///

View file

@ -1,12 +1,12 @@
// Central error log for Studio. Every error surfaced to the
// operator (SnackBar, error sheet, recoverable dialog) is also
// appended here so `fai doctor` and "Open log" can show what
// appended here so `chain doctor` and "Open log" can show what
// went wrong without the operator having to reproduce the
// failure.
//
// Path: `~/.fai/logs/studio-errors.log` (cross-platform via
// HOME / USERPROFILE). One line per event, JSON-shaped so
// `fai doctor` can parse it; humans can still read it because
// `chain doctor` can parse it; humans can still read it because
// the JSON is single-line and short.
//
// Best-effort by design: a failed write to the log file must
@ -76,7 +76,7 @@ class FaiLog {
return _append(entry);
}
/// Read the last [maxLines] lines back. Used by `fai doctor`
/// Read the last [maxLines] lines back. Used by `chain doctor`
/// + Settings "Recent errors" view. Returns oldest first so
/// the caller can render in chronological order.
Future<List<String>> tail({int maxLines = 50}) async {

View file

@ -11,7 +11,7 @@
// call for processes.
//
// The `fai` binary is resolved from PATH first; falls back to
// `~/.fai/bin/fai` (Unix) or `%USERPROFILE%\.fai\bin\fai.exe`
// `~/.fai/bin/chain` (Unix) or `%USERPROFILE%\.fai\bin\chain.exe`
// (Windows). The PowerShell installer puts both in PATH but
// some operators don't restart their shell after install — the
// fallback covers that case.
@ -26,7 +26,7 @@ import 'package:shared_preferences/shared_preferences.dart';
/// and render a localized, actionable message instead.
const String kFaiBinaryNotFound = 'fai-binary-not-found';
/// Getting-started / install guide for the FI platform. Opened
/// Getting-started / install guide for the ChIn platform. Opened
/// in the OS browser as the fallback affordance when no `fai`
/// binary can be located on the machine.
const String kFaiInstallDocsUrl =
@ -135,7 +135,7 @@ class SystemActions {
return revealInOs(path);
}
/// Run a `fai daemon ...` subcommand and surface the captured
/// Run a `chain daemon ...` subcommand and surface the captured
/// output. Used by Doctor's "Restart daemon" button.
static Future<({bool ok, String stdout, String stderr})> faiDaemon(
List<String> args,
@ -143,7 +143,7 @@ class SystemActions {
return _runFai(['daemon', ...args]);
}
/// Run `fai update apply --channel <c>`. Long-running on a slow
/// Run `chain update apply --channel <c>`. Long-running on a slow
/// network caller should show a spinner.
static Future<({bool ok, String stdout, String stderr})> faiUpdateApply(
String channel,
@ -177,7 +177,7 @@ class SystemActions {
return _runFai(['daemon', 'disable', '--channel', channel]);
}
/// Run `fai reset --yes`. Wipes operator state with the same
/// Run `chain reset --yes`. Wipes operator state with the same
/// safety net as the CLI: stops every daemon (including off-
/// channel orphans), atomically backs `~/.fai/` up, recreates
/// it with `bin/`, `channels/`, `config.yaml`, `current-channel`,
@ -249,7 +249,7 @@ class SystemActions {
if (home == null || home.isEmpty) return null;
final fallback = isWindows
? '$home\\.fai\\bin\\fai.exe'
: '$home/.fai/bin/fai';
: '$home/.fai/bin/chain';
return File(fallback).existsSync() ? fallback : null;
}

View file

@ -1,8 +1,8 @@
{
"@@locale": "de",
"appTitle": "F∆I Studio",
"appTitle": "Ch∆In Studio",
"navWelcome": "Willkommen",
"welcomeHeroTitle": "F∆I Platform",
"welcomeHeroTitle": "Ch∆In Platform",
"welcomeHeroSubtitle": "Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.",
"welcomePillarHubTitle": "Hub",
"welcomePillarHubBody": "Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den State. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.",
@ -60,7 +60,7 @@
"welcomeChecklistMcp": "Öffentliche Capability-Quelle hinzufügen",
"welcomeChecklistMcpHint": "Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.",
"welcomeChecklistModule": "Ein Text-Modul installieren",
"welcomeChecklistModuleHint": "Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed F∆I-Komponenten.",
"welcomeChecklistModuleHint": "Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed Ch∆In-Komponenten.",
"welcomeChecklistFlow": "Einen gespeicherten Flow starten",
"welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; auch ein eigener tut's.",
"welcomeChecklistAllDone": "Alle vier Schritte erledigt.",
@ -320,7 +320,7 @@
},
"storeReloadTooltip": "Aktualisieren",
"storeTodayBadge": "HEUTE",
"storeTodayDeck": "Von der F∆I-Redaktion",
"storeTodayDeck": "Von der Ch∆In-Redaktion",
"storeTodayDismissTooltip": "Für diese Sitzung ausblenden",
"storePillInstalled": "installiert",
"storePillUpdate": "Update",
@ -607,7 +607,7 @@
"auditClearLogButton": "Log löschen",
"modulesTitle": "Module",
"modulesNoneTitle": "Noch keine Module",
"modulesNoneHint": "`fai install <capability-name>` ausführen oder ~/.fai/modules/ prüfen.",
"modulesNoneHint": "`chain install <capability-name>` ausführen oder ~/.fai/modules/ prüfen.",
"modulesReloadTooltip": "Aktualisieren",
"modulesRecentActivity": "LETZTE AKTIVITÄT",
"modulesRecentActivityHint": "letzte {n} install/uninstall-Ereignisse aus dem Audit-Log",
@ -667,7 +667,7 @@
"flowsTitle": "Flows",
"flowsReloadTooltip": "Aktualisieren",
"flowsNoneTitle": "Keine gespeicherten Flows",
"flowsNoneHint": "Flow speichern mit `fai admin flows save <name> <flow.yaml>`, dann taucht er hier auf.",
"flowsNoneHint": "Flow speichern mit `chain admin flows save <name> <flow.yaml>`, dann taucht er hier auf.",
"flowsRunDialogTitle": "{name} ausführen",
"@flowsRunDialogTitle": {
"placeholders": {
@ -849,7 +849,7 @@
"welcomeChecklistNextTodayBody": "tools/today/propose.sh per Cron laufen lassen und die Editorial-Karte im Store füllt sich mit operator-kuratierten Stories.",
"welcomeChecklistNextTodayButton": "Today-Doku öffnen",
"welcomeChecklistNextModuleTitle": "Eigenes Modul bauen",
"welcomeChecklistNextModuleBody": "Mit `fai new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.",
"welcomeChecklistNextModuleBody": "Mit `chain new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.",
"welcomeChecklistNextModuleButton": "Doku lesen",
"auditGroupToday": "HEUTE",
"auditGroupYesterday": "GESTERN",
@ -954,7 +954,7 @@
"errInternal": "Unerwarteter interner Fehler.",
"errInternalHint": "Hub-Logs unter `~/.fai/logs/` prüfen. Wenn das öfter passiert, bitte melden.",
"errUnavailable": "Hub nicht erreichbar.",
"errUnavailableHint": "Sicherstellen, dass `fai serve` (oder `fai daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.",
"errUnavailableHint": "Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.",
"errUnauthenticated": "Authentifizierung erforderlich.",
"errUnauthenticatedHint": "`FAI_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.",
"errCopyDetail": "Detail kopieren",
@ -1173,7 +1173,7 @@
"doctorStatusUnknown": "Daemon-Status: …",
"doctorPillRunning": "läuft",
"doctorPillStopped": "gestoppt",
"doctorDaemonControlHint": "Studio ruft das Platform-Binary auf — entspricht `fai daemon …`, sodass CLI und UI im Gleichschritt bleiben.",
"doctorDaemonControlHint": "Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.",
"doctorDaemonControlWorking": "Wird ausgeführt…",
"doctorPathLog": "Log",
"doctorPathConfig": "Konfig",
@ -1181,7 +1181,7 @@
"doctorPathModules": "Module-Verzeichnis",
"doctorPathFlows": "Flow-Verzeichnis",
"doctorPathPid": "PID-Datei",
"doctorPathsEmpty": "Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `fai daemon restart`.",
"doctorPathsEmpty": "Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.",
"doctorOpenError": "Konnte nicht öffnen: {detail}",
"@doctorOpenError": {
"placeholders": {
@ -1198,7 +1198,7 @@
}
}
},
"doctorUpdateBody": "Kanal {channel} bietet jetzt {version}. Per Button anwenden — Studio ruft `fai update apply --channel {channel}` auf.",
"doctorUpdateBody": "Kanal {channel} bietet jetzt {version}. Per Button anwenden — Studio ruft `chain update apply --channel {channel}` auf.",
"@doctorUpdateBody": {
"placeholders": {
"channel": {
@ -1238,7 +1238,7 @@
"n8nHint": "Aktive n8n-Workflows erscheinen als `n8n.<endpoint>.<slug>` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.",
"n8nEmpty": "Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.",
"hubUnreachable": "Hub nicht erreichbar",
"hubUnreachableHint": "Hub starten mit `fai serve`.",
"hubUnreachableHint": "Hub starten mit `chain serve`.",
"languageEnglish": "English",
"languageGerman": "Deutsch",
"searchHint": "Springe überall hin — Module, Store, Flows, Seiten…",
@ -1511,8 +1511,8 @@
"addSourceField": "URL oder Pfad zum .fai-Bundle",
"addSourceHint": "https://git.flemming.ai/deine-org/dein-modul/releases/download/v0.1.0/foo-0.1.0.fai",
"addSourceHowItWorksTitle": "Wie private Module funktionieren",
"addSourceHowItWorksBody": "Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `fai pack <verzeichnis>` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:",
"addSourceCliExample": "fai install --link /pfad/zum/modul",
"addSourceHowItWorksBody": "Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `chain pack <verzeichnis>` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:",
"addSourceCliExample": "chain install --link /pfad/zum/modul",
"addSourceInstallButton": "Installieren",
"addSourceCancel": "Abbrechen",
"installFailed": "Installation fehlgeschlagen: {error}",
@ -1540,7 +1540,7 @@
}
},
"faiBinaryNotFound": "Das Programm `fai` wurde auf diesem Rechner nicht gefunden.",
"faiBinaryNotFoundHint": "Installiere die F∆I-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.",
"faiBinaryNotFoundHint": "Installiere die Ch∆In-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.",
"faiBinaryLocateButton": "`fai`-Programm suchen …",
"faiBinaryInstallDocsButton": "Installationsanleitung öffnen",
"faiBinaryPickerTitle": "`fai`-Programm auswählen",

View file

@ -1,11 +1,11 @@
{
"@@locale": "en",
"appTitle": "F∆I Studio",
"appTitle": "Ch∆In Studio",
"@appTitle": {
"description": "App-bar title in the OS task switcher."
},
"navWelcome": "Welcome",
"welcomeHeroTitle": "F∆I Platform",
"welcomeHeroTitle": "Ch∆In Platform",
"welcomeHeroSubtitle": "Deterministic workflow engine for AI-assisted document processing in regulated environments.",
"welcomePillarHubTitle": "Hub",
"welcomePillarHubBody": "One Rust binary that loads modules and runs flows. SQLite for state. No Docker, no message broker, no background services to babysit.",
@ -63,7 +63,7 @@
"welcomeChecklistMcp": "Add a public capability source",
"welcomeChecklistMcpHint": "Add an MCP source from the Store, or configure one under Settings → MCP Clients.",
"welcomeChecklistModule": "Install a text module",
"welcomeChecklistModuleHint": "Install a module from the Store — pick whichever category fits your work. Modules are sandboxed F∆I components.",
"welcomeChecklistModuleHint": "Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.",
"welcomeChecklistFlow": "Run a saved flow",
"welcomeChecklistFlowHint": "Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.",
"welcomeChecklistAllDone": "All four steps complete.",
@ -323,7 +323,7 @@
},
"storeReloadTooltip": "Reload",
"storeTodayBadge": "TODAY",
"storeTodayDeck": "From the F∆I editor",
"storeTodayDeck": "From the Ch∆In editor",
"storeTodayDismissTooltip": "Hide for this session",
"storePillInstalled": "installed",
"storePillUpdate": "update",
@ -610,7 +610,7 @@
"auditClearLogButton": "Clear log",
"modulesTitle": "Modules",
"modulesNoneTitle": "No modules yet",
"modulesNoneHint": "Run `fai install <capability-name>` or check ~/.fai/modules/.",
"modulesNoneHint": "Run `chain install <capability-name>` or check ~/.fai/modules/.",
"modulesReloadTooltip": "Reload",
"modulesRecentActivity": "RECENT ACTIVITY",
"modulesRecentActivityHint": "last {n} install/uninstall events from the audit log",
@ -670,7 +670,7 @@
"flowsTitle": "Flows",
"flowsReloadTooltip": "Reload",
"flowsNoneTitle": "No saved flows",
"flowsNoneHint": "Save a flow with `fai admin flows save <name> <flow.yaml>` and it shows up here.",
"flowsNoneHint": "Save a flow with `chain admin flows save <name> <flow.yaml>` and it shows up here.",
"flowsRunDialogTitle": "Run {name}",
"@flowsRunDialogTitle": {
"placeholders": {
@ -852,7 +852,7 @@
"welcomeChecklistNextTodayBody": "Run tools/today/propose.sh on a cron and the editorial card on the store auto-fills with operator-curated narratives.",
"welcomeChecklistNextTodayButton": "Open Today docs",
"welcomeChecklistNextModuleTitle": "Build your own module",
"welcomeChecklistNextModuleBody": "Generate a Rust+WASM scaffold with `fai new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.",
"welcomeChecklistNextModuleBody": "Generate a Rust+WASM scaffold with `chain new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.",
"welcomeChecklistNextModuleButton": "Read the docs",
"auditGroupToday": "TODAY",
"auditGroupYesterday": "YESTERDAY",
@ -957,7 +957,7 @@
"errInternal": "Unexpected internal error.",
"errInternalHint": "Check the hub logs at `~/.fai/logs/`. If this repeats, please report it.",
"errUnavailable": "Hub not reachable.",
"errUnavailableHint": "Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio's settings.",
"errUnavailableHint": "Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio's settings.",
"errUnauthenticated": "Authentication required.",
"errUnauthenticatedHint": "Set `FAI_REGISTRY_TOKEN` or sign in through Settings before retrying.",
"errCopyDetail": "Copy detail",
@ -1176,7 +1176,7 @@
"doctorStatusUnknown": "Daemon status: …",
"doctorPillRunning": "running",
"doctorPillStopped": "stopped",
"doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.",
"doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.",
"doctorDaemonControlWorking": "Working…",
"doctorPathLog": "Log",
"doctorPathConfig": "Config",
@ -1184,7 +1184,7 @@
"doctorPathModules": "Modules dir",
"doctorPathFlows": "Flows dir",
"doctorPathPid": "PID file",
"doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via `fai daemon restart`.",
"doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via `chain daemon restart`.",
"doctorOpenError": "Could not open: {detail}",
"@doctorOpenError": {
"placeholders": {
@ -1201,7 +1201,7 @@
}
}
},
"doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to `fai update apply --channel {channel}`.",
"doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to `chain update apply --channel {channel}`.",
"@doctorUpdateBody": {
"placeholders": {
"channel": {
@ -1241,7 +1241,7 @@
"n8nHint": "Active n8n workflows surface as `n8n.<endpoint>.<slug>` capabilities. Configure once, see them in the Store.",
"n8nEmpty": "No n8n endpoints configured. Click + to add one.",
"hubUnreachable": "Hub unreachable",
"hubUnreachableHint": "Start the hub with `fai serve`.",
"hubUnreachableHint": "Start the hub with `chain serve`.",
"languageEnglish": "English",
"languageGerman": "Deutsch",
"searchHint": "Jump anywhere — modules, store, flows, pages…",
@ -1514,8 +1514,8 @@
"addSourceField": "URL or path to .fai bundle",
"addSourceHint": "https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.fai",
"addSourceHowItWorksTitle": "How private modules work",
"addSourceHowItWorksBody": "A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`fai 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):",
"addSourceCliExample": "fai install --link /path/to/module",
"addSourceHowItWorksBody": "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):",
"addSourceCliExample": "chain install --link /path/to/module",
"addSourceInstallButton": "Install",
"addSourceCancel": "Cancel",
"installFailed": "Install failed: {error}",
@ -1543,7 +1543,7 @@
}
},
"faiBinaryNotFound": "Could not find the `fai` program on this machine.",
"faiBinaryNotFoundHint": "Install the F∆I platform, or point Studio at an existing `fai` binary.",
"faiBinaryNotFoundHint": "Install the Ch∆In platform, or point Studio at an existing `fai` binary.",
"faiBinaryLocateButton": "Locate `fai` binary…",
"faiBinaryInstallDocsButton": "Open install guide",
"faiBinaryPickerTitle": "Select the `fai` binary",

View file

@ -101,7 +101,7 @@ abstract class AppLocalizations {
/// App-bar title in the OS task switcher.
///
/// In en, this message translates to:
/// **'F∆I Studio'**
/// **'Ch∆In Studio'**
String get appTitle;
/// No description provided for @navWelcome.
@ -113,7 +113,7 @@ abstract class AppLocalizations {
/// No description provided for @welcomeHeroTitle.
///
/// In en, this message translates to:
/// **'F∆I Platform'**
/// **'Ch∆In Platform'**
String get welcomeHeroTitle;
/// No description provided for @welcomeHeroSubtitle.
@ -419,7 +419,7 @@ abstract class AppLocalizations {
/// 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 F∆I components.'**
/// **'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.
@ -1445,7 +1445,7 @@ abstract class AppLocalizations {
/// No description provided for @storeTodayDeck.
///
/// In en, this message translates to:
/// **'From the F∆I editor'**
/// **'From the Ch∆In editor'**
String get storeTodayDeck;
/// No description provided for @storeTodayDismissTooltip.
@ -1991,7 +1991,7 @@ abstract class AppLocalizations {
/// No description provided for @modulesNoneHint.
///
/// In en, this message translates to:
/// **'Run `fai install <capability-name>` or check ~/.fai/modules/.'**
/// **'Run `chain install <capability-name>` or check ~/.fai/modules/.'**
String get modulesNoneHint;
/// No description provided for @modulesReloadTooltip.
@ -2105,7 +2105,7 @@ abstract class AppLocalizations {
/// No description provided for @flowsNoneHint.
///
/// In en, this message translates to:
/// **'Save a flow with `fai admin flows save <name> <flow.yaml>` and it shows up here.'**
/// **'Save a flow with `chain admin flows save <name> <flow.yaml>` and it shows up here.'**
String get flowsNoneHint;
/// No description provided for @flowsRunDialogTitle.
@ -2615,7 +2615,7 @@ abstract class AppLocalizations {
/// No description provided for @welcomeChecklistNextModuleBody.
///
/// In en, this message translates to:
/// **'Generate a Rust+WASM scaffold with `fai new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.'**
/// **'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.
@ -2831,7 +2831,7 @@ abstract class AppLocalizations {
/// No description provided for @errUnavailableHint.
///
/// In en, this message translates to:
/// **'Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio\'s settings.'**
/// **'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.
@ -3305,7 +3305,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorDaemonControlHint.
///
/// In en, this message translates to:
/// **'Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.'**
/// **'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.
@ -3353,7 +3353,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorPathsEmpty.
///
/// In en, this message translates to:
/// **'Daemon did not report file paths. Update the running hub via `fai daemon restart`.'**
/// **'Daemon did not report file paths. Update the running hub via `chain daemon restart`.'**
String get doctorPathsEmpty;
/// No description provided for @doctorOpenError.
@ -3371,7 +3371,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorUpdateBody.
///
/// In en, this message translates to:
/// **'Channel {channel} now offers {version}. Apply via the button — Studio shells out to `fai update apply --channel {channel}`.'**
/// **'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.
@ -3467,7 +3467,7 @@ abstract class AppLocalizations {
/// No description provided for @hubUnreachableHint.
///
/// In en, this message translates to:
/// **'Start the hub with `fai serve`.'**
/// **'Start the hub with `chain serve`.'**
String get hubUnreachableHint;
/// No description provided for @languageEnglish.
@ -4253,13 +4253,13 @@ abstract class AppLocalizations {
/// 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 (`fai 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):'**
/// **'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:
/// **'fai install --link /path/to/module'**
/// **'chain install --link /path/to/module'**
String get addSourceCliExample;
/// No description provided for @addSourceInstallButton.
@ -4337,7 +4337,7 @@ abstract class AppLocalizations {
/// No description provided for @faiBinaryNotFoundHint.
///
/// In en, this message translates to:
/// **'Install the F∆I platform, or point Studio at an existing `fai` binary.'**
/// **'Install the Ch∆In platform, or point Studio at an existing `fai` binary.'**
String get faiBinaryNotFoundHint;
/// No description provided for @faiBinaryLocateButton.

View file

@ -9,13 +9,13 @@ class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get appTitle => 'F∆I Studio';
String get appTitle => 'Ch∆In Studio';
@override
String get navWelcome => 'Willkommen';
@override
String get welcomeHeroTitle => 'F∆I Platform';
String get welcomeHeroTitle => 'Ch∆In Platform';
@override
String get welcomeHeroSubtitle =>
@ -196,7 +196,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get welcomeChecklistModuleHint =>
'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed F∆I-Komponenten.';
'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed Ch∆In-Komponenten.';
@override
String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten';
@ -775,7 +775,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get storeTodayBadge => 'HEUTE';
@override
String get storeTodayDeck => 'Von der F∆I-Redaktion';
String get storeTodayDeck => 'Von der Ch∆In-Redaktion';
@override
String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden';
@ -1125,7 +1125,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get modulesNoneHint =>
'`fai install <capability-name>` ausführen oder ~/.fai/modules/ prüfen.';
'`chain install <capability-name>` ausführen oder ~/.fai/modules/ prüfen.';
@override
String get modulesReloadTooltip => 'Aktualisieren';
@ -1193,7 +1193,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get flowsNoneHint =>
'Flow speichern mit `fai admin flows save <name> <flow.yaml>`, dann taucht er hier auf.';
'Flow speichern mit `chain admin flows save <name> <flow.yaml>`, dann taucht er hier auf.';
@override
String flowsRunDialogTitle(String name) {
@ -1497,7 +1497,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get welcomeChecklistNextModuleBody =>
'Mit `fai new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.';
'Mit `chain new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.';
@override
String get welcomeChecklistNextModuleButton => 'Doku lesen';
@ -1635,7 +1635,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get errUnavailableHint =>
'Sicherstellen, dass `fai serve` (oder `fai daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.';
'Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.';
@override
String get errUnauthenticated => 'Authentifizierung erforderlich.';
@ -1918,7 +1918,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get doctorDaemonControlHint =>
'Studio ruft das Platform-Binary auf — entspricht `fai daemon …`, sodass CLI und UI im Gleichschritt bleiben.';
'Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.';
@override
String get doctorDaemonControlWorking => 'Wird ausgeführt…';
@ -1943,7 +1943,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get doctorPathsEmpty =>
'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `fai daemon restart`.';
'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.';
@override
String doctorOpenError(String detail) {
@ -1957,7 +1957,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String doctorUpdateBody(String channel, String version) {
return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `fai update apply --channel $channel` auf.';
return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `chain update apply --channel $channel` auf.';
}
@override
@ -2015,7 +2015,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get hubUnreachable => 'Hub nicht erreichbar';
@override
String get hubUnreachableHint => 'Hub starten mit `fai serve`.';
String get hubUnreachableHint => 'Hub starten mit `chain serve`.';
@override
String get languageEnglish => 'English';
@ -2487,10 +2487,10 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get addSourceHowItWorksBody =>
'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `fai pack <verzeichnis>` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:';
'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `chain pack <verzeichnis>` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:';
@override
String get addSourceCliExample => 'fai install --link /pfad/zum/modul';
String get addSourceCliExample => 'chain install --link /pfad/zum/modul';
@override
String get addSourceInstallButton => 'Installieren';
@ -2540,7 +2540,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get faiBinaryNotFoundHint =>
'Installiere die F∆I-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.';
'Installiere die Ch∆In-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.';
@override
String get faiBinaryLocateButton => '`fai`-Programm suchen …';

View file

@ -9,13 +9,13 @@ class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'F∆I Studio';
String get appTitle => 'Ch∆In Studio';
@override
String get navWelcome => 'Welcome';
@override
String get welcomeHeroTitle => 'F∆I Platform';
String get welcomeHeroTitle => 'Ch∆In Platform';
@override
String get welcomeHeroSubtitle =>
@ -195,7 +195,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get welcomeChecklistModuleHint =>
'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed F∆I components.';
'Install a module from the Store — pick whichever category fits your work. Modules are sandboxed Ch∆In components.';
@override
String get welcomeChecklistFlow => 'Run a saved flow';
@ -793,7 +793,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get storeTodayBadge => 'TODAY';
@override
String get storeTodayDeck => 'From the F∆I editor';
String get storeTodayDeck => 'From the Ch∆In editor';
@override
String get storeTodayDismissTooltip => 'Hide for this session';
@ -1140,7 +1140,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get modulesNoneHint =>
'Run `fai install <capability-name>` or check ~/.fai/modules/.';
'Run `chain install <capability-name>` or check ~/.fai/modules/.';
@override
String get modulesReloadTooltip => 'Reload';
@ -1208,7 +1208,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get flowsNoneHint =>
'Save a flow with `fai admin flows save <name> <flow.yaml>` and it shows up here.';
'Save a flow with `chain admin flows save <name> <flow.yaml>` and it shows up here.';
@override
String flowsRunDialogTitle(String name) {
@ -1508,7 +1508,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get welcomeChecklistNextModuleBody =>
'Generate a Rust+WASM scaffold with `fai new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.';
'Generate a Rust+WASM scaffold with `chain new module <name>`. The module-sdk handles the WIT plumbing; you write a typed invoke.';
@override
String get welcomeChecklistNextModuleButton => 'Read the docs';
@ -1645,7 +1645,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get errUnavailableHint =>
'Make sure `fai serve` (or `fai daemon start`) is running and the daemon endpoint matches Studio\'s settings.';
'Make sure `chain serve` (or `chain daemon start`) is running and the daemon endpoint matches Studio\'s settings.';
@override
String get errUnauthenticated => 'Authentication required.';
@ -1927,7 +1927,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get doctorDaemonControlHint =>
'Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.';
'Studio shells out to the platform binary — mirrors `chain daemon …` exactly so the CLI and UI stay in lockstep.';
@override
String get doctorDaemonControlWorking => 'Working…';
@ -1952,7 +1952,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get doctorPathsEmpty =>
'Daemon did not report file paths. Update the running hub via `fai daemon restart`.';
'Daemon did not report file paths. Update the running hub via `chain daemon restart`.';
@override
String doctorOpenError(String detail) {
@ -1966,7 +1966,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String doctorUpdateBody(String channel, String version) {
return 'Channel $channel now offers $version. Apply via the button — Studio shells out to `fai update apply --channel $channel`.';
return 'Channel $channel now offers $version. Apply via the button — Studio shells out to `chain update apply --channel $channel`.';
}
@override
@ -2022,7 +2022,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get hubUnreachable => 'Hub unreachable';
@override
String get hubUnreachableHint => 'Start the hub with `fai serve`.';
String get hubUnreachableHint => 'Start the hub with `chain serve`.';
@override
String get languageEnglish => 'English';
@ -2491,10 +2491,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get addSourceHowItWorksBody =>
'A module is a directory with a module.yaml + the WASM artifact. To share it: pack it (`fai 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):';
'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):';
@override
String get addSourceCliExample => 'fai install --link /path/to/module';
String get addSourceCliExample => 'chain install --link /path/to/module';
@override
String get addSourceInstallButton => 'Install';
@ -2543,7 +2543,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get faiBinaryNotFoundHint =>
'Install the F∆I platform, or point Studio at an existing `fai` binary.';
'Install the Ch∆In platform, or point Studio at an existing `fai` binary.';
@override
String get faiBinaryLocateButton => 'Locate `fai` binary…';

View file

@ -1,4 +1,4 @@
// FI Studio desktop GUI for the FI hub.
// ChIn Studio desktop GUI for the ChIn hub.
//
// Visual language: warm minimalism / deep tech with soul.
// Tokens in lib/theme/, primitives in lib/widgets/.
@ -215,7 +215,7 @@ class StudioAppState extends State<StudioApp> {
builder: (context, snap) {
final p = snap.data ?? (light: null, dark: null);
return MaterialApp(
title: 'F∆I Studio',
title: 'Ch∆In Studio',
debugShowCheckedModeBanner: false,
theme: p.light ?? FaiTheme.light(),
darkTheme: p.dark ?? FaiTheme.dark(),
@ -1072,7 +1072,7 @@ class _BrandLabel extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'F∆I Studio',
'Ch∆In Studio',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
maxLines: 1,
overflow: TextOverflow.ellipsis,

View file

@ -526,7 +526,7 @@ class _EventDetailDialogState extends State<_EventDetailDialog> {
String _buildPrompt(AuditEvent e, String mode) {
// Privacy: redacted = no detail JSON, full = include it.
final buf = StringBuffer()
..writeln('A F∆I Platform audit event was logged. Explain what')
..writeln('A Ch∆In Platform audit event was logged. Explain what')
..writeln('happened in plain language and suggest one concrete')
..writeln('fix the operator can apply now.')
..writeln()

View file

@ -481,7 +481,7 @@ class _PathRow extends StatelessWidget {
/// Daemon control affordances: Restart, Apply update, Stop.
/// Each shells out to the `fai` binary (resolved via PATH or
/// `~/.fai/bin/fai`). Studio is the GUI shell; the binary owns
/// `~/.fai/bin/chain`). Studio is the GUI shell; the binary owns
/// the supervisor logic so the daemon and CLI stay in lockstep.
class _DaemonActionsCard extends StatefulWidget {
@override

View file

@ -1405,7 +1405,7 @@ String _buildAiSearchPrompt(
String locale,
) {
final lang = locale == 'de' ? 'German' : 'English';
return '''You are the F∆I Store assistant. The operator just asked, in $lang:
return '''You are the Ch∆In Store assistant. The operator just asked, in $lang:
"$query"
@ -3009,9 +3009,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Plug in any MCP server',
titleDe: 'Jeden MCP-Server einbinden',
bodyEn:
'F∆I speaks the Model Context Protocol out of the box. Add a public server (DeepWiki, Semgrep) or a private one — its tools show up in this grid next to the built-in modules. Same install button, same audit trail.',
'Ch∆In speaks the Model Context Protocol out of the box. Add a public server (DeepWiki, Semgrep) or a private one — its tools show up in this grid next to the built-in modules. Same install button, same audit trail.',
bodyDe:
'F∆I spricht das Model Context Protocol von Haus aus. Einen öffentlichen Server (DeepWiki, Semgrep) oder einen eigenen hinzufügen — seine Tools tauchen in diesem Grid neben den eingebauten Modulen auf. Gleicher Install-Button, gleiche Audit-Spur.',
'Ch∆In spricht das Model Context Protocol von Haus aus. Einen öffentlichen Server (DeepWiki, Semgrep) oder einen eigenen hinzufügen — seine Tools tauchen in diesem Grid neben den eingebauten Modulen auf. Gleicher Install-Button, gleiche Audit-Spur.',
ctaLabelEn: 'Browse suggested sources',
ctaLabelDe: 'Empfohlene Quellen ansehen',
icon: Icons.hub_outlined,
@ -3053,9 +3053,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Extract, anonymise, translate, summarise',
titleDe: 'Extrahieren, anonymisieren, übersetzen, zusammenfassen',
bodyEn:
'The text-processing bundle is F∆I\'s document-analysis backbone. PDF and DOCX in, plain text out. Then anonymise PII, translate, or summarise — every step audit-grade, every Ollama call recorded with model digest.',
'The text-processing bundle is Ch∆In\'s document-analysis backbone. PDF and DOCX in, plain text out. Then anonymise PII, translate, or summarise — every step audit-grade, every Ollama call recorded with model digest.',
bodyDe:
'Das Text-Processing-Bündel ist F∆Is Dokumentenanalyse-Rückgrat. PDF und DOCX rein, Klartext raus. Dann PII anonymisieren, übersetzen oder zusammenfassen — jeder Schritt audit-tauglich, jeder Ollama-Aufruf mit Modell-Digest protokolliert.',
'Das Text-Processing-Bündel ist Ch∆Ins Dokumentenanalyse-Rückgrat. PDF und DOCX rein, Klartext raus. Dann PII anonymisieren, übersetzen oder zusammenfassen — jeder Schritt audit-tauglich, jeder Ollama-Aufruf mit Modell-Digest protokolliert.',
ctaLabelEn: 'Show text modules',
ctaLabelDe: 'Text-Module zeigen',
icon: Icons.article_outlined,
@ -3068,9 +3068,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Every module declares its permissions',
titleDe: 'Jedes Modul deklariert seine Berechtigungen',
bodyEn:
'F∆I modules are WASM components. They run in a sandbox with no ambient authority — every filesystem path, every network host, every env var has to be listed in module.yaml. The hub enforces them. No declaration, no access.',
'Ch∆In modules are WASM components. They run in a sandbox with no ambient authority — every filesystem path, every network host, every env var has to be listed in module.yaml. The hub enforces them. No declaration, no access.',
bodyDe:
'F∆I-Module sind WASM-Komponenten. Sie laufen in einer Sandbox ohne Ambient-Authority — jeder Dateipfad, jeder Netzwerk-Host, jede Env-Var muss in module.yaml stehen. Der Hub setzt es durch. Keine Deklaration, kein Zugriff.',
'Ch∆In-Module sind WASM-Komponenten. Sie laufen in einer Sandbox ohne Ambient-Authority — jeder Dateipfad, jeder Netzwerk-Host, jede Env-Var muss in module.yaml stehen. Der Hub setzt es durch. Keine Deklaration, kein Zugriff.',
ctaLabelEn: 'Review permissions',
ctaLabelDe: 'Berechtigungen prüfen',
icon: Icons.shield_outlined,
@ -3093,12 +3093,12 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
TodayStoryData(
badgeEn: 'TEST FIRST',
badgeDe: 'ZUERST TESTEN',
titleEn: 'fai doctor — diagnose before you ship',
titleDe: 'fai doctor — diagnostizieren bevor ausgerollt wird',
titleEn: 'chain doctor — diagnose before you ship',
titleDe: 'chain doctor — diagnostizieren bevor ausgerollt wird',
bodyEn:
'Before installing a module on a production hub, run `fai doctor` in the CLI. It validates manifest, signatures, declared permissions against the operator policy ceiling, and reports anything the hub would reject — no surprises at install time.',
'Before installing a module on a production hub, run `chain doctor` in the CLI. It validates manifest, signatures, declared permissions against the operator policy ceiling, and reports anything the hub would reject — no surprises at install time.',
bodyDe:
'Bevor ein Modul auf einem Produktions-Hub installiert wird, in der CLI `fai doctor` laufen lassen. Validiert Manifest, Signaturen und deklarierte Berechtigungen gegen die Operator-Policy-Decke — keine Überraschungen beim Install.',
'Bevor ein Modul auf einem Produktions-Hub installiert wird, in der CLI `chain doctor` laufen lassen. Validiert Manifest, Signaturen und deklarierte Berechtigungen gegen die Operator-Policy-Decke — keine Überraschungen beim Install.',
ctaLabelEn: '',
ctaLabelDe: '',
icon: Icons.health_and_safety_outlined,

View file

@ -1,5 +1,5 @@
// Welcome first surface a new operator sees, default sidebar
// destination on launch. Pure introduction: what FI is, the
// destination on launch. Pure introduction: what ChIn is, the
// three concepts, the trust posture. No live data, no
// federation chrome that's the Store's role.
//
@ -1140,7 +1140,7 @@ class _DocReaderError {
'Tried: ${attempted.join(", ")}\n'
'Underlying: $underlying\n'
'This typically means the Studio binary on disk is from\n'
'before the doc bundle changed. Rebuild Studio (fai studio\n'
'before the doc bundle changed. Rebuild Studio (chain studio\n'
'or the build pipeline) or open the Forgejo copy in browser.';
}

View file

@ -1,11 +1,11 @@
// Design tokens for FI Studio.
// Design tokens for ChIn Studio.
//
// One file, semantic names, no magic numbers in the rest of the
// codebase. Both light and dark modes derive from these tokens.
import 'package:flutter/material.dart';
/// Colour palette. Single strong accent (FI Cyan) plus neutral
/// Colour palette. Single strong accent (ChIn Cyan) plus neutral
/// greys. Status colours stay restrained no candy palette.
class FaiColors {
FaiColors._();

View file

@ -1,5 +1,5 @@
// FaiCard flat card with subtle accent gradient on the top
// border. Replaces Material's default Card for the F∆I look.
// border. Replaces Material's default Card for the Ch∆In look.
import 'package:flutter/material.dart';

View file

@ -1,4 +1,4 @@
// FaiDeltaMark the FI signature element. A precise triangle
// FaiDeltaMark the ChIn signature element. A precise triangle
// () drawn from primitives, not a font glyph. Three states:
//
// - idle: static, accent colour, soft glow

View file

@ -2,7 +2,7 @@
// Replaces "(no data)" strings with one tone, one icon, one tip.
//
// The blank surface is where an app most easily feels unfinished,
// so this state is deliberately *designed*: the FI delta ()
// so this state is deliberately *designed*: the ChIn delta ()
// sits as a soft watermark behind the icon badge, the badge
// carries a whisper of elevation, and the copy breathes. The
// result reads "nothing here yet, on purpose" rather than
@ -48,7 +48,7 @@ class FaiEmptyState extends StatelessWidget {
// Brand hero: an oversized, low-opacity watermark
// anchors the composition while the contextual icon
// badge sits crisply on top so every empty surface
// still carries the FI signature, never a bare icon.
// still carries the ChIn signature, never a bare icon.
SizedBox(
width: 112,
height: 112,

View file

@ -1013,7 +1013,7 @@ class McpClientDraft {
/// MCP-clients panel shows every configured server with its
/// last-discovery health, plus Add / Remove / Refresh actions.
/// Configure a server here, the store gains synthetic
/// capabilities for every advertised tool. Mirrors `fai mcp `
/// capabilities for every advertised tool. Mirrors `chain mcp `
/// on the CLI.
class _McpClientsPanel extends StatelessWidget {
final List<McpClientInfo> clients;
@ -1669,7 +1669,7 @@ class _ThemePluginPanel extends StatelessWidget {
}
/// Hub maintenance panel currently one action: reset operator
/// state via `fai reset --yes`. Lives at the bottom of Settings
/// state via `chain reset --yes`. Lives at the bottom of Settings
/// so the everyday config controls aren't crowded by a destructive
/// button. The reset itself is gated by an interactive confirm
/// dialog before the CLI is invoked.

View file

@ -820,7 +820,7 @@ class _ModelPicker extends StatelessWidget {
/// round-trip; works for Ollama tags (`gemma3:4b`), OpenAI names
/// (`gpt-4o-mini`), Anthropic-style (`claude-haiku-4-5`).
enum _Suitability {
recommended, // tested with FI System AI
recommended, // tested with ChIn System AI
balanced, // 4-8B params or known-good cloud model
small, // <4B params; quality may be insufficient
large, // 9-15B; slower but ok

View file

@ -1,4 +1,4 @@
// Barrel file for the FI Studio widget library.
// Barrel file for the ChIn Studio widget library.
//
// Pages should `import '../widgets/widgets.dart';` and use the
// primitives directly no Material `Card` / generic `Container`