feat(editor): live step status on the graph during runs

Step run events were previously visible only on the run tab.
Operators who triggered a run there and then switched to
the graph tab saw a static graph — the canvas had no idea
something was executing.

Wire the run events through the FlowEditorController so all
three tabs share the same status snapshot:

 - New StepRunStatus enum on the controller
   (idle / running / done / failed / awaiting).
 - controller.stepStatuses exposes the live map.
 - controller.updateStepStatus is called from the run tab's
   event handler — one source of truth, both views read it.
 - FlowCanvas drops its own stepStatuses parameter and
   pulls from the controller instead, so the canvas now
   shows the running pulse + done check + error cross + pause
   icon in each step's header live, in lockstep with the
   step list on the run tab.

When a fresh run starts (controller.running = true) the
status map is cleared so stale events from a previous run
don't paint the new one.

Signed-off-by: flemming-it <sf@flemming.it>
This commit is contained in:
flemming-it 2026-06-01 01:47:30 +02:00
parent e7cd9ca13c
commit 6b70ba65fd
4 changed files with 57 additions and 13 deletions

View file

@ -43,9 +43,9 @@ steps:
outputs: {}
''');
final initialText = c.codeController.fullText;
c.applyGraphEdit(c.graph.withStepAdded(
const FlowStep(id: 'b', use: 'debug.echo@^0'),
));
c.applyGraphEdit(
c.graph.withStepAdded(const FlowStep(id: 'b', use: 'debug.echo@^0')),
);
expect(c.codeController.fullText, isNot(initialText));
expect(c.codeController.fullText, contains('id: b'));
expect(c.graph.steps, hasLength(2));
@ -61,9 +61,9 @@ steps:
outputs: {}
''');
expect(c.isDirty, isFalse);
c.applyGraphEdit(c.graph.withStepAdded(
const FlowStep(id: 'b', use: 'debug.echo@^0'),
));
c.applyGraphEdit(
c.graph.withStepAdded(const FlowStep(id: 'b', use: 'debug.echo@^0')),
);
expect(c.isDirty, isTrue);
c.markSaved();
expect(c.isDirty, isFalse);