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

211 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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