Commit Graph

306 Commits

Author SHA1 Message Date
Lucio Lelii b252af3448 fix(resource): anchor link socket at closed-card center 2026-09-30 10:02:22 +02:00
Lucio Lelii bc7fe4202a style(resource): center fixed link socket 2026-09-30 10:01:33 +02:00
Lucio Lelii e5b293f18b style(resource): enlarge fixed link socket 2026-09-30 10:00:37 +02:00
Lucio Lelii 7a2468b647 fix(resource): keep link socket height fixed 2026-09-30 09:57:20 +02:00
Lucio Lelii 5dc537146d merge: dynamic storage operations editor 2026-09-30 09:22:41 +02:00
Lucio Lelii 4e0d234763 fix(editor): retain wire selection for endpoints 2026-09-30 09:17:58 +02:00
Lucio Lelii bcc9009278 fix(editor): clear wire selection before node drag 2026-09-30 09:11:05 +02:00
Lucio Lelii 26b11a0203 fix(editor): follow only loop endpoints 2026-09-30 08:53:16 +02:00
Lucio Lelii 11bcfb5973 fix(editor): route loops from endpoint heights 2026-09-30 08:50:57 +02:00
Lucio Lelii 09abd7e3f6 fix(editor): keep loop routes at a fixed height 2026-09-30 08:44:34 +02:00
Lucio Lelii f33712a250 feat(editor): raise selected connection endpoints 2026-09-30 08:34:45 +02:00
Lucio Lelii aeead4bc6c feat(editor): name connected storage resources 2026-09-30 08:23:55 +02:00
Lucio Lelii 76fe788a16 style(editor): distinguish resource and dependency wires 2026-09-30 08:10:53 +02:00
Lucio Lelii 03b50ef989 fix(editor): raise only selected connection 2026-09-30 07:56:09 +02:00
Lucio Lelii c8085dad5a feat(editor): highlight selected connection endpoints 2026-09-30 07:52:12 +02:00
Lucio Lelii 421ef23518 fix(storage): refresh operations after resource change 2026-09-29 21:40:15 +02:00
Lucio Lelii d7e42ed253 fix(nodes): preserve open settings after replacement 2026-09-29 21:18:47 +02:00
Lucio Lelii d4ab8f8fb1 fix(nodes): preserve open settings after replacement 2026-09-29 21:18:37 +02:00
Lucio Lelii 2ea00386a8 style(resource): simplify card border 2026-09-29 21:10:40 +02:00
Lucio Lelii 95d33d218b style(resource): simplify card border 2026-09-29 21:10:40 +02:00
Lucio Lelii bbbae3632a feat(storage): refresh operation schema from resource links 2026-09-29 21:08:42 +02:00
Lucio Lelii 44a4ff09a9 ui: make node settings collapsible 2026-09-29 18:56:17 +02:00
Lucio Lelii d3f8ea3006 ui: refine admin workspace 2026-09-29 15:00:22 +02:00
Lucio Lelii f4a162a485 Make a node's fields, and their editor, easier to read
The fields sat in a grey box as blue chips, with a pencil on every one
of them and values printed as the constants they are stored as.

A field is now a quiet white card that lifts on hover, its label small
and grey above the value, and its pencil appears only when the field is
pointed at. A value that is one of a fixed set - CATALOG, PER_EXECUTION
- reads as words on a tinted plate, so it is clearly a choice and not
typed text; an empty one says so in grey rather than as a bare dash.
The dialog behind the pencil is roomier, with a focus ring on the
control and the same words in its dropdown.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-29 12:45:11 +02:00
Lucio Lelii 95ea013139 ui: make resource links visible and interactive 2026-09-29 11:41:57 +02:00
Lucio Lelii 67d6bc6b71 ui: align node sockets and widen resource cards 2026-09-29 11:14:11 +02:00
Lucio Lelii 97b174ac6e Expand and close a node with the icons a resource uses
Two pictures for one action: a node expanded with the fullscreen arrows
and closed with their inward twin, a resource with the diagonal arrows
and a plain ×. The node and the container now use the resource's pair.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-29 09:59:16 +02:00
Lucio Lelii 4b638414c9 Drop the coloured stripe from a step's left edge
The badge and the kind under the name already say what sort of step it
is; the stripe only added weight. A resource card keeps its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:56:44 +02:00
Lucio Lelii b6d61c2b8e Draw a step's header the way a resource card is drawn
The saturated blue (or amber) header bar gives way to a light one: a
tinted badge with the step's icon, its name in dark type with its kind
under it in the step's colour, and quiet borderless buttons that colour
on hover. The kind of step stays in a stripe on the left, as on a
resource card.

A step's icon now follows its kind - automated, human, decision, end,
branches rejoin - with the pictures the palette already uses for them,
instead of one raster image for every automated block. A schema that
names an icon still wins.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:52:46 +02:00
Lucio Lelii 3f4fb97626 Let a resource be expanded to edit it at full size
Like a block, a resource can now be lifted out of the canvas into a
panel at full size, with every field open, whatever the zoom - an init
script above all is unreadable in a card on a zoomed-out canvas. The
settings button still opens the fields in place for a quick look.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:47:11 +02:00
Lucio Lelii 2bf0f40804 Put a resource's handle bar on its right edge
Its links now leave to the right from the bar's middle, as a step's
outputs do, and come into the step's handle from the left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:36:20 +02:00
Lucio Lelii 0afe66d372 Make a resource's handle a bar along its top edge
A small square on the edge was hard to see and hard to grab, and Rete
anchored its links 12px to one side of it - the offset it gives an
output on a node's right. The handle now runs along the whole top edge,
and its links start from the bar's middle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:27:18 +02:00
Lucio Lelii 733de8df7a Draw a resource as a compact card, not one more step
A resource looked like a step: a header bar, a "Used by / Steps" row
with the handle on the right, every field open. It is now a card - its
type's icon, its name, one line saying where the store is - with the
fields behind a settings button and its handle on the top edge. Its
links leave that handle vertically and come into the step from the
left, so they read as something the steps hang from rather than one
more connection in the chain.

Saved links to a resource were not drawn at all when the resource
types had not been fetched yet - which was always, unless the
Resources palette had been opened - because the link was checked
against a kind nobody knew. The editor now fetches the resource types
before drawing, and puts saved links back without checking them again:
the server has.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:23:42 +02:00
Lucio Lelii b60fc3c1d6 Show each kind of store as a resource of its own
The resource palette now lists an S3 storage and a PostgreSQL database
as two cards, each with the label and icon its type declares, and the
node on the canvas takes the same. A step's resource field names a
kind, so a storage operation links to either store.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 09:09:47 +02:00
Lucio Lelii 52b26acddd Describe a resource node from the resource catalog, not the block one
The resource node inherited the generic node's schema lookup, which asks
the block catalog. Storage is not a block, so the lookup found nothing:
the node showed no fields, and every click on it fetched the catalog
again and covered it with the loading overlay, so nothing inside could
be clicked.

The lookup is now a hook the resource node overrides with the resource
catalog, and a resource is never recreated on the server - it has no
ports for the server to recompute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 08:58:23 +02:00
Lucio Lelii 612fe41515 Give resources a palette of their own, beside blocks and containers
They were squeezed into the blocks palette as one more kind of block,
which is exactly the confusion the model change was meant to end. The
sidebar now has a third entry with its own icon and its own list, and
the blocks palette knows nothing about resources again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-29 08:53:22 +02:00
Lucio Lelii 067cd2f287 Draw a resource as its own kind of node, not a block
A storage was a block with a visual role that said "not a step", which
left resource-shaped exceptions scattered through the editor, the node
components, the palette and the execution view.

The flow now carries resources beside its blocks, and the canvas draws
them with a component of their own: no ports, no dependencies, one
handle for the steps that use it. What a step links is read from the
schema flag x-resource-ref, so the editor no longer knows the word
"storage" anywhere - a new kind of resource needs no code here.

The configuration form the two kinds of node share is now a component of
its own (app-node-parameters), so a resource is edited exactly as a
block while it is drawn differently.

Resource types come from /resources/types, and share the palette with
the blocks under the Resource kind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-29 08:24:18 +02:00
Lucio Lelii ee2696814c Link storage operations to a Storage node on the canvas
A Storage node has a 'Used by' handle and a storage operation a 'Works
on' one; the link drawn between them, teal and dotted, is what sets the
operation's storageNode. It is neither a connection nor a dependency: it
carries no value and orders nothing, and loops leave it out. An
operation works on one node, so a new link replaces the old one, and
removing the link empties the field. On load the links are drawn back
from what each operation says.

Fields the schema marks x-ui-hidden are left out of every form and chip
- storageNode is set by the link, not typed - and kept in the
configuration.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 17:39:37 +02:00
Lucio Lelii 1a7d139535 Put the palette's kind filter in a menu on the search field
The chips took four lines of a narrow sidebar. A filter button at the
end of the search field opens the kinds as checkboxes instead, and
shows how many are picked; its tooltip says which. The menu lives in
the overlay, so its font is set globally, where the palette's own
styles do not reach. A storage's icon is 'storage': 'database' is not
in the icon font, and showed nothing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:09:23 +02:00
Lucio Lelii 53439558b6 Filter the palette by kind of block
A row of chips under the search, one for each kind the palette has -
automated and human steps, decisions, rejoins, ends, resources - in a
fixed order. Picking some narrows the list to them, together with the
search; picking none shows every block, and Clear goes back to that.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:03:33 +02:00
Lucio Lelii 46062fca40 Call a storage node a Resource, in the palette and on the node
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:01:17 +02:00
Lucio Lelii a8b1920fdb Say what each block is in the palette, from its role
The palette knew two kinds of block, a human step and an automated one,
so a Storage node, an End and a routing block all read 'Automated step'.
It now goes by the role the block's type declares: a resource that is
not a step, an end of a path, an automated or a human decision, a rejoin
of branches, a human step, an automated step - each with its own icon.

The server's BRANCH_REJOIN role is read as the web's MERGE, which it had
never matched, so a rejoin was taken for an ordinary activity.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:00:20 +02:00
Lucio Lelii 672f53d9ab Offer Use default on a node field only where there is one
The editor a node opens for a single field offered Use default on every
optional field that was not a checkbox: a storage's connection, its
operation, its scope, and any other choice between alternatives, where
there is nothing to go back to. The settings dialog already followed the
schema's x-ui-defaults-when-empty; this editor now does too, so the
button is on the model's sampling knobs and nowhere else.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 15:39:20 +02:00
Lucio Lelii 1aa32efa80 Draw and wire storage nodes as resources, not steps
A storage node comes from the server with the RESOURCE role. In the
editor it is drawn apart from the steps - dashed, teal, labelled
'Storage · not a step' - and its targets take a connection from every
step that writes there; a view parameter (<view>.<parameter>) still
takes one.

Its edges are left out when the editor works out which connections lead
back round a loop: a write followed by a read of the same node is not a
cycle, the same view the server takes.

The execution view draws the node from the flow, since it never has a
step, with no status of its own, so the reads and writes on its edges
still have somewhere to go.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 12:23:08 +02:00
Lucio Lelii 3abcecb944 Ask for a personal storage connection from the vault
A storage step on the runner's own connection needs it before the
execution starts. The gate now takes any requirement the server marks as
paid from the vault (vaultBacked), with the key prefixes as a fallback,
so the S3 or PostgreSQL connection shows up beside the LLM credentials.

Adding one opens a form with the storage type's own fields, from
/storage/types - endpoint, bucket, keys, or host, database, user - and
saves them together as the JSON the server encrypts whole.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 11:55:45 +02:00
Lucio Lelii 9639b2bfe8 Show a list's full name on hover, and make its count easy to read
A list name too long for the node was cut with an ellipsis and nowhere
readable in full. It now shows whole in a tooltip when it is cut, the
way sidebar titles do. The count is white on a solid badge, and quiet
when the list is empty.

The name tooltip also takes the app's font: it asked for Roboto, which
the app does not load, and fell back to a serif - in the flow list too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:35:14 +02:00
Lucio Lelii aa3f54bb1a Show a node's list parameters closed, with how many items they hold
Every list parameter of a node now reads as its name and a count, and
opens on demand to its items; with none there is nothing to open, the
add button is the way in, and the "No items" line is gone. An item
added opens the list, so it is there to see.

The list is one shared component, app-node-list-field, rather than two
near-identical blocks in the block node and a third in the execution
view: the same list reads and behaves the same everywhere, and a
container that gains a list parameter takes the component as it is.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:32:03 +02:00
Lucio Lelii f4a526ebbd Edit a list of plain values one value at a time, not as raw JSON
A list whose elements are plain values - the tools an LLM node must use
successfully, the steps an evaluator follows - had no fields to build
its element dialog from, and fell back to a box asking for "Item JSON"
with {} in it, a shape nobody could guess. The element is now edited in
a single field of its own type, labelled and explained as the list is;
an empty value is not added and a value already in the list is refused.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:19:05 +02:00
Lucio Lelii 79ae012faa Keep all of docs/ local
The user guide files already committed stay tracked; anything new in
docs/ has to be added on purpose.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:04:04 +02:00
Lucio Lelii da269130f6 Ask a secure retriever whether a field is open beside its items
A secure retriever's values are at .../{parameter}/items and its
questions - is the field required, does it take a typed value - at
.../{parameter}/required and /open beside them. The question URL was
made by suffixing the values URL, so for every secure retriever it
pointed under items, where nothing answers: choosing a global input as
a file's source showed an error contacting the server.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 19:04:04 +02:00