refactor(brand): rename F∆I -> Ch∆In + hub binary fai -> chain
Some checks failed
Security / Security check (push) Failing after 2s
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:
parent
a0007b9178
commit
7ff4fda2a3
36 changed files with 141 additions and 141 deletions
|
|
@ -61,7 +61,7 @@ version + `kStudioVersion` in `lib/main.dart` stay in lockstep.
|
|||
|
||||
- **Add-module-source dialog** for private modules that
|
||||
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.
|
||||
- **Store catalogue** passed to the flow editor so the
|
||||
analyzer can decide between Install (in store) and Add
|
||||
|
|
|
|||
|
|
@ -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
|
||||
local or remote `fai serve` over gRPC.
|
||||
local or remote `chain serve` over gRPC.
|
||||
|
||||
> **Status (2026-05-05):** MVP scaffold. Three pages with mock
|
||||
> data, no live gRPC connection yet. Validates the visual
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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**.
|
||||
|
||||
**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.
|
||||
- No external database. SQLite ships with the hub.
|
||||
- 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
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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**.
|
||||
|
||||
**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.
|
||||
- Keine externe Datenbank. SQLite kommt mit dem Hub.
|
||||
- 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
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ WORM-1 is our first WORM (write-once-read-many) tier:
|
|||
beta / production channels.
|
||||
- **Tamper-evident**: the chain reveals any retroactive edit.
|
||||
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
|
||||
external WORM sink needed.
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ WORM sink) are roadmap items, not yet shipped.
|
|||
If you want to verify outside Studio:
|
||||
|
||||
```bash
|
||||
fai admin verify-events
|
||||
chain admin verify-events
|
||||
# Prints "Hash chain intact: N events verified" or names the
|
||||
# first event whose hash mismatches.
|
||||
```
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ WORM-1 ist unsere erste WORM-Stufe (write-once-read-many):
|
|||
beta-/production-Kanälen verweigert.
|
||||
- **Manipulationssicher**: Die Kette zeigt jede nachträgliche
|
||||
Ä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
|
||||
externe WORM-Senke nötig.
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ WORM-Senke) sind Roadmap-Punkte, noch nicht ausgeliefert.
|
|||
Wer außerhalb von Studio verifizieren will:
|
||||
|
||||
```bash
|
||||
fai admin verify-events
|
||||
chain admin verify-events
|
||||
# Druckt „Hash-Kette intakt: N Events verifiziert" oder nennt
|
||||
# das erste Event, dessen Hash nicht passt.
|
||||
```
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ outputs:
|
|||
greeting: "{{ steps.greet.outputs.payload }}"
|
||||
```
|
||||
|
||||
`fai run flows/hello.yaml --input name=World` produces:
|
||||
`chain run flows/hello.yaml --input name=World` produces:
|
||||
|
||||
```json
|
||||
{ "greeting": "Hello, World" }
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ outputs:
|
|||
greeting: "{{ steps.greet.outputs.payload }}"
|
||||
```
|
||||
|
||||
`fai run flows/hello.yaml --input name=Welt` ergibt:
|
||||
`chain run flows/hello.yaml --input name=Welt` ergibt:
|
||||
|
||||
```json
|
||||
{ "greeting": "Hallo, Welt" }
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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
|
||||
declares in its `module.yaml` — and nothing else.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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
|
||||
seiner `module.yaml` deklariert — und sonst nichts.
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ content:
|
|||
store / federation items the operator can act on.
|
||||
- **Architecture education**: "every module is sandboxed",
|
||||
"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
|
||||
launch and stays available afterwards as a reference.
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ returning operators can come back any time.
|
|||
├──────────────────────────────────────────────────────────┤
|
||||
│ ┌────────────────────────────────────────────────────┐ │
|
||||
│ │ HERO │ │
|
||||
│ │ F∆I Platform │ │
|
||||
│ │ Ch∆In Platform │ │
|
||||
│ │ Deterministic workflow engine for AI-assisted │ │
|
||||
│ │ document processing in regulated environments. │ │
|
||||
│ └────────────────────────────────────────────────────┘ │
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ The prompt template (`tools/today/prompt.template.md`) hard-encodes:
|
|||
## Out of scope (Phase 0.5)
|
||||
|
||||
- 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.
|
||||
- Auto-publication to git (operator-curated boundary stays manual).
|
||||
- Hub-served stories. Studio reads `~/.fai/today/active.yaml` directly
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 F∆I platform. Opened
|
||||
/// Getting-started / install guide for the Ch∆In 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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 …';
|
||||
|
|
|
|||
|
|
@ -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…';
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// F∆I Studio — desktop GUI for the F∆I hub.
|
||||
// Ch∆In Studio — desktop GUI for the Ch∆In 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,
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// Welcome — first surface a new operator sees, default sidebar
|
||||
// destination on launch. Pure introduction: what F∆I is, the
|
||||
// destination on launch. Pure introduction: what Ch∆In 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.';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
// Design tokens for F∆I Studio.
|
||||
// Design tokens for Ch∆In 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 (F∆I Cyan) plus neutral
|
||||
/// Colour palette. Single strong accent (Ch∆In Cyan) plus neutral
|
||||
/// greys. Status colours stay restrained — no candy palette.
|
||||
class FaiColors {
|
||||
FaiColors._();
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// FaiDeltaMark — the F∆I signature element. A precise triangle
|
||||
// FaiDeltaMark — the Ch∆In signature element. A precise triangle
|
||||
// (∆) drawn from primitives, not a font glyph. Three states:
|
||||
//
|
||||
// - idle: static, accent colour, soft glow
|
||||
|
|
|
|||
|
|
@ -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 F∆I delta (∆)
|
||||
// so this state is deliberately *designed*: the Ch∆In 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 F∆I signature, never a bare icon.
|
||||
// still carries the Ch∆In signature, never a bare icon.
|
||||
SizedBox(
|
||||
width: 112,
|
||||
height: 112,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 F∆I System AI
|
||||
recommended, // tested with Ch∆In System AI
|
||||
balanced, // 4-8B params or known-good cloud model
|
||||
small, // <4B params; quality may be insufficient
|
||||
large, // 9-15B; slower but ok
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Barrel file for the F∆I Studio widget library.
|
||||
// Barrel file for the Ch∆In Studio widget library.
|
||||
//
|
||||
// Pages should `import '../widgets/widgets.dart';` and use the
|
||||
// primitives directly — no Material `Card` / generic `Container`
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
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'
|
||||
version: 0.70.0
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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
|
||||
against it. They cover the "kind of regression that survives
|
||||
unit tests because the system-shape only manifests across the
|
||||
|
|
@ -48,15 +48,15 @@ cargo build --release --bin fai
|
|||
|
||||
### 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.
|
||||
`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 /
|
||||
SBOM caches:
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ or `generate`; the script auto-detects from the URL path.
|
|||
## Trust model
|
||||
|
||||
- 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
|
||||
privacy mode you set there applies here.
|
||||
- Writes only into `~/.fai/today/`. Nothing in `~/.fai/data/` or
|
||||
|
|
|
|||
|
|
@ -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
|
||||
solo developer (Stefan Flemming) will review and either accept or
|
||||
discard.
|
||||
|
||||
## 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
|
||||
inside YAML flows, with sandbox-secure capability discovery.
|
||||
|
||||
|
|
@ -68,7 +68,7 @@ cta_label_de: <≤5 words. Required when cta != none.>
|
|||
|
||||
## 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
|
||||
ONE most operator-relevant thread and tell its story. If nothing
|
||||
notable happened, surface a longer-arc theme (recent week's progress,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue