integration_test/guide_shots_test.dart boots a hermetic hub
(HubFixture), seeds demo projects (open Bürgeramt; sealed
Ratsinformation and a setup.applied audit event only when the
runner confirms an isolated $HOME), launches the app in German +
dark mode, walks every sidebar page in Cmd order with
content-aware waits, opens the workspace switcher and the setup
wizard, and writes the guide PNGs via a driverless RepaintBoundary
capture. Driven by the platform repo's scripts/regen-studio-guide.sh.
Also fixes the hub fixture's binary resolution, dead since the
rename (it looked for 'fai' and ../chain_platform/): now $CHAIN_BIN,
'chain' on PATH, then ../fai_chain/target/{release,debug}/chain —
the integration tests actually run again instead of silently
skipping.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
248 lines
11 KiB
Markdown
248 lines
11 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to `chain_studio` recorded here. Pubspec
|
||
version + `kStudioVersion` in `lib/main.dart` stay in lockstep.
|
||
|
||
## Unreleased
|
||
|
||
### Added (guided setup on grade-1 — steps A4/A5/B1 + doc automation)
|
||
|
||
- **Clickable next steps.** After apply, the wizard renders real
|
||
Studio actions instead of CLI text: start-hub button (polls until
|
||
the daemon answers), per-module install buttons with progress/done
|
||
states (capability-name install via the hub's store index), and an
|
||
open-the-starter-flow button navigating to Flows.
|
||
- **Signature dead end resolved.** Regulated plans explain in plain
|
||
language that modules come from a signed source; the preview offers
|
||
"allow installing from the public store" as one deliberate,
|
||
reversible switch (`allow_unsigned_modules`) that re-assembles the
|
||
plan. Air-gapped plans point to the offline-bundle path instead.
|
||
- **Fresh-install auto-open + honest framing.** On a fresh hub (no
|
||
config, no `setup-plan.yaml`) the wizard opens by itself, once per
|
||
run; the welcome CTA is now "In 3 Fragen loslegen" / "Get started
|
||
in 3 questions". After the wizard closes, the onboarding checklist
|
||
re-probes and states what the assistant already covered (applied
|
||
profile from `setup-plan.yaml`).
|
||
- **Free-text AI path (phase 1.2).** "Or just describe what you want
|
||
to do": the goal goes to the configured system AI, the reply is
|
||
validated against strict enum whitelists and comes back as an
|
||
editable "this is how I read your task" reflection feeding the same
|
||
preview/apply. Privacy line states local vs. provider processing;
|
||
without a system AI the menu path stands alone.
|
||
- **Nav manifest guard.** `test/nav_manifest_test.dart` generates
|
||
`docs/nav.generated.json` from the sidebar truth (ids, order = Cmd
|
||
numbers, DE+EN labels); the platform repo checks the operator guide
|
||
against the mirrored copy.
|
||
- **Guide screenshot harness.** `integration_test/guide_shots_test.dart`
|
||
boots a hermetic hub, seeds demo projects, walks every nav page,
|
||
the workspace switcher and the setup wizard, and writes the guide
|
||
PNGs — driven by the platform repo's `scripts/regen-studio-guide.sh`.
|
||
- **Fixed:** the integration-test hub fixture still looked for the
|
||
pre-rename `fai` binary and `chain_platform/` path, so its tests
|
||
silently skipped since the rename; it now resolves `$CHAIN_BIN`,
|
||
`chain` on PATH, and `../fai_chain/target/{release,debug}/chain`.
|
||
|
||
### Added (multi-project, stage ③ — sealed areas)
|
||
|
||
- **Sealed-area connection switch.** The workspace switcher now lists
|
||
the operator's sealed areas (read from `~/.chain/sealed/` manifests,
|
||
the same source the CLI uses) below the shared projects, each with a
|
||
lock icon and a running/stopped status. Selecting one is a real
|
||
connection switch: Studio reconnects its hub client to the area's own
|
||
port with a full state reload — one window, one truth. A stopped area
|
||
is started first (`chain project start`) with a visible notice; a
|
||
failure surfaces as a copyable error and rolls back to the shared hub.
|
||
- **Identity bar.** While connected to a sealed area, a strip under the
|
||
AppBar is painted in the area's accent colour and names it, with a
|
||
one-click *Leave* back to the shared hub. The area colour is marking,
|
||
not theming — Studio's blue stays the app accent. (The window-title
|
||
tint is a small follow-up; the identity bar is the primary signal.)
|
||
- Selecting a shared project or "All projects" from inside a sealed area
|
||
switches the connection back to the shared hub first. The sealed
|
||
connection is never persisted across restarts — Studio always launches
|
||
on the shared hub and the operator re-enters an area deliberately.
|
||
|
||
### Added (detached-runs monitor — T3 parity)
|
||
|
||
- **Runs page.** A new sidebar destination lists detached invocations
|
||
(submitted with `detach: true`) with their phase, current step,
|
||
project and a **Cancel** button while pending/running. Workspace-
|
||
scoped like Audit and Approvals; polls every 2 s. Detached runs are
|
||
opt-in (`detached.enabled`), so the empty state explains how to turn
|
||
them on. Inline help doc (DE+EN). Backed by the SDK's
|
||
`listInvocations()` + `cancelInvocation()`.
|
||
|
||
### Added (multi-project, stages ① + ②)
|
||
|
||
- **Workspace switcher.** The Audit and Approvals AppBars carry a
|
||
workspace control listing the hub's project registry (colour dot per
|
||
project, a shield for `protected`, an honesty tooltip). "All projects"
|
||
stays reachable — a filter, not a jail. The selection is persisted and
|
||
shared across pages; it re-scopes the audit list AND live stream
|
||
hub-side, scopes approvals (pending + history), and drives the sidebar
|
||
approval badge. Runs launched from the editor are stamped with the
|
||
active workspace — unless the flow file declares its own `project:`,
|
||
in which case the file wins (CLI semantics).
|
||
- **Editor project chip + file-wins guard.** A flow file's own
|
||
`project:` shows as a chip; on mismatch with the active workspace an
|
||
amber pill offers a one-click switch (the file still wins for the run).
|
||
Backed by editor package 0.22.0.
|
||
|
||
### Fixed (usertest 2026-07-10 findings)
|
||
|
||
- **Approval prompts localize.** An approval whose flow step gave no
|
||
`prompt:` (and legacy rows carrying the hub's old baked-in English
|
||
sentence) now renders the localized fallback "Freigabe für diesen
|
||
Schritt erforderlich" / "Approval required for this step" — no more
|
||
English inside the German approvals UI.
|
||
- **Approving without review data asks first.** When the approval step
|
||
attached no `show:` payload, "Freigeben" opens a calm confirmation
|
||
("Ohne Prüfdaten freigeben?") explaining that the flow deliberately
|
||
attached no data, with an explicit "Trotzdem freigeben".
|
||
- **Studio error log moved to `~/.chain/logs/`.** Writes went to the
|
||
pre-rename `~/.fai/logs/studio-errors.log` while the Doctor page and
|
||
`chain doctor` read `~/.chain/…`. Studio now writes to `.chain` and
|
||
migrates the old file (+ rotation sibling) over once.
|
||
- **Honest audit wording (legal review).** DE strings no longer claim
|
||
"manipulationssicher" — the audit log is *manipulationserkennend*
|
||
(tamper-evident); "warum WORM-1 für KRITIS reicht" became a neutral
|
||
what-it-does-and-does-not sentence (EN too); the Doctor chain pill
|
||
says "Integritätskette v1" instead of "WORM-1"; the federation
|
||
enrollment hint says the CA *authenticates* the first connect.
|
||
- **WCAG-AA secondary text on dark.** De-emphasised text was 3.7:1 on
|
||
cards; the muted token is now ≥ 4.5:1 against canvas, cards and
|
||
elevated surfaces.
|
||
|
||
### Added
|
||
|
||
- **Live audit feed.** The Audit page subscribes to `streamEvents` and
|
||
refreshes instantly on each new event (debounced); the 2 s poll stays
|
||
as the safety net and re-subscribes after a clean stream close.
|
||
- **Channel switcher in the sidebar.** The active-channel pill (and the
|
||
collapsed chip) is now click-to-switch: a menu of every channel with
|
||
its running state + a check on the active one; switching writes
|
||
`~/.chain/current-channel`, restarts that channel's daemon, and Studio
|
||
repoints to it.
|
||
- **Module-store manager is prominent + bilingual.** The store page
|
||
gains a labelled "Add store" button (was a bare icon) opening a fully
|
||
localized dialog: configured stores, a curated **Suggested stores**
|
||
shelf with one-click add/remove (probed for reachability — shows "not
|
||
available yet" until a store's index is published), and an optional
|
||
per-store **pinned public key** field.
|
||
- **Approval payload clarity.** The approval card always shows the
|
||
payload section: a present payload scrolls inside a height-capped
|
||
copyable box; an absent one explains that the flow's approval step
|
||
chooses what to surface via its `show:` field.
|
||
|
||
### Fixed
|
||
|
||
- **Errors are copyable everywhere.** System-AI test-connection, the
|
||
Settings dialog, and the Audit status bar rendered failures as
|
||
non-copyable text; all now route through `ChainErrorBox` /
|
||
`SelectableText`.
|
||
- **Filter dialog crash** on the store page — a `Spacer` inside
|
||
`AlertDialog.actions` (an `OverflowBar`, not a Flex) threw; the
|
||
buttons now sit in a `Row`.
|
||
- **Welcome docs grid** tidied into equal-height paired rows.
|
||
- **Approval card** leads with the human prompt; the `flow › step` id is
|
||
demoted to a metadata line.
|
||
- **Pulsing sidebar connection dot** restored when connected.
|
||
|
||
## 0.70.0 — 2026-06-13
|
||
|
||
### Added
|
||
|
||
- **Federation panel.** A new "Föderation" destination shows the
|
||
satellites connected to this hub (name, region, version, wire
|
||
version, advertised capabilities) and adds them in one step: press
|
||
**Add satellite**, name it, and the hub issues a single-use
|
||
bootstrap token bundled with its CA as a ready-to-paste satellite
|
||
config — the bundled CA makes the satellite's first connect
|
||
tamper-proof. Localized (EN + DE) with an in-app help doc. Backed
|
||
by new `HubClient.listSatellites` / `issueBootstrapToken` in the
|
||
Dart SDK.
|
||
|
||
## 0.68.0 — 2026-06-09
|
||
|
||
### Added
|
||
|
||
- **Inline approval driver**. `StudioFlowRunDriver` implements
|
||
the three new methods the editor 0.21.0 introduced
|
||
(`pendingApprovalIdForStep`, `approveApproval`,
|
||
`rejectApproval`) — all delegate to the existing
|
||
`HubService` approvals RPCs. End result: the Run tab now
|
||
hosts a complete Approve / Reject form inline, removing the
|
||
tab-switch detour to the standalone Approvals page.
|
||
|
||
## 0.67.0 — 2026-06-09
|
||
|
||
### Added
|
||
|
||
- **Inline help icons** in the Approvals, Audit, and Doctor
|
||
app-bars open the matching bundled doc in the existing
|
||
bottom-sheet reader via the new public helper
|
||
`showFaiDoc(BuildContext, slug)` exported from `welcome.dart`.
|
||
- **New `assets/docs/approvals.md`** (+ `_de.md`) explains the
|
||
approval concept end-to-end with a YAML example.
|
||
- **friendlyError hub-pattern matching**. Six hub-specific
|
||
failure shapes (approval rejected / timed out, output too
|
||
large, host service not declared, missing value reference,
|
||
MCP unreachable) get specific localised headlines + hints
|
||
before falling through to the gRPC-code default. Five new
|
||
test cases pin the matchers.
|
||
|
||
### Changed
|
||
|
||
- **Settings dialog sidebar fully localised** (Allgemein /
|
||
Darstellung / System-KI / Integrationen / Sicherheit /
|
||
Wartung). Per-panel titles + descriptions also.
|
||
- **Daemon action labels localised**: `enable autostart`,
|
||
`disable autostart`, restart / start / stop / status + the
|
||
OK / Failed result line.
|
||
|
||
## 0.66.0 — 2026-06-08
|
||
|
||
### Added
|
||
|
||
- **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 + `chain install --link`
|
||
example.
|
||
- **Store catalogue** passed to the flow editor so the
|
||
analyzer can decide between Install (in store) and Add
|
||
source (not in store).
|
||
|
||
## 0.65.x
|
||
|
||
- Editor 0.18.0 pickup; analyzer-error block on Run;
|
||
diagnostic strip persistence across tabs.
|
||
|
||
## 0.64.0 — 2026-06-08
|
||
|
||
### Added
|
||
|
||
- **Flow editor quick-fix install handler**.
|
||
`_onInstallCapability` wires the editor's "Install <cap>"
|
||
button to `HubService.installModule` and refreshes the
|
||
capability list on success.
|
||
|
||
## 0.63.0 — 2026-06-04
|
||
|
||
### Changed
|
||
|
||
- **Settings dialog refactored** from one 800-line vertical
|
||
scroll into a macOS-style sidebar with six categories.
|
||
|
||
## 0.62.x — 2026-06-03
|
||
|
||
### Added
|
||
|
||
- **`FaiLog` + central error helpers** (`showFaiErrorSnack`,
|
||
`showFaiErrorDialog`).
|
||
- **Inline `FaiLogViewer`** modal for tail-viewing log files.
|
||
- **Today CTAs** in the Store carousel actually re-run search
|
||
after a `filterCategory` / `runQuery` story.
|
||
|
||
## 0.61.x and earlier
|
||
|
||
See git log.
|