Record flags in history and draw them as steps

A bool was excluded from the history as "not a measurement", so a true/false
port had no curve in the node panel and none on an edge — only the word. It is
recorded as 0/1 now and drawn as steps, since a bezier through two states
slopes through readings that never happened. The axis is pinned to 0..1, so a
flag that was never on sits at the floor rather than mid-box.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-27 15:54:06 +02:00
co-authored by Claude Opus 5
parent 168aadb217
commit 6bc71ddaf3
7 changed files with 59 additions and 31 deletions
@@ -132,11 +132,11 @@ export function EdgeInspector({
</div>
{/* The same curve the node panel draws for this message: one value
says little, how it has been moving says the rest. Only for a
number, because only numbers are recorded — for anything else the
sparkline falls through to its own copy of the value, which the
popover already shows below. */}
{typeof live?.value === "number" ? (
says little, how it has been moving says the rest. Only for what is
recorded — a number, or a flag as the steps between 0 and 1. For
anything else the sparkline falls through to its own copy of the
value, which the popover already shows below. */}
{typeof live?.value === "number" || typeof live?.value === "boolean" ? (
<div className="mt-2">
<MessageSparkline
flow={flow}
@@ -83,11 +83,13 @@ export function MessageSparkline({
const ts = live?.ts
const value = live?.value
useEffect(() => {
if (typeof value !== "number" || !ts) return
// A flag is recorded as 0/1, the way the server keeps it.
if ((typeof value !== "number" && typeof value !== "boolean") || !ts) return
const reading = Number(value)
setTail((previous) =>
previous[previous.length - 1]?.ts === ts
? previous
: [...previous, { ts, value }].slice(-WINDOW),
: [...previous, { ts, value: reading }].slice(-WINDOW),
)
}, [ts, value])
@@ -127,7 +129,10 @@ export function MessageSparkline({
<Tooltip>
<TooltipTrigger asChild>
<div>
<Sparkline points={points} />
<Sparkline
points={points}
bool={dtype === "bool" || typeof live?.value === "boolean"}
/>
</div>
</TooltipTrigger>
<TooltipContent>{caption(points)}</TooltipContent>