Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
131ad52
fix: plain-http (non-secure context) support: request/session/switch-…
lpalbou Sep 30, 2026
3dd4035
state toggles: on/off node settings and dialog options are kit AfSwit…
lpalbou Sep 30, 2026
60b5b96
docs: CHANGELOG [Unreleased] on/off switches; web-editor Resources pa…
lpalbou Sep 30, 2026
f44195b
Structured output hints name the switch state ('While Structured outp…
lpalbou Sep 30, 2026
a72d6c3
space on phones and tablets (DESIGN §12, §12.1): collapsible list hea…
lpalbou Sep 30, 2026
f250a04
Merge branch 'feat/state-toggles' into feat/phone-space
lpalbou Sep 30, 2026
f5954ea
type scale floors (DESIGN §12.1): desktop dense text 12 px / secondar…
lpalbou Sep 30, 2026
d30d1a7
responsive screens: FLOW_THEME selects the Appearance theme for a cap…
lpalbou Sep 30, 2026
b752de2
phones: toasts start below an open sheet's title bar (the failed-run …
lpalbou Sep 30, 2026
295cb8c
Merge commit 'b752de2' into integration/2026-09-30
lpalbou Sep 30, 2026
4a4bd54
Merge commit '131ad52' into integration/2026-09-30
lpalbou Sep 30, 2026
b2c04b9
integration: MEDIA_NEEDS_HTTPS uses the kit's insecureContextReason()…
lpalbou Sep 30, 2026
5c1a000
workflow labels: one table of shipped entrypoint names and one-line d…
lpalbou Sep 30, 2026
0ec8753
shipped workflow labels applied: example JSONs carry the table's name…
lpalbou Sep 30, 2026
576bfb9
secure-context: the voice/camera fallback no longer gives https advic…
lpalbou Oct 1, 2026
879d811
0.6.0: version, CHANGELOG [0.6.0] - 2026-10-01 (needs ui-kit 0.4.0); …
lpalbou Oct 1, 2026
f942d5c
Merge branch 'round2/2026-10-01' into release-prep/2026-10-01
lpalbou Oct 1, 2026
53b62c3
0.6.0: kit from the registry (ui-kit ^0.4.0; vite alias comment names…
lpalbou Oct 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,82 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.6.0] - 2026-10-01

Phones and tablets get more of the screen for reading, and on/off options in
the editor are switches labelled by what they control. Desktop windows 1024 px
or wider with a mouse keep the 0.5.0 layout, with text at 12 px or more. Anyone editing node properties,
publishing, starting a run or using the Resources panel sees the switches.
Nothing changes in VisualFlow documents, the server, or the Gateway contract.

### Added
- **Collapsible lists.** In the flow library and the run window, the list
above the detail has a header you tap to hide or show it (Flows,
Execution), with a mouse, a tap, or Enter and Space. Lists start open. The
editor remembers your choice in this browser. Hiding the list gives the
preview or the step details the whole sheet.

### Changed
- **Plain names and descriptions for the shipped workflows.** Every shipped
entrypoint has a name a person would use ("Basic agent", "Coding agent
(chat)", "Deep research") and one sentence of at most 140 characters that
says what it takes and what it returns, instead of its id and a developer
note. The text lives in one table, `scripts/workflow_labels.py`; the
generators take it from there, and `scripts/relabel_shipped_bundles.py`
writes it into the latest shipped bundle of each family and the example
JSONs (`apply`) and checks that generators, examples and bundles agree
(`check`). Only the labels change: graphs, versions and older versions stay
as they were, except docs-qa, which the gateway keeps in its catalog and
therefore ships the new text as 0.1.2.
- **One scroll per sheet.** On phones and tablets, the flow library, the run
window and the run history scroll as one page. Lists no longer scroll inside
their own box, and sections are flat, with a thin line between items.
- **Full width on phones.** The run window's text uses the width of the
screen: a 12 px margin, label and value on one line when they fit, JSON and
paths without a box. The assistant's replies are plain text across the
drawer. The Assistant, Properties and Functions tabs sit in a row at the
top, so the canvas and the open panel lose no side column. In the flow
library, a flow's name starts at the margin and the expand arrow sits at
the end of its row.
- **Larger text on touch screens.** Phones and tablets use a larger type
scale: body text 14 to 15 px, secondary text 13 px. Your font-size setting
still applies. Text inside canvas nodes keeps its size and grows when you
zoom.
- **No text under 12 px on desktops.** Dense text (badges, keys, list
details) is at least 12 px and secondary text 13 px, so the palette, the
properties panel and the run history read at 12 to 13 px instead of 11 px.
Some palette names are shortened one character sooner.
- Dialogs opened from the toolbar are no longer inside the page header, so
screen readers no longer read them as part of the header.

### Fixed
- On phones, a notice raised while a dialog is open appears below the
dialog's title bar. It used to cover the run window's close button, and a
tap copied the error instead of closing the window.
- **Switches show their state.** A switch is highlighted with a check mark
when on, plain when off.
- **Node settings.** **Structured output** (Agent), **Recurrent** (On
Schedule) and **Free text answers** (Ask User) are switches in the
properties panel. Recurrent no longer shows an "Enabled" / "Disabled" label.
- **Dialog options.** **Reload gateway bundles** (Publish), **New folder per
run** (the run window's workspace folder), **Durable** (sending an event to
a waiting run), **Lock after load** and **Cached and non-resident models**
(Resources) are switches. In the run window, New folder per run shows why it
cannot change while the gateway manages the workspace or a run is in
progress.
- Pause and Resume on a running run stay buttons: they act on the run once,
they are not a setting.
- **Plain http from another machine** (LAN, Tailscale). Browsers withhold
`crypto.randomUUID`, the clipboard API and the microphone outside https and
localhost. Request, session and switch-case ids now come from the kit's
`randomId()` (v4 UUIDs everywhere), every **Copy** falls back to a
text-selection copy and says "Copied" or "Copy failed — select and copy",
and a voice wait over plain http disables **Record** and says why: "This
page is loaded over http, so voice and camera is unavailable — open it over
https (for example through tailscale serve; the gateway console's Network
page explains how) or on the gateway's own computer." Needs
`@abstractframework/ui-kit` 0.4.0.

## [0.5.0] - 2026-09-30

The editor works on phones, tablets, and browser windows of any size. On a
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Requirements:

- Node.js 20+ (the CI uses Node.js 24)
- npm
- a sibling [AbstractUIC](https://github.com/lpalbou/AbstractUIC) checkout at `../abstractuic`: the editor builds the shared UI packages (`@abstractframework/ui-kit` and the monitor widgets) from it
- a sibling [AbstractUIC](https://github.com/lpalbou/AbstractUIC) checkout at `../abstractuic`: the editor builds the monitor widgets from it (`@abstractframework/ui-kit` installs from npm)
- a reachable AbstractGateway for integration testing

```bash
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ npx @abstractframework/flow --gateway-url http://127.0.0.1:8080
```

For a local checkout, clone [AbstractUIC](https://github.com/lpalbou/AbstractUIC)
next to this repository (`../abstractuic`): the editor builds the shared UI
packages (`@abstractframework/ui-kit` and the monitor widgets) from that sibling
checkout.
next to this repository (`../abstractuic`): the editor builds the monitor
widgets from that sibling checkout. `@abstractframework/ui-kit` installs from
npm with `npm install`.

```bash
git clone https://github.com/lpalbou/AbstractUIC.git ../abstractuic
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ The canvas reflects that split:
Start here:

- [Getting started](getting-started.md): start a Gateway, run the editor, sign in, and author a first workflow.
- [Web editor](web-editor.md): the editor's features: sign-in, About, the responsive layout on phones and tablets, discovery, Resources, flow interfaces, automation defaults and trigger-source discovery, hidden connections, the authoring assistant, media and file nodes.
- [Web editor](web-editor.md): the editor's features: sign-in, About, the responsive layout on phones and tablets, switches, discovery, Resources, flow interfaces, automation defaults and trigger-source discovery, hidden connections, the authoring assistant, media and file nodes.
- [Troubleshooting](troubleshooting.md): symptoms, causes, and fixes for sign-in, proxy, editor, and local development problems.
- [FAQ](faq.md): short answers about what Flow owns and what it delegates.

Expand Down
2 changes: 1 addition & 1 deletion docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ for compatible models only; Flow itself does not impose that default.

## Local Development

A local checkout needs Node.js 20+ and a sibling [AbstractUIC](https://github.com/lpalbou/AbstractUIC) checkout: the editor builds the shared UI packages (`@abstractframework/ui-kit` and the monitor widgets) from `../abstractuic`.
A local checkout needs Node.js 20+ and a sibling [AbstractUIC](https://github.com/lpalbou/AbstractUIC) checkout: the editor builds the monitor widgets from `../abstractuic`. `@abstractframework/ui-kit` installs from npm with `npm install`.

```bash
git clone https://github.com/lpalbou/AbstractUIC.git abstractuic
Expand Down
15 changes: 15 additions & 0 deletions docs/shipped-workflow-sources.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,21 @@ Bundle versions are immutable by sha, so publishing a changed graph means
bumping the version in the generator and updating the packaging pin in
`abstractgateway/pyproject.toml`.

The name and one-line description each entrypoint shows on the Gateway's
Workflows page come from one table, `scripts/workflow_labels.py`. The
generators read it, and `scripts/relabel_shipped_bundles.py` keeps the shipped
bundles in line without repacking their graphs:

```bash
python3 scripts/relabel_shipped_bundles.py check --bundles-dir ../abstractgateway/flows/bundles
python3 scripts/relabel_shipped_bundles.py apply --bundles-dir ../abstractgateway/flows/bundles
```

`check` fails when a generator, an example JSON or the latest shipped bundle
of a family carries other text, or when a shipped bundle has an entrypoint the
table does not name. `apply` rewrites only the labels of the latest version of
each family; older versions are never touched.

None of these shipped flows cuts what a model reads (ADR-0026): no message or
character caps on prompts, tool output or documents, and no default output-token
caps. The only bounds left are labeled display previews (for example, a
Expand Down
19 changes: 17 additions & 2 deletions docs/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,12 +161,27 @@ it through the interface receives missing or mistyped values.
editor at build time.
- **Fix:** run `npm run build` again and reload the editor tab.

### Voice is unavailable, or Copy says "Copy failed — select and copy"

- **Cause:** the editor is open over plain `http://` from another machine (a
LAN or Tailscale address such as `http://100.x.y.z:8080/apps/flow/`).
Browsers offer the microphone, the camera and the clipboard only on https
pages or on `localhost`. Over plain http, a voice wait in the run window
disables **Record** and says why, and **Copy** falls back to a
text-selection copy that the browser may refuse.
- **Fix:** open the editor over https, or on the gateway's own computer. With
Tailscale, run `tailscale serve --bg http://127.0.0.1:<port>` on the gateway
machine and open `https://<host>.<tailnet>.ts.net/apps/flow/`; the gateway
console's Network page explains the steps. Everything else in the editor
works over plain http.

## Local Development

### The build cannot resolve `@abstractframework/ui-kit` or a monitor package

- **Cause:** a local checkout builds the shared UI packages from a sibling
AbstractUIC checkout at `../abstractuic`.
- **Cause:** `@abstractframework/ui-kit` installs from npm, so `npm install`
has not run yet; or the monitor widgets, which a local checkout builds from
a sibling AbstractUIC checkout at `../abstractuic`, are missing.
- **Fix:**

```bash
Expand Down
47 changes: 36 additions & 11 deletions docs/web-editor.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,24 +70,49 @@ the window width:
touch screens. The minimap starts collapsed on phones and short screens;
use the toggle in the bottom-right corner to show it. The view fits the
flow again when you rotate the device.
- **Flow library and run window on phones.** The library shows the flow list
above the preview (side by side in landscape). The run window shows the
execution steps above the details. Both scroll inside the sheet.
- **Flow library and run window on phones and tablets.** Below 1024 px the
library shows the flow list above the preview (side by side in phone
landscape), and the run window shows the execution steps above the step
details. Each sheet scrolls as one page; the lists do not scroll inside
their own box. Sections are flat, with a thin line between items. The
list's header (**Flows**, **Execution**) hides or shows the list with a
tap, a click, Enter or Space; lists start open and the editor remembers
your choice in this browser. On phones the run window uses the width of
the screen with a 12 px margin, and label and value share a line when they
fit.
- **Side panel tabs on phones.** The Assistant, Properties and Functions tabs
sit in a row at the top of the drawer, so the open panel uses the full
width.
- **On-screen keyboard.** The assistant composer and the sheets' action rows,
such as the library's Load button, stay above the keyboard. In phone
landscape a 200 px keyboard leaves room for the composer; a taller keyboard
leaves less space than the composer needs.
- **Touch targets and text.** Toolbar buttons, palette nodes, library rows,
selects and dialog buttons are at least 44 px on touch screens. Inputs use
16 px text so iOS does not zoom in when you focus them, and the properties
panel's help text is 14 px.
selects and dialog buttons are at least 44 px on touch screens. Text on
touch screens uses a larger scale: body text 14 to 15 px, secondary text
13 px. Inputs use 16 px text so iOS does not zoom in when you focus them.
Your font-size setting multiplies every size.
- **Notifications** appear at the top of the screen on phones, clear of the
sheets' action rows, and at the bottom right elsewhere.

What stays desktop-sized: node cards and the controls inside them (pin
inputs, pin selects, "Edit Code") keep their compact design and scale with
the canvas zoom, so zoom in to work on them on a small screen. The desktop
panels keep their dense 11-13 px text on a mouse-driven screen.
the canvas zoom, so zoom in to work on them on a small screen. On a desktop
with a mouse, the panels keep their dense layout with text at 12 px or more
(secondary text 13 px).

## Switches

On/off settings are switches labelled by what they control; a switch is
highlighted with a check mark when on and plain when off. The properties
panel has **Structured output** (Agent), **Recurrent** (On Schedule) and
**Free text answers** (Ask User). The dialogs have **Reload gateway bundles**
(Publish), **New folder per run** (the run window's workspace folder),
**Durable** (sending an event to a waiting run), and **Lock after load** and
**Cached and non-resident models** (Resources). When a switch cannot change,
it says why next to it: **New folder per run** is fixed while the gateway
manages the workspace or a run is in progress. Pause and Resume on a running
run are buttons, because they act on the run once.

## Provider And Model Discovery

Expand Down Expand Up @@ -118,9 +143,9 @@ three tabs:
length (✓ marks a calibrated value). Locked models carry a lock marker;
Lock/Unlock and a per-model context Estimate appear when Gateway advertises
those endpoints. Unloading a locked model asks for an explicit Force Unload
confirmation. A "Show cached/non-resident" toggle reveals cached and
configuration-only rows, and the load bar can lock a model as part of
loading it.
confirmation. The **Cached and non-resident models** switch reveals cached
and configuration-only rows, and the load bar's **Lock after load** switch
locks a model as part of loading it.
- **Memory** shows host RAM, device, and per-GPU meters, process RSS, and
degraded-state reasons from Gateway host state, refreshed every 5 seconds
while the tab is open.
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/81795ea9.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "81795ea9",
"name": "basic-agent",
"description": "The framework default agent: one Agent node with tools, memory, and status updates via the ac-update-status helper. Runnable by chat hosts (AbstractCode, entity phases, gateway agency loops) through the abstractcode.agent.v1 contract.",
"name": "Basic agent",
"description": "Chat agent: answers a prompt in one agent loop that can use tools and memory, and returns the reply.",
"interfaces": [
"abstractcode.agent.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/adversarial-review.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "adversarial-review",
"name": "adversarial-review",
"description": "Reusable review primitive: three independent critics review an artifact through correctness / design-robustness / requirements-fit lenses, then a merge step consolidates and severity-ranks the findings into one pass/revise/block verdict. Composable as a subflow.",
"name": "Adversarial review",
"description": "Three critics review text or code for correctness, design and fit to requirements; returns ranked findings and a pass/revise/block verdict.",
"interfaces": [
"abstractreview.adversarial.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/co-scientist.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "co-scientist",
"name": "co-scientist",
"description": "Deep multi-agent hypothesis engine (Nature 'AI co-scientist' replica). Starts FROM the literature by delegating grounding to the deep-research investigation engine (deep-plan + deep-investigate: real web search + a verified source ledger), then runs a supervisor loop of Generation -> Reflection -> Elo-ranking (prioritized pairwise scientific debate) -> Evolution -> research-expansion, threading meta-feedback forward each cycle with near-duplicate pruning, then a final search-grounded full review of the finalists and a Meta-review research overview. Deliberately deeper than a single-pass report - it scales test-time compute via the cycle budget.",
"name": "Co-scientist",
"description": "Takes a research goal, grounds it in web sources, then generates, debates and ranks hypotheses over cycles; returns a research overview.",
"interfaces": [
"abstractresearch.coscientist.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/coder.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "coder",
"name": "coder",
"description": "Chat-agent entrypoint for the coding-agent pipeline: takes a plain prompt (abstractcode.agent.v1), runs the verify-gated build loop in the session workspace with inferred gates (no explicit build/run commands — the verifier executes what it can and reports honestly), and returns the build report as the response.",
"name": "Coding agent (chat)",
"description": "Chat version of the coding agent: builds what the prompt asks in the session workspace, checks it each round, and replies with a report.",
"interfaces": [
"abstractcode.agent.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/coding-agent.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "coding-agent",
"name": "coding-agent",
"description": "Advanced coding agent with recursive verification: a builder agent writes code, an independent verifier runs build/execute/match gates each round, and failures are fed back as specific reprompts until all gates pass or the round budget is spent.",
"name": "Coding agent",
"description": "Takes a build request and a workspace, writes the code, and runs build and run checks each round until they pass; returns a report.",
"interfaces": [
"abstractcode.coding.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/deep-research.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "deep-research",
"name": "deep-research",
"description": "Production research workflow with adversarial review, provenance, and Markdown/PDF/DOCX export.",
"name": "Deep research",
"description": "Takes a research question, searches the web, has three critics review the draft, and writes a cited report (Markdown, PDF, DOCX).",
"interfaces": [
"abstractcode.agent.v1",
"abstractresearch.deep.v1"
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/map-reduce.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "map-reduce",
"name": "map-reduce",
"description": "Reusable batch primitive: map a per-item LLM instruction over an input array (ForEach), accumulate the per-item results, then reduce them with a synthesis LLM instruction. Returns the per-item results and the synthesized output.",
"name": "Map-reduce",
"description": "Applies one LLM instruction to each item of a list, then combines the per-item results into one synthesis; returns both.",
"interfaces": [
"abstractbatch.mapreduce.v1"
],
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/meta-baseline.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "meta-baseline",
"name": "meta-baseline",
"description": "Control arm for the meta-intelligence benchmark: ONE isolated LLM call answering directly (same system prompt, same machinery, no orchestration). Conforms to abstractcode.agent.v1.",
"name": "Single call (baseline)",
"description": "Answers the prompt with one direct LLM call; the baseline the other deliberation workflows are compared against.",
"interfaces": [
"abstractcode.agent.v1",
"abstractmeta.intelligence.v1"
Expand Down
4 changes: 2 additions & 2 deletions examples/flows/meta-consensus.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "meta-consensus",
"name": "meta-consensus",
"description": "Meta-intelligence: two independent LLM answers reconciled into one consensus answer — agreement is kept as reliable, divergence is resolved by reasoning, not averaged. Diversity comes from temperature (0.3 vs 0.9) by default, or from a genuinely different second model via the optional provider_b/model_b inputs. Self-consistency pattern; comparable 1:1 against an isolated LLM call on the same prompt. Consensus across N>2 answerers needs a loop-based flow (future scope).",
"name": "Consensus",
"description": "Gets two independent answers (two temperatures or two models) and merges them into one, keeping agreements and resolving differences.",
"interfaces": [
"abstractcode.agent.v1",
"abstractmeta.intelligence.v1"
Expand Down
Loading
Loading