The Example chip used to come from a client-side content-marker scan that had drifted from the hub's renamed sample header — no current sample matched it. The host now passes the hub-reported sample set (FlowSummary.sample) and the editor renders truth only: no host info, no chips. Samples collapse under one 'Examples (N)' group below the operator's own flows (expanded only when nothing else exists), and an optional onImportSamples action on the empty list is the deliberate way to pull the bundled examples into a sealed area's empty hub. Guard: flow_list_samples_test pins chips-from-host-only, the grouping, and the import round trip. Signed-off-by: flemming-it <sf@flemming.it>
249 lines
9.7 KiB
Markdown
249 lines
9.7 KiB
Markdown
# Changelog
|
||
|
||
## 0.26.0
|
||
|
||
Sample flows follow the hub's wire flag (sealed-areas rework):
|
||
|
||
- **`FlowEditorPage.sampleFlowNames`** — the host passes the set of
|
||
flow names the hub reports as bundled samples
|
||
(`FlowSummary.sample`). This is now the ONLY source of the
|
||
"Example" chip; the editor's own content-marker scan is gone (it
|
||
had silently drifted from the hub's renamed sample header and
|
||
missed every current sample). Null = no host info = no chips.
|
||
- **Examples group.** Sample flows collapse under one
|
||
"Examples (N)" row below the operator's own flows, expanded on
|
||
demand — or by default when there is nothing else to show.
|
||
- **`FlowEditorPage.onImportSamples`** — optional empty-list action
|
||
("Import example flows"); sealed areas start without samples, so
|
||
hosts wire this as the deliberate pull. The list refreshes itself
|
||
after the import.
|
||
- `FaiEmptyState` gained an optional `action` slot.
|
||
- The editor reloads its file list when the host changes `flowsDir`
|
||
or delivers the sample set after an async fetch.
|
||
|
||
## 0.25.0
|
||
|
||
Honest install badge — the flow list and analyzer only offer
|
||
"Install" for capabilities a configured store can actually resolve:
|
||
|
||
- **Store-resolvability split in the flow list.** Missing
|
||
capabilities are classified BEFORE any click: store-resolvable
|
||
ones keep the amber chip + Install link (which now installs only
|
||
those), the rest render a quiet "not in store" chip whose tooltip
|
||
explains the three recovery paths (local install via
|
||
`chain install --link`, adding the providing store, configuring
|
||
the MCP/n8n integration). Previously the Install action covered
|
||
every missing capability and could end in the hub's
|
||
"no store entry for '<name>'" error.
|
||
- New host contract: `_FileList` consumes the host's
|
||
`storeCapabilities` (already exposed on `FlowEditorPage`) for the
|
||
split; hosts should pass only capabilities the store can install
|
||
(installable status, native kind).
|
||
- **Analyzer not-in-store message** now names all three recovery
|
||
paths instead of only the local-install hint (EN + DE).
|
||
|
||
Project separation in the flow list:
|
||
|
||
- **Workspace filter.** The file list filters by the host's
|
||
`activeProject`; flows without a `project:` key count as
|
||
`general` (display semantics — the file stays the truth and is
|
||
never rewritten). A project with no flows gets its own honest
|
||
empty state naming the project and the way out.
|
||
- **New flows are stamped** with the active project's `project:`
|
||
key (`general` and "all projects" stay unstamped — no key
|
||
already means general).
|
||
- **`toolbarTrailing` slot** on `FlowEditorPage`: the host can
|
||
place its workspace switcher in the editor's single toolbar.
|
||
- **`flowsDir` injection** on `FlowEditorPage`: tests (and other
|
||
hosts) point the editor at any directory instead of the
|
||
hard-wired `~/.chain/data/flows` — the new widget tests run
|
||
against a temp dir, never the operator's flows.
|
||
|
||
Disturbance hardening:
|
||
|
||
- **Unknown ≠ absent.** `storeCapabilities` is nullable now
|
||
(null = store state unknown): missing capabilities then render
|
||
the plain missing chip with an honest tooltip — no install
|
||
offer, no "not in store" claim — and the analyzer message says
|
||
the store cannot be checked right now (EN + DE). Previously an
|
||
unreachable store made every missing capability claim
|
||
"not in store".
|
||
|
||
## 0.24.1
|
||
|
||
- No ALL-CAPS "FLOWS" panel header: the page toolbar already names
|
||
the page — the duplicate label read as a broken title hierarchy.
|
||
The refresh action moved next to the list filter.
|
||
- Doc comments name the current CLI (`chain install`).
|
||
|
||
## 0.24.0
|
||
|
||
Usertest-panel fixes (flow list + language):
|
||
|
||
- **Builtin-capability truth from the hub.** Removed the hardcoded
|
||
client-side builtin set (`{'debug.echo'}`): missing-module
|
||
detection now trusts the host-supplied capability list alone,
|
||
which already includes the hub's real builtins. Fixes the bundled
|
||
`hello` flow showing a play button on hubs that don't have
|
||
`debug.echo` installed.
|
||
- **Missing-modules badge redesigned.** Status ("N Module fehlen",
|
||
quiet neutral chip with an amber dot) and the install action
|
||
(own link, never truncated) are separate elements; the former
|
||
combined orange chip read as an error wall and ellipsized the
|
||
action word.
|
||
- **Flow-list filter.** Case-insensitive substring filter above the
|
||
list, with an honest "no flow matches" empty state.
|
||
- **Formal address (Sie) in all German strings** plus missing
|
||
commas/quotes in the empty-state sentences.
|
||
- Analyzer hint now names the current CLI (`chain install --link`,
|
||
was `fai install --link`).
|
||
|
||
## 0.23.0
|
||
|
||
- Run tab file inputs accept a host-injected native file picker
|
||
(`FlowEditorPage.onPickFile`, new `PickedFileData` /
|
||
`PickFileCallback` contract). The manual path-entry dialog remains
|
||
only as the no-host fallback — typing an absolute path by hand is
|
||
a last resort, not an input method.
|
||
|
||
All notable changes to `chain_studio_flow_editor` recorded here.
|
||
Studio bumps its `pubspec.yaml` git ref to a specific release
|
||
of this package on every editor change.
|
||
|
||
## 0.22.0 — 2026-07-12
|
||
|
||
### Added
|
||
|
||
- **Project chip (multi-project stage ②).** When the open flow file
|
||
declares its own top-level `project:`, the editor shows it as a chip
|
||
in the tab action strip. If the file's project differs from the host's
|
||
active workspace, the chip becomes an amber "file wins" pill with a
|
||
one-click *Switch to <project>* action — the file always wins for the
|
||
run; switching only aligns the workspace view. New optional
|
||
`FlowEditorPage.activeProject` + `onSwitchToFileProject`; the parse +
|
||
normalize logic (mirrors the hub's `normalize_project_slug`) lives in
|
||
`flow_project.dart` and is unit-tested.
|
||
|
||
## 0.21.2 — 2026-07-11
|
||
|
||
### Added
|
||
|
||
- **Per-row start button.** Runnable flows (no missing modules) get a
|
||
play button in the flow list that opens them directly on the Run
|
||
tab — one click from the list to entering inputs and starting
|
||
(usertest quick win).
|
||
|
||
## 0.21.1 — 2026-07-11
|
||
|
||
### Fixed
|
||
|
||
- **Toolbar names the page, not the missing state.** With no flow
|
||
open the header said "No flow open" / "Kein Flow geöffnet" — the
|
||
usertest read it as a confusing page title. It now says "Flows";
|
||
the state sentence stays in the centered empty state.
|
||
- **"Needs N modules" chip no longer overflows the flow list.** The
|
||
label ellipsizes inside the narrow sidebar (the tooltip keeps the
|
||
full text); previously it tripped a RenderFlex overflow by a few
|
||
pixels on longer German labels.
|
||
|
||
## 0.21.0 — 2026-06-09
|
||
|
||
### Added
|
||
|
||
- **Diagnostic-strip "Beheben" button** opens a focused modal
|
||
enumerating every issue with its quick-fix actions plus an
|
||
"apply every quick fix" master button. Replaces the
|
||
cramped expand-strip workflow for operators who want a
|
||
deliberate dialog instead of scrolling in a 200-px footer.
|
||
|
||
- **Inline Approve / Reject in the Run tab**. When the hub
|
||
pauses a flow on `system.approval@^0`, the Run tab now
|
||
renders a complete approve / reject form directly under the
|
||
awaiting step. The operator no longer needs to switch to the
|
||
Approvals page mid-run.
|
||
|
||
- **`FlowRunDriver` extended** with three new methods (default
|
||
implementations throw with a clear message so legacy hosts
|
||
keep compiling): `pendingApprovalIdForStep`,
|
||
`approveApproval`, `rejectApproval`.
|
||
|
||
## 0.20.1 — 2026-06-09
|
||
|
||
### Changed
|
||
|
||
- **Flow list rows** in the sidebar get a leading 28×28 icon
|
||
tile (`account_tree_outlined`), active-row accent + weight,
|
||
and compact byte formatting (B / KB / MB). Long names no
|
||
longer overflow into a multi-line ellipsis; size strings
|
||
read as `4.3 KB` instead of `4321 B`.
|
||
|
||
## 0.20.0 — 2026-06-09
|
||
|
||
### Added
|
||
|
||
- **Localised analyzer + strip + run messages**. Every analyzer
|
||
message and every quick-fix label flows through the new
|
||
`AnalyzerStrings` adapter, populated from the editor's locale.
|
||
Strip + hover card + run-block tooltip + inline message
|
||
+ step row + CopyableErrorBox tooltips all moved to the
|
||
string table.
|
||
|
||
### Fixed
|
||
|
||
- **Real monospace font everywhere**. The editor previously
|
||
used `fontFamily: 'JetBrains Mono'` as a bare string with no
|
||
fallback. The package never bundled the font; only Studio
|
||
pre-loaded it via `google_fonts`. Hosts without Studio's
|
||
setup saw the YAML editor render in the system proportional
|
||
default. New `_monoTextStyle()` helper pins
|
||
`fontFamilyFallback` to a cross-platform monospace chain.
|
||
|
||
## 0.19.0 — 2026-06-08
|
||
|
||
### Added
|
||
|
||
- **Persistent diagnostic strip** below the TabBarView. Same
|
||
issue list visible on Graph + Text + Run tabs.
|
||
- **Run button blocked** when the analyzer reports errors.
|
||
Both the action-strip Run and the RunTab Start button gate
|
||
on `analyzerErrorCount`.
|
||
- **Run failures copyable** via a new `_CopyableErrorBox`.
|
||
|
||
## 0.18.0 — 2026-06-08
|
||
|
||
### Added
|
||
|
||
- **Graph nodes pulse on error**. Steps + pseudo-nodes
|
||
(inputs / outputs) carrying analyzer issues render a
|
||
breathing halo in the matching severity colour.
|
||
- **Store-aware install / add-source**. Analyzer takes a
|
||
`storeCapabilities` closure; unknown-capability fixes
|
||
switch between "Install" (in store) and "Add source for…"
|
||
(not in store).
|
||
- **Did-you-mean suggestion** within Levenshtein distance 2.
|
||
|
||
## 0.17.0 — 2026-06-08
|
||
|
||
### Added
|
||
|
||
- **Copyable diagnostics + hover tooltip + quick fixes**. Strip
|
||
rows use SelectableText with per-row Copy. Wavy underlines
|
||
publish hover-tooltip requests via a ValueNotifier; an
|
||
OverlayEntry card renders the message + fix buttons near
|
||
the cursor.
|
||
- **`InstallCapabilityFix`** delegates to a host callback
|
||
(`onInstallCapability`).
|
||
|
||
## 0.16.0 — 2026-06-08
|
||
|
||
### Fixed
|
||
|
||
- **Editor gutter glitches**. The `flutter_code_editor` gutter
|
||
hard-positioned an `Icons.cancel` pin in a 16-px slot with a
|
||
popup that painted over the code area. Hidden via
|
||
`showErrors: false`; replaced with a bottom diagnostic strip
|
||
the editor owns.
|
||
|
||
## 0.15.x — 0.14.x
|
||
|
||
Earlier development. See git log.
|