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

@ -61,7 +61,7 @@ version + `kStudioVersion` in `lib/main.dart` stay in lockstep.
- **Add-module-source dialog** for private modules that - **Add-module-source dialog** for private modules that
aren't in the public store. Asks for URL or local `.fai` aren't in the public store. Asks for URL or local `.fai`
bundle path; carries an explainer block + `fai install --link` bundle path; carries an explainer block + `chain install --link`
example. example.
- **Store catalogue** passed to the flow editor so the - **Store catalogue** passed to the flow editor so the
analyzer can decide between Install (in store) and Add analyzer can decide between Install (in store) and Add

View file

@ -1,8 +1,8 @@
# F∆I Studio # Ch∆In Studio
Desktop GUI client for the F∆I Platform hub. Tier-2 generic Desktop GUI client for the Ch∆In Platform hub. Tier-2 generic
platform client per `docs/architecture/client.md`. Connects to a platform client per `docs/architecture/client.md`. Connects to a
local or remote `fai serve` over gRPC. local or remote `chain serve` over gRPC.
> **Status (2026-05-05):** MVP scaffold. Three pages with mock > **Status (2026-05-05):** MVP scaffold. Three pages with mock
> data, no live gRPC connection yet. Validates the visual > data, no live gRPC connection yet. Validates the visual

View file

@ -1,6 +1,6 @@
# Architecture in one paragraph # Architecture in one paragraph
F∆I has three concepts you'll meet everywhere: **Hub**, Ch∆In has three concepts you'll meet everywhere: **Hub**,
**Module**, **Flow**. **Module**, **Flow**.
**The hub** is a single Rust binary called `fai`. It runs as a **The hub** is a single Rust binary called `fai`. It runs as a
@ -39,7 +39,7 @@ Studio ──gRPC──▶ Hub ──loads──▶ Module (WASM)
or Podman. Modules are WASM components loaded in-process. or Podman. Modules are WASM components loaded in-process.
- No external database. SQLite ships with the hub. - No external database. SQLite ships with the hub.
- No background services. One process; restart with - No background services. One process; restart with
`fai daemon restart` — see Doctor → Daemon control. `chain daemon restart` — see Doctor → Daemon control.
## Where to go next in this app ## Where to go next in this app

View file

@ -1,6 +1,6 @@
# Architektur in einem Absatz # Architektur in einem Absatz
F∆I hat drei Konzepte, die dir überall begegnen: **Hub**, Ch∆In hat drei Konzepte, die dir überall begegnen: **Hub**,
**Modul**, **Flow**. **Modul**, **Flow**.
**Der Hub** ist ein einzelnes Rust-Binary namens `fai`. Er **Der Hub** ist ein einzelnes Rust-Binary namens `fai`. Er
@ -42,7 +42,7 @@ Studio ──gRPC──▶ Hub ──lädt──▶ Modul (WASM)
Module sind WASM-Komponenten, in-process geladen. Module sind WASM-Komponenten, in-process geladen.
- Keine externe Datenbank. SQLite kommt mit dem Hub. - Keine externe Datenbank. SQLite kommt mit dem Hub.
- Keine Hintergrunddienste. Ein Prozess; Neustart per - Keine Hintergrunddienste. Ein Prozess; Neustart per
`fai daemon restart` — siehe Diagnose → Daemon-Steuerung. `chain daemon restart` — siehe Diagnose → Daemon-Steuerung.
## Wo es in dieser App weitergeht ## Wo es in dieser App weitergeht

View file

@ -37,7 +37,7 @@ WORM-1 is our first WORM (write-once-read-many) tier:
beta / production channels. beta / production channels.
- **Tamper-evident**: the chain reveals any retroactive edit. - **Tamper-evident**: the chain reveals any retroactive edit.
Verification runs end-to-end on every Doctor-page load and Verification runs end-to-end on every Doctor-page load and
via `fai admin verify-events`. via `chain admin verify-events`.
- **Self-contained**: SQLite + chain hash is enough; no - **Self-contained**: SQLite + chain hash is enough; no
external WORM sink needed. external WORM sink needed.
@ -60,7 +60,7 @@ WORM sink) are roadmap items, not yet shipped.
If you want to verify outside Studio: If you want to verify outside Studio:
```bash ```bash
fai admin verify-events chain admin verify-events
# Prints "Hash chain intact: N events verified" or names the # Prints "Hash chain intact: N events verified" or names the
# first event whose hash mismatches. # first event whose hash mismatches.
``` ```

View file

@ -38,7 +38,7 @@ WORM-1 ist unsere erste WORM-Stufe (write-once-read-many):
beta-/production-Kanälen verweigert. beta-/production-Kanälen verweigert.
- **Manipulationssicher**: Die Kette zeigt jede nachträgliche - **Manipulationssicher**: Die Kette zeigt jede nachträgliche
Änderung. Verifikation läuft bei jedem Doctor-Page-Load Änderung. Verifikation läuft bei jedem Doctor-Page-Load
komplett und über `fai admin verify-events`. komplett und über `chain admin verify-events`.
- **Selbst-tragend**: SQLite + Ketten-Hash genügen; keine - **Selbst-tragend**: SQLite + Ketten-Hash genügen; keine
externe WORM-Senke nötig. externe WORM-Senke nötig.
@ -61,7 +61,7 @@ WORM-Senke) sind Roadmap-Punkte, noch nicht ausgeliefert.
Wer außerhalb von Studio verifizieren will: Wer außerhalb von Studio verifizieren will:
```bash ```bash
fai admin verify-events chain admin verify-events
# Druckt „Hash-Kette intakt: N Events verifiziert" oder nennt # Druckt „Hash-Kette intakt: N Events verifiziert" oder nennt
# das erste Event, dessen Hash nicht passt. # das erste Event, dessen Hash nicht passt.
``` ```

View file

@ -25,7 +25,7 @@ outputs:
greeting: "{{ steps.greet.outputs.payload }}" greeting: "{{ steps.greet.outputs.payload }}"
``` ```
`fai run flows/hello.yaml --input name=World` produces: `chain run flows/hello.yaml --input name=World` produces:
```json ```json
{ "greeting": "Hello, World" } { "greeting": "Hello, World" }

View file

@ -26,7 +26,7 @@ outputs:
greeting: "{{ steps.greet.outputs.payload }}" greeting: "{{ steps.greet.outputs.payload }}"
``` ```
`fai run flows/hello.yaml --input name=Welt` ergibt: `chain run flows/hello.yaml --input name=Welt` ergibt:
```json ```json
{ "greeting": "Hallo, Welt" } { "greeting": "Hallo, Welt" }

View file

@ -1,6 +1,6 @@
# Sandbox model # Sandbox model
Every F∆I module runs inside a WebAssembly sandbox with no Every Ch∆In module runs inside a WebAssembly sandbox with no
ambient access to the host. The module can do exactly what it ambient access to the host. The module can do exactly what it
declares in its `module.yaml` — and nothing else. declares in its `module.yaml` — and nothing else.

View file

@ -1,6 +1,6 @@
# Sandbox-Modell # Sandbox-Modell
Jedes F∆I-Modul läuft in einer WebAssembly-Sandbox ohne Jedes Ch∆In-Modul läuft in einer WebAssembly-Sandbox ohne
ambienten Hostzugriff. Das Modul kann genau das, was es in ambienten Hostzugriff. Das Modul kann genau das, was es in
seiner `module.yaml` deklariert — und sonst nichts. seiner `module.yaml` deklariert — und sonst nichts.

View file

@ -12,7 +12,7 @@ content:
store / federation items the operator can act on. store / federation items the operator can act on.
- **Architecture education**: "every module is sandboxed", - **Architecture education**: "every module is sandboxed",
"the audit log is hash-chained", "the hub fits in one "the audit log is hash-chained", "the hub fits in one
binary, no Docker". These are *what F∆I is* — they belong binary, no Docker". These are *what Ch∆In is* — they belong
on a Welcome page that introduces the platform on first on a Welcome page that introduces the platform on first
launch and stays available afterwards as a reference. launch and stays available afterwards as a reference.
@ -41,7 +41,7 @@ returning operators can come back any time.
├──────────────────────────────────────────────────────────┤ ├──────────────────────────────────────────────────────────┤
│ ┌────────────────────────────────────────────────────┐ │ │ ┌────────────────────────────────────────────────────┐ │
│ │ HERO │ │ │ │ HERO │ │
│ │ F∆I Platform │ │ │ │ Ch∆In Platform │ │
│ │ Deterministic workflow engine for AI-assisted │ │ │ │ Deterministic workflow engine for AI-assisted │ │
│ │ document processing in regulated environments. │ │ │ │ document processing in regulated environments. │ │
│ └────────────────────────────────────────────────────┘ │ │ └────────────────────────────────────────────────────┘ │

View file

@ -108,7 +108,7 @@ The prompt template (`tools/today/prompt.template.md`) hard-encodes:
## Out of scope (Phase 0.5) ## Out of scope (Phase 0.5)
- Multi-story rotation (one active story at a time). - Multi-story rotation (one active story at a time).
- A/B-testing or click-through tracking — F∆I has no surveillance budget - A/B-testing or click-through tracking — Ch∆In has no surveillance budget
and no telemetry pipeline to feed it into. and no telemetry pipeline to feed it into.
- Auto-publication to git (operator-curated boundary stays manual). - Auto-publication to git (operator-curated boundary stays manual).
- Hub-served stories. Studio reads `~/.fai/today/active.yaml` directly - Hub-served stories. Studio reads `~/.fai/today/active.yaml` directly

View file

@ -24,7 +24,7 @@ import 'fai_log.dart';
/// ///
/// [source] is a short tag (`flows.run`, `audit.clear`, ) /// [source] is a short tag (`flows.run`, `audit.clear`, )
/// used to group entries in the on-disk log so an operator or /// 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 /// reading the full free-text. Keep it stable; treat it like
/// a metric label, not free-form text. /// a metric label, not free-form text.
/// ///

View file

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

View file

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

View file

@ -1,8 +1,8 @@
{ {
"@@locale": "de", "@@locale": "de",
"appTitle": "F∆I Studio", "appTitle": "Ch∆In Studio",
"navWelcome": "Willkommen", "navWelcome": "Willkommen",
"welcomeHeroTitle": "F∆I Platform", "welcomeHeroTitle": "Ch∆In Platform",
"welcomeHeroSubtitle": "Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.", "welcomeHeroSubtitle": "Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.",
"welcomePillarHubTitle": "Hub", "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.", "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", "welcomeChecklistMcp": "Öffentliche Capability-Quelle hinzufügen",
"welcomeChecklistMcpHint": "Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.", "welcomeChecklistMcpHint": "Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.",
"welcomeChecklistModule": "Ein Text-Modul installieren", "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", "welcomeChecklistFlow": "Einen gespeicherten Flow starten",
"welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; auch ein eigener tut's.", "welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; auch ein eigener tut's.",
"welcomeChecklistAllDone": "Alle vier Schritte erledigt.", "welcomeChecklistAllDone": "Alle vier Schritte erledigt.",
@ -320,7 +320,7 @@
}, },
"storeReloadTooltip": "Aktualisieren", "storeReloadTooltip": "Aktualisieren",
"storeTodayBadge": "HEUTE", "storeTodayBadge": "HEUTE",
"storeTodayDeck": "Von der F∆I-Redaktion", "storeTodayDeck": "Von der Ch∆In-Redaktion",
"storeTodayDismissTooltip": "Für diese Sitzung ausblenden", "storeTodayDismissTooltip": "Für diese Sitzung ausblenden",
"storePillInstalled": "installiert", "storePillInstalled": "installiert",
"storePillUpdate": "Update", "storePillUpdate": "Update",
@ -607,7 +607,7 @@
"auditClearLogButton": "Log löschen", "auditClearLogButton": "Log löschen",
"modulesTitle": "Module", "modulesTitle": "Module",
"modulesNoneTitle": "Noch keine 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", "modulesReloadTooltip": "Aktualisieren",
"modulesRecentActivity": "LETZTE AKTIVITÄT", "modulesRecentActivity": "LETZTE AKTIVITÄT",
"modulesRecentActivityHint": "letzte {n} install/uninstall-Ereignisse aus dem Audit-Log", "modulesRecentActivityHint": "letzte {n} install/uninstall-Ereignisse aus dem Audit-Log",
@ -667,7 +667,7 @@
"flowsTitle": "Flows", "flowsTitle": "Flows",
"flowsReloadTooltip": "Aktualisieren", "flowsReloadTooltip": "Aktualisieren",
"flowsNoneTitle": "Keine gespeicherten Flows", "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": "{name} ausführen",
"@flowsRunDialogTitle": { "@flowsRunDialogTitle": {
"placeholders": { "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.", "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", "welcomeChecklistNextTodayButton": "Today-Doku öffnen",
"welcomeChecklistNextModuleTitle": "Eigenes Modul bauen", "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", "welcomeChecklistNextModuleButton": "Doku lesen",
"auditGroupToday": "HEUTE", "auditGroupToday": "HEUTE",
"auditGroupYesterday": "GESTERN", "auditGroupYesterday": "GESTERN",
@ -954,7 +954,7 @@
"errInternal": "Unerwarteter interner Fehler.", "errInternal": "Unerwarteter interner Fehler.",
"errInternalHint": "Hub-Logs unter `~/.fai/logs/` prüfen. Wenn das öfter passiert, bitte melden.", "errInternalHint": "Hub-Logs unter `~/.fai/logs/` prüfen. Wenn das öfter passiert, bitte melden.",
"errUnavailable": "Hub nicht erreichbar.", "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.", "errUnauthenticated": "Authentifizierung erforderlich.",
"errUnauthenticatedHint": "`FAI_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.", "errUnauthenticatedHint": "`FAI_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.",
"errCopyDetail": "Detail kopieren", "errCopyDetail": "Detail kopieren",
@ -1173,7 +1173,7 @@
"doctorStatusUnknown": "Daemon-Status: …", "doctorStatusUnknown": "Daemon-Status: …",
"doctorPillRunning": "läuft", "doctorPillRunning": "läuft",
"doctorPillStopped": "gestoppt", "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…", "doctorDaemonControlWorking": "Wird ausgeführt…",
"doctorPathLog": "Log", "doctorPathLog": "Log",
"doctorPathConfig": "Konfig", "doctorPathConfig": "Konfig",
@ -1181,7 +1181,7 @@
"doctorPathModules": "Module-Verzeichnis", "doctorPathModules": "Module-Verzeichnis",
"doctorPathFlows": "Flow-Verzeichnis", "doctorPathFlows": "Flow-Verzeichnis",
"doctorPathPid": "PID-Datei", "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": "Konnte nicht öffnen: {detail}",
"@doctorOpenError": { "@doctorOpenError": {
"placeholders": { "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": { "@doctorUpdateBody": {
"placeholders": { "placeholders": {
"channel": { "channel": {
@ -1238,7 +1238,7 @@
"n8nHint": "Aktive n8n-Workflows erscheinen als `n8n.<endpoint>.<slug>` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.", "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.", "n8nEmpty": "Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.",
"hubUnreachable": "Hub nicht erreichbar", "hubUnreachable": "Hub nicht erreichbar",
"hubUnreachableHint": "Hub starten mit `fai serve`.", "hubUnreachableHint": "Hub starten mit `chain serve`.",
"languageEnglish": "English", "languageEnglish": "English",
"languageGerman": "Deutsch", "languageGerman": "Deutsch",
"searchHint": "Springe überall hin — Module, Store, Flows, Seiten…", "searchHint": "Springe überall hin — Module, Store, Flows, Seiten…",
@ -1511,8 +1511,8 @@
"addSourceField": "URL oder Pfad zum .fai-Bundle", "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", "addSourceHint": "https://git.flemming.ai/deine-org/dein-modul/releases/download/v0.1.0/foo-0.1.0.fai",
"addSourceHowItWorksTitle": "Wie private Module funktionieren", "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:", "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": "fai install --link /pfad/zum/modul", "addSourceCliExample": "chain install --link /pfad/zum/modul",
"addSourceInstallButton": "Installieren", "addSourceInstallButton": "Installieren",
"addSourceCancel": "Abbrechen", "addSourceCancel": "Abbrechen",
"installFailed": "Installation fehlgeschlagen: {error}", "installFailed": "Installation fehlgeschlagen: {error}",
@ -1540,7 +1540,7 @@
} }
}, },
"faiBinaryNotFound": "Das Programm `fai` wurde auf diesem Rechner nicht gefunden.", "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 …", "faiBinaryLocateButton": "`fai`-Programm suchen …",
"faiBinaryInstallDocsButton": "Installationsanleitung öffnen", "faiBinaryInstallDocsButton": "Installationsanleitung öffnen",
"faiBinaryPickerTitle": "`fai`-Programm auswählen", "faiBinaryPickerTitle": "`fai`-Programm auswählen",

View file

@ -1,11 +1,11 @@
{ {
"@@locale": "en", "@@locale": "en",
"appTitle": "F∆I Studio", "appTitle": "Ch∆In Studio",
"@appTitle": { "@appTitle": {
"description": "App-bar title in the OS task switcher." "description": "App-bar title in the OS task switcher."
}, },
"navWelcome": "Welcome", "navWelcome": "Welcome",
"welcomeHeroTitle": "F∆I Platform", "welcomeHeroTitle": "Ch∆In Platform",
"welcomeHeroSubtitle": "Deterministic workflow engine for AI-assisted document processing in regulated environments.", "welcomeHeroSubtitle": "Deterministic workflow engine for AI-assisted document processing in regulated environments.",
"welcomePillarHubTitle": "Hub", "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.", "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", "welcomeChecklistMcp": "Add a public capability source",
"welcomeChecklistMcpHint": "Add an MCP source from the Store, or configure one under Settings → MCP Clients.", "welcomeChecklistMcpHint": "Add an MCP source from the Store, or configure one under Settings → MCP Clients.",
"welcomeChecklistModule": "Install a text module", "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", "welcomeChecklistFlow": "Run a saved flow",
"welcomeChecklistFlowHint": "Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.", "welcomeChecklistFlowHint": "Flows → pick one → Run. Studio ships a few demo flows; one of your own works too.",
"welcomeChecklistAllDone": "All four steps complete.", "welcomeChecklistAllDone": "All four steps complete.",
@ -323,7 +323,7 @@
}, },
"storeReloadTooltip": "Reload", "storeReloadTooltip": "Reload",
"storeTodayBadge": "TODAY", "storeTodayBadge": "TODAY",
"storeTodayDeck": "From the F∆I editor", "storeTodayDeck": "From the Ch∆In editor",
"storeTodayDismissTooltip": "Hide for this session", "storeTodayDismissTooltip": "Hide for this session",
"storePillInstalled": "installed", "storePillInstalled": "installed",
"storePillUpdate": "update", "storePillUpdate": "update",
@ -610,7 +610,7 @@
"auditClearLogButton": "Clear log", "auditClearLogButton": "Clear log",
"modulesTitle": "Modules", "modulesTitle": "Modules",
"modulesNoneTitle": "No modules yet", "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", "modulesReloadTooltip": "Reload",
"modulesRecentActivity": "RECENT ACTIVITY", "modulesRecentActivity": "RECENT ACTIVITY",
"modulesRecentActivityHint": "last {n} install/uninstall events from the audit log", "modulesRecentActivityHint": "last {n} install/uninstall events from the audit log",
@ -670,7 +670,7 @@
"flowsTitle": "Flows", "flowsTitle": "Flows",
"flowsReloadTooltip": "Reload", "flowsReloadTooltip": "Reload",
"flowsNoneTitle": "No saved flows", "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": "Run {name}",
"@flowsRunDialogTitle": { "@flowsRunDialogTitle": {
"placeholders": { "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.", "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", "welcomeChecklistNextTodayButton": "Open Today docs",
"welcomeChecklistNextModuleTitle": "Build your own module", "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", "welcomeChecklistNextModuleButton": "Read the docs",
"auditGroupToday": "TODAY", "auditGroupToday": "TODAY",
"auditGroupYesterday": "YESTERDAY", "auditGroupYesterday": "YESTERDAY",
@ -957,7 +957,7 @@
"errInternal": "Unexpected internal error.", "errInternal": "Unexpected internal error.",
"errInternalHint": "Check the hub logs at `~/.fai/logs/`. If this repeats, please report it.", "errInternalHint": "Check the hub logs at `~/.fai/logs/`. If this repeats, please report it.",
"errUnavailable": "Hub not reachable.", "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.", "errUnauthenticated": "Authentication required.",
"errUnauthenticatedHint": "Set `FAI_REGISTRY_TOKEN` or sign in through Settings before retrying.", "errUnauthenticatedHint": "Set `FAI_REGISTRY_TOKEN` or sign in through Settings before retrying.",
"errCopyDetail": "Copy detail", "errCopyDetail": "Copy detail",
@ -1176,7 +1176,7 @@
"doctorStatusUnknown": "Daemon status: …", "doctorStatusUnknown": "Daemon status: …",
"doctorPillRunning": "running", "doctorPillRunning": "running",
"doctorPillStopped": "stopped", "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…", "doctorDaemonControlWorking": "Working…",
"doctorPathLog": "Log", "doctorPathLog": "Log",
"doctorPathConfig": "Config", "doctorPathConfig": "Config",
@ -1184,7 +1184,7 @@
"doctorPathModules": "Modules dir", "doctorPathModules": "Modules dir",
"doctorPathFlows": "Flows dir", "doctorPathFlows": "Flows dir",
"doctorPathPid": "PID file", "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": "Could not open: {detail}",
"@doctorOpenError": { "@doctorOpenError": {
"placeholders": { "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": { "@doctorUpdateBody": {
"placeholders": { "placeholders": {
"channel": { "channel": {
@ -1241,7 +1241,7 @@
"n8nHint": "Active n8n workflows surface as `n8n.<endpoint>.<slug>` capabilities. Configure once, see them in the Store.", "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.", "n8nEmpty": "No n8n endpoints configured. Click + to add one.",
"hubUnreachable": "Hub unreachable", "hubUnreachable": "Hub unreachable",
"hubUnreachableHint": "Start the hub with `fai serve`.", "hubUnreachableHint": "Start the hub with `chain serve`.",
"languageEnglish": "English", "languageEnglish": "English",
"languageGerman": "Deutsch", "languageGerman": "Deutsch",
"searchHint": "Jump anywhere — modules, store, flows, pages…", "searchHint": "Jump anywhere — modules, store, flows, pages…",
@ -1514,8 +1514,8 @@
"addSourceField": "URL or path to .fai bundle", "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", "addSourceHint": "https://git.flemming.ai/your-org/your-module/releases/download/v0.1.0/foo-0.1.0.fai",
"addSourceHowItWorksTitle": "How private modules work", "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):", "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": "fai install --link /path/to/module", "addSourceCliExample": "chain install --link /path/to/module",
"addSourceInstallButton": "Install", "addSourceInstallButton": "Install",
"addSourceCancel": "Cancel", "addSourceCancel": "Cancel",
"installFailed": "Install failed: {error}", "installFailed": "Install failed: {error}",
@ -1543,7 +1543,7 @@
} }
}, },
"faiBinaryNotFound": "Could not find the `fai` program on this machine.", "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…", "faiBinaryLocateButton": "Locate `fai` binary…",
"faiBinaryInstallDocsButton": "Open install guide", "faiBinaryInstallDocsButton": "Open install guide",
"faiBinaryPickerTitle": "Select the `fai` binary", "faiBinaryPickerTitle": "Select the `fai` binary",

View file

@ -101,7 +101,7 @@ abstract class AppLocalizations {
/// App-bar title in the OS task switcher. /// App-bar title in the OS task switcher.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'F∆I Studio'** /// **'Ch∆In Studio'**
String get appTitle; String get appTitle;
/// No description provided for @navWelcome. /// No description provided for @navWelcome.
@ -113,7 +113,7 @@ abstract class AppLocalizations {
/// No description provided for @welcomeHeroTitle. /// No description provided for @welcomeHeroTitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'F∆I Platform'** /// **'Ch∆In Platform'**
String get welcomeHeroTitle; String get welcomeHeroTitle;
/// No description provided for @welcomeHeroSubtitle. /// No description provided for @welcomeHeroSubtitle.
@ -419,7 +419,7 @@ abstract class AppLocalizations {
/// No description provided for @welcomeChecklistModuleHint. /// No description provided for @welcomeChecklistModuleHint.
/// ///
/// In en, this message translates to: /// 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; String get welcomeChecklistModuleHint;
/// No description provided for @welcomeChecklistFlow. /// No description provided for @welcomeChecklistFlow.
@ -1445,7 +1445,7 @@ abstract class AppLocalizations {
/// No description provided for @storeTodayDeck. /// No description provided for @storeTodayDeck.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'From the F∆I editor'** /// **'From the Ch∆In editor'**
String get storeTodayDeck; String get storeTodayDeck;
/// No description provided for @storeTodayDismissTooltip. /// No description provided for @storeTodayDismissTooltip.
@ -1991,7 +1991,7 @@ abstract class AppLocalizations {
/// No description provided for @modulesNoneHint. /// No description provided for @modulesNoneHint.
/// ///
/// In en, this message translates to: /// 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; String get modulesNoneHint;
/// No description provided for @modulesReloadTooltip. /// No description provided for @modulesReloadTooltip.
@ -2105,7 +2105,7 @@ abstract class AppLocalizations {
/// No description provided for @flowsNoneHint. /// No description provided for @flowsNoneHint.
/// ///
/// In en, this message translates to: /// 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; String get flowsNoneHint;
/// No description provided for @flowsRunDialogTitle. /// No description provided for @flowsRunDialogTitle.
@ -2615,7 +2615,7 @@ abstract class AppLocalizations {
/// No description provided for @welcomeChecklistNextModuleBody. /// No description provided for @welcomeChecklistNextModuleBody.
/// ///
/// In en, this message translates to: /// 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; String get welcomeChecklistNextModuleBody;
/// No description provided for @welcomeChecklistNextModuleButton. /// No description provided for @welcomeChecklistNextModuleButton.
@ -2831,7 +2831,7 @@ abstract class AppLocalizations {
/// No description provided for @errUnavailableHint. /// No description provided for @errUnavailableHint.
/// ///
/// In en, this message translates to: /// 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; String get errUnavailableHint;
/// No description provided for @errUnauthenticated. /// No description provided for @errUnauthenticated.
@ -3305,7 +3305,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorDaemonControlHint. /// No description provided for @doctorDaemonControlHint.
/// ///
/// In en, this message translates to: /// 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; String get doctorDaemonControlHint;
/// No description provided for @doctorDaemonControlWorking. /// No description provided for @doctorDaemonControlWorking.
@ -3353,7 +3353,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorPathsEmpty. /// No description provided for @doctorPathsEmpty.
/// ///
/// In en, this message translates to: /// 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; String get doctorPathsEmpty;
/// No description provided for @doctorOpenError. /// No description provided for @doctorOpenError.
@ -3371,7 +3371,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorUpdateBody. /// No description provided for @doctorUpdateBody.
/// ///
/// In en, this message translates to: /// 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); String doctorUpdateBody(String channel, String version);
/// No description provided for @doctorUpdateUnreachable. /// No description provided for @doctorUpdateUnreachable.
@ -3467,7 +3467,7 @@ abstract class AppLocalizations {
/// No description provided for @hubUnreachableHint. /// No description provided for @hubUnreachableHint.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Start the hub with `fai serve`.'** /// **'Start the hub with `chain serve`.'**
String get hubUnreachableHint; String get hubUnreachableHint;
/// No description provided for @languageEnglish. /// No description provided for @languageEnglish.
@ -4253,13 +4253,13 @@ abstract class AppLocalizations {
/// No description provided for @addSourceHowItWorksBody. /// No description provided for @addSourceHowItWorksBody.
/// ///
/// In en, this message translates to: /// 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; String get addSourceHowItWorksBody;
/// No description provided for @addSourceCliExample. /// No description provided for @addSourceCliExample.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'fai install --link /path/to/module'** /// **'chain install --link /path/to/module'**
String get addSourceCliExample; String get addSourceCliExample;
/// No description provided for @addSourceInstallButton. /// No description provided for @addSourceInstallButton.
@ -4337,7 +4337,7 @@ abstract class AppLocalizations {
/// No description provided for @faiBinaryNotFoundHint. /// No description provided for @faiBinaryNotFoundHint.
/// ///
/// In en, this message translates to: /// 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; String get faiBinaryNotFoundHint;
/// No description provided for @faiBinaryLocateButton. /// No description provided for @faiBinaryLocateButton.

View file

@ -9,13 +9,13 @@ class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale); AppLocalizationsDe([String locale = 'de']) : super(locale);
@override @override
String get appTitle => 'F∆I Studio'; String get appTitle => 'Ch∆In Studio';
@override @override
String get navWelcome => 'Willkommen'; String get navWelcome => 'Willkommen';
@override @override
String get welcomeHeroTitle => 'F∆I Platform'; String get welcomeHeroTitle => 'Ch∆In Platform';
@override @override
String get welcomeHeroSubtitle => String get welcomeHeroSubtitle =>
@ -196,7 +196,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get welcomeChecklistModuleHint => 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 @override
String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten'; String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten';
@ -775,7 +775,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get storeTodayBadge => 'HEUTE'; String get storeTodayBadge => 'HEUTE';
@override @override
String get storeTodayDeck => 'Von der F∆I-Redaktion'; String get storeTodayDeck => 'Von der Ch∆In-Redaktion';
@override @override
String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden'; String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden';
@ -1125,7 +1125,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get modulesNoneHint => 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 @override
String get modulesReloadTooltip => 'Aktualisieren'; String get modulesReloadTooltip => 'Aktualisieren';
@ -1193,7 +1193,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get flowsNoneHint => 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 @override
String flowsRunDialogTitle(String name) { String flowsRunDialogTitle(String name) {
@ -1497,7 +1497,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get welcomeChecklistNextModuleBody => 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 @override
String get welcomeChecklistNextModuleButton => 'Doku lesen'; String get welcomeChecklistNextModuleButton => 'Doku lesen';
@ -1635,7 +1635,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get errUnavailableHint => 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 @override
String get errUnauthenticated => 'Authentifizierung erforderlich.'; String get errUnauthenticated => 'Authentifizierung erforderlich.';
@ -1918,7 +1918,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get doctorDaemonControlHint => 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 @override
String get doctorDaemonControlWorking => 'Wird ausgeführt…'; String get doctorDaemonControlWorking => 'Wird ausgeführt…';
@ -1943,7 +1943,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get doctorPathsEmpty => 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 @override
String doctorOpenError(String detail) { String doctorOpenError(String detail) {
@ -1957,7 +1957,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String doctorUpdateBody(String channel, String version) { 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 @override
@ -2015,7 +2015,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get hubUnreachable => 'Hub nicht erreichbar'; String get hubUnreachable => 'Hub nicht erreichbar';
@override @override
String get hubUnreachableHint => 'Hub starten mit `fai serve`.'; String get hubUnreachableHint => 'Hub starten mit `chain serve`.';
@override @override
String get languageEnglish => 'English'; String get languageEnglish => 'English';
@ -2487,10 +2487,10 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get addSourceHowItWorksBody => 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 @override
String get addSourceCliExample => 'fai install --link /pfad/zum/modul'; String get addSourceCliExample => 'chain install --link /pfad/zum/modul';
@override @override
String get addSourceInstallButton => 'Installieren'; String get addSourceInstallButton => 'Installieren';
@ -2540,7 +2540,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get faiBinaryNotFoundHint => 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 @override
String get faiBinaryLocateButton => '`fai`-Programm suchen …'; String get faiBinaryLocateButton => '`fai`-Programm suchen …';

View file

@ -9,13 +9,13 @@ class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale); AppLocalizationsEn([String locale = 'en']) : super(locale);
@override @override
String get appTitle => 'F∆I Studio'; String get appTitle => 'Ch∆In Studio';
@override @override
String get navWelcome => 'Welcome'; String get navWelcome => 'Welcome';
@override @override
String get welcomeHeroTitle => 'F∆I Platform'; String get welcomeHeroTitle => 'Ch∆In Platform';
@override @override
String get welcomeHeroSubtitle => String get welcomeHeroSubtitle =>
@ -195,7 +195,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get welcomeChecklistModuleHint => 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 @override
String get welcomeChecklistFlow => 'Run a saved flow'; String get welcomeChecklistFlow => 'Run a saved flow';
@ -793,7 +793,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get storeTodayBadge => 'TODAY'; String get storeTodayBadge => 'TODAY';
@override @override
String get storeTodayDeck => 'From the F∆I editor'; String get storeTodayDeck => 'From the Ch∆In editor';
@override @override
String get storeTodayDismissTooltip => 'Hide for this session'; String get storeTodayDismissTooltip => 'Hide for this session';
@ -1140,7 +1140,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get modulesNoneHint => String get modulesNoneHint =>
'Run `fai install <capability-name>` or check ~/.fai/modules/.'; 'Run `chain install <capability-name>` or check ~/.fai/modules/.';
@override @override
String get modulesReloadTooltip => 'Reload'; String get modulesReloadTooltip => 'Reload';
@ -1208,7 +1208,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get flowsNoneHint => 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 @override
String flowsRunDialogTitle(String name) { String flowsRunDialogTitle(String name) {
@ -1508,7 +1508,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get welcomeChecklistNextModuleBody => 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 @override
String get welcomeChecklistNextModuleButton => 'Read the docs'; String get welcomeChecklistNextModuleButton => 'Read the docs';
@ -1645,7 +1645,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get errUnavailableHint => 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 @override
String get errUnauthenticated => 'Authentication required.'; String get errUnauthenticated => 'Authentication required.';
@ -1927,7 +1927,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get doctorDaemonControlHint => 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 @override
String get doctorDaemonControlWorking => 'Working…'; String get doctorDaemonControlWorking => 'Working…';
@ -1952,7 +1952,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get doctorPathsEmpty => 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 @override
String doctorOpenError(String detail) { String doctorOpenError(String detail) {
@ -1966,7 +1966,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String doctorUpdateBody(String channel, String version) { 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 @override
@ -2022,7 +2022,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get hubUnreachable => 'Hub unreachable'; String get hubUnreachable => 'Hub unreachable';
@override @override
String get hubUnreachableHint => 'Start the hub with `fai serve`.'; String get hubUnreachableHint => 'Start the hub with `chain serve`.';
@override @override
String get languageEnglish => 'English'; String get languageEnglish => 'English';
@ -2491,10 +2491,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get addSourceHowItWorksBody => 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 @override
String get addSourceCliExample => 'fai install --link /path/to/module'; String get addSourceCliExample => 'chain install --link /path/to/module';
@override @override
String get addSourceInstallButton => 'Install'; String get addSourceInstallButton => 'Install';
@ -2543,7 +2543,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get faiBinaryNotFoundHint => 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 @override
String get faiBinaryLocateButton => 'Locate `fai` binary…'; 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. // Visual language: warm minimalism / deep tech with soul.
// Tokens in lib/theme/, primitives in lib/widgets/. // Tokens in lib/theme/, primitives in lib/widgets/.
@ -215,7 +215,7 @@ class StudioAppState extends State<StudioApp> {
builder: (context, snap) { builder: (context, snap) {
final p = snap.data ?? (light: null, dark: null); final p = snap.data ?? (light: null, dark: null);
return MaterialApp( return MaterialApp(
title: 'F∆I Studio', title: 'Ch∆In Studio',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: p.light ?? FaiTheme.light(), theme: p.light ?? FaiTheme.light(),
darkTheme: p.dark ?? FaiTheme.dark(), darkTheme: p.dark ?? FaiTheme.dark(),
@ -1072,7 +1072,7 @@ class _BrandLabel extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const Text( const Text(
'F∆I Studio', 'Ch∆In Studio',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600), style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,

View file

@ -526,7 +526,7 @@ class _EventDetailDialogState extends State<_EventDetailDialog> {
String _buildPrompt(AuditEvent e, String mode) { String _buildPrompt(AuditEvent e, String mode) {
// Privacy: redacted = no detail JSON, full = include it. // Privacy: redacted = no detail JSON, full = include it.
final buf = StringBuffer() 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('happened in plain language and suggest one concrete')
..writeln('fix the operator can apply now.') ..writeln('fix the operator can apply now.')
..writeln() ..writeln()

View file

@ -481,7 +481,7 @@ class _PathRow extends StatelessWidget {
/// Daemon control affordances: Restart, Apply update, Stop. /// Daemon control affordances: Restart, Apply update, Stop.
/// Each shells out to the `fai` binary (resolved via PATH or /// 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. /// the supervisor logic so the daemon and CLI stay in lockstep.
class _DaemonActionsCard extends StatefulWidget { class _DaemonActionsCard extends StatefulWidget {
@override @override

View file

@ -1405,7 +1405,7 @@ String _buildAiSearchPrompt(
String locale, String locale,
) { ) {
final lang = locale == 'de' ? 'German' : 'English'; 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" "$query"
@ -3009,9 +3009,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Plug in any MCP server', titleEn: 'Plug in any MCP server',
titleDe: 'Jeden MCP-Server einbinden', titleDe: 'Jeden MCP-Server einbinden',
bodyEn: 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: 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', ctaLabelEn: 'Browse suggested sources',
ctaLabelDe: 'Empfohlene Quellen ansehen', ctaLabelDe: 'Empfohlene Quellen ansehen',
icon: Icons.hub_outlined, icon: Icons.hub_outlined,
@ -3053,9 +3053,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Extract, anonymise, translate, summarise', titleEn: 'Extract, anonymise, translate, summarise',
titleDe: 'Extrahieren, anonymisieren, übersetzen, zusammenfassen', titleDe: 'Extrahieren, anonymisieren, übersetzen, zusammenfassen',
bodyEn: 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: 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', ctaLabelEn: 'Show text modules',
ctaLabelDe: 'Text-Module zeigen', ctaLabelDe: 'Text-Module zeigen',
icon: Icons.article_outlined, icon: Icons.article_outlined,
@ -3068,9 +3068,9 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
titleEn: 'Every module declares its permissions', titleEn: 'Every module declares its permissions',
titleDe: 'Jedes Modul deklariert seine Berechtigungen', titleDe: 'Jedes Modul deklariert seine Berechtigungen',
bodyEn: 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: 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', ctaLabelEn: 'Review permissions',
ctaLabelDe: 'Berechtigungen prüfen', ctaLabelDe: 'Berechtigungen prüfen',
icon: Icons.shield_outlined, icon: Icons.shield_outlined,
@ -3093,12 +3093,12 @@ const List<TodayStoryData> _kFallbackTodayStories = <TodayStoryData>[
TodayStoryData( TodayStoryData(
badgeEn: 'TEST FIRST', badgeEn: 'TEST FIRST',
badgeDe: 'ZUERST TESTEN', badgeDe: 'ZUERST TESTEN',
titleEn: 'fai doctor — diagnose before you ship', titleEn: 'chain doctor — diagnose before you ship',
titleDe: 'fai doctor — diagnostizieren bevor ausgerollt wird', titleDe: 'chain doctor — diagnostizieren bevor ausgerollt wird',
bodyEn: 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: 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: '', ctaLabelEn: '',
ctaLabelDe: '', ctaLabelDe: '',
icon: Icons.health_and_safety_outlined, icon: Icons.health_and_safety_outlined,

View file

@ -1,5 +1,5 @@
// Welcome first surface a new operator sees, default sidebar // 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 // three concepts, the trust posture. No live data, no
// federation chrome that's the Store's role. // federation chrome that's the Store's role.
// //
@ -1140,7 +1140,7 @@ class _DocReaderError {
'Tried: ${attempted.join(", ")}\n' 'Tried: ${attempted.join(", ")}\n'
'Underlying: $underlying\n' 'Underlying: $underlying\n'
'This typically means the Studio binary on disk is from\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.'; '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 // One file, semantic names, no magic numbers in the rest of the
// codebase. Both light and dark modes derive from these tokens. // codebase. Both light and dark modes derive from these tokens.
import 'package:flutter/material.dart'; 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. /// greys. Status colours stay restrained no candy palette.
class FaiColors { class FaiColors {
FaiColors._(); FaiColors._();

View file

@ -1,5 +1,5 @@
// FaiCard flat card with subtle accent gradient on the top // 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'; 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: // () drawn from primitives, not a font glyph. Three states:
// //
// - idle: static, accent colour, soft glow // - idle: static, accent colour, soft glow

View file

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

View file

@ -1013,7 +1013,7 @@ class McpClientDraft {
/// MCP-clients panel shows every configured server with its /// MCP-clients panel shows every configured server with its
/// last-discovery health, plus Add / Remove / Refresh actions. /// last-discovery health, plus Add / Remove / Refresh actions.
/// Configure a server here, the store gains synthetic /// 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. /// on the CLI.
class _McpClientsPanel extends StatelessWidget { class _McpClientsPanel extends StatelessWidget {
final List<McpClientInfo> clients; final List<McpClientInfo> clients;
@ -1669,7 +1669,7 @@ class _ThemePluginPanel extends StatelessWidget {
} }
/// Hub maintenance panel currently one action: reset operator /// 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 /// so the everyday config controls aren't crowded by a destructive
/// button. The reset itself is gated by an interactive confirm /// button. The reset itself is gated by an interactive confirm
/// dialog before the CLI is invoked. /// 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 /// round-trip; works for Ollama tags (`gemma3:4b`), OpenAI names
/// (`gpt-4o-mini`), Anthropic-style (`claude-haiku-4-5`). /// (`gpt-4o-mini`), Anthropic-style (`claude-haiku-4-5`).
enum _Suitability { enum _Suitability {
recommended, // tested with FI System AI recommended, // tested with ChIn System AI
balanced, // 4-8B params or known-good cloud model balanced, // 4-8B params or known-good cloud model
small, // <4B params; quality may be insufficient small, // <4B params; quality may be insufficient
large, // 9-15B; slower but ok 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 // Pages should `import '../widgets/widgets.dart';` and use the
// primitives directly no Material `Card` / generic `Container` // primitives directly no Material `Card` / generic `Container`

View file

@ -1,5 +1,5 @@
name: fai_studio name: fai_studio
description: "F∆I Studio — desktop GUI for the F∆I hub" description: "Ch∆In Studio — desktop GUI for the Ch∆In hub"
publish_to: 'none' publish_to: 'none'
version: 0.70.0 version: 0.70.0

View file

@ -1,6 +1,6 @@
# Integration tests # Integration tests
These tests spin up a real `fai serve` subprocess against a These tests spin up a real `chain serve` subprocess against a
fresh temp dir and exercise Studio's Hub-facing data layer fresh temp dir and exercise Studio's Hub-facing data layer
against it. They cover the "kind of regression that survives against it. They cover the "kind of regression that survives
unit tests because the system-shape only manifests across the unit tests because the system-shape only manifests across the
@ -48,15 +48,15 @@ cargo build --release --bin fai
### First-time-start gotcha ### First-time-start gotcha
A cold `fai serve` spends its first ~30s building the A cold `chain serve` spends its first ~30s building the
curated-model database and initialising SQLite migrations. curated-model database and initialising SQLite migrations.
`HubFixture.start()` waits up to 60s by default; if your local `HubFixture.start()` waits up to 60s by default; if your local
hub takes longer the first time, run `fai serve` once by hand hub takes longer the first time, run `chain serve` once by hand
against any temp `FAI_DATA_DIR` to warm the per-user cargo / against any temp `FAI_DATA_DIR` to warm the per-user cargo /
SBOM caches: SBOM caches:
```bash ```bash
FAI_DATA_DIR=/tmp/fai_warmup fai serve --bind 127.0.0.1:0 FAI_DATA_DIR=/tmp/fai_warmup chain serve --bind 127.0.0.1:0
# wait for "hub started", Ctrl-C # wait for "hub started", Ctrl-C
``` ```

View file

@ -62,7 +62,7 @@ or `generate`; the script auto-detects from the URL path.
## Trust model ## Trust model
- Reads only `git log`, `git diff`, and the bundled `seed.yaml` of - Reads only `git log`, `git diff`, and the bundled `seed.yaml` of
installed F∆I monorepos. Never your audit log without explicit op-in. installed Ch∆In monorepos. Never your audit log without explicit op-in.
- Calls only the System-AI you've already configured for Studio. The same - Calls only the System-AI you've already configured for Studio. The same
privacy mode you set there applies here. privacy mode you set there applies here.
- Writes only into `~/.fai/today/`. Nothing in `~/.fai/data/` or - Writes only into `~/.fai/today/`. Nothing in `~/.fai/data/` or

View file

@ -1,11 +1,11 @@
You are the Today-tab editor for the F∆I Platform Studio store. You are the Today-tab editor for the Ch∆In Platform Studio store.
Your job is to draft ONE editorial story per run that the platform's Your job is to draft ONE editorial story per run that the platform's
solo developer (Stefan Flemming) will review and either accept or solo developer (Stefan Flemming) will review and either accept or
discard. discard.
## Project identity (do not deviate) ## Project identity (do not deviate)
F∆I Platform is a deterministic workflow engine for AI-assisted Ch∆In Platform is a deterministic workflow engine for AI-assisted
document processing in regulated environments. It runs WASM modules document processing in regulated environments. It runs WASM modules
inside YAML flows, with sandbox-secure capability discovery. inside YAML flows, with sandbox-secure capability discovery.
@ -68,7 +68,7 @@ cta_label_de: <≤5 words. Required when cta != none.>
## Signal input ## Signal input
Below is the "what happened in F∆I in the last 24 hours" summary — Below is the "what happened in Ch∆In in the last 24 hours" summary —
git log entries, store-index changes, audit-log highlights. Pick the git log entries, store-index changes, audit-log highlights. Pick the
ONE most operator-relevant thread and tell its story. If nothing ONE most operator-relevant thread and tell its story. If nothing
notable happened, surface a longer-arc theme (recent week's progress, notable happened, surface a longer-arc theme (recent week's progress,