chain-studio/CHANGELOG.md
flemming-it b7468dc7ec
Some checks failed
Security / Security check (push) Failing after 1s
feat: sealed-area connection switch + identity bar (multi-project stage 3)
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.

While in a sealed area an identity bar 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. Selecting a shared project from inside an area
switches the connection back first. The sealed connection is never
persisted across restarts.

New: SealedAreaService (manifest + PID discovery), Workspace sealed
switch logic, ChainSealedIdentityBar, SystemActions.chainProjectStart.
l10n DE+EN. flutter analyze clean; 33 tests green (switcher lists sealed
with lock+status, pill shows active area, identity bar renders in the
area colour). Runtime plumbing (discovery, start, endpoint, reach)
verified headlessly against real sealed instances under a redirected
HOME; the identity-bar screenshot is deferred (display click-automation
failed after sleep on the shared desktop — an environment issue, not a
code gap; the visible components are widget-tested).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-12 17:31:39 +02:00

9.1 KiB
Raw Blame History

Changelog

All notable changes to chain_studio recorded here. Pubspec version + kStudioVersion in lib/main.dart stay in lockstep.

Unreleased

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 " 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.