Commit Graph

44 Commits

Author SHA1 Message Date
gsxdsm
ba599a4ea1 FN-7136: preserve workflow edges between adjacent group nodes
Keep workflow graph edges connected when optional-group containers appear consecutively.

- Reject stale saved top-level layout coordinates only when connected container spans overlap in the same visual row.
- Advance auto-layout layers by each consecutive container layer's rendered width.
- Add coverage for desktop flow mapping, auto-layout, mobile graph rendering, and release-note changeset.

Files changed:
 .../fn-7136-consecutive-optional-group-edges.md    |   7 ++
 .../__tests__/workflow-auto-layout.test.ts         | 116 +++++++++++++++++++-
 .../__tests__/workflow-flow-mapping.test.ts        | 122 ++++++++++++++++++++-
 .../__tests__/workflow-mobile-graph.test.ts        |  10 +-
 .../app/components/workflow-auto-layout.ts         |   3 +
 .../app/components/workflow-flow-mapping.ts        |  50 ++++++++-
 6 files changed, 299 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-7136
Fusion-Task-Lineage: 1fa1e528-a68e-4eee-9018-6752fe62a1f5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-27 15:39:01 -07:00
gsxdsm
3f66e55505 FN-7016: keep workflow container edges connected
Keep workflow container fallback layouts connected in the editor.

- Space fallback and auto-layout columns by each node's rendered width so wide containers do not overlap adjacent handles.
- Treat incomplete top-level saved layouts as stale and fall back to a coherent graph layout.
- Cover optional-group, foreach, and mobile graph mapping with regression tests.

Files changed:
 .changeset/fn-7016-optional-group-edges.md         |   7 +
 .../__tests__/workflow-auto-layout.test.ts         |  18 +++
 .../__tests__/workflow-flow-mapping.test.ts        | 154 ++++++++++++++++++++-
 .../__tests__/workflow-mobile-graph.test.ts        |  37 ++++-
 .../app/components/workflow-auto-layout.ts         |  28 +++-
 .../app/components/workflow-flow-mapping.ts        |  40 +++++-
 6 files changed, 271 insertions(+), 13 deletions(-)

Fusion-Task-Id: FN-7016

Fusion-Task-Lineage: a009fc2d-05cb-41cc-8be1-c5522f7398ff
2026-06-26 01:15:14 -07:00
gsxdsm
e4a810e9b4 fix(FN-6880): address PR review feedback (#1712)
- Reject failure-condition edges inside optional-group templates (the single-pass
  walk surfaces template failures as the group's outcome, so an internal failure
  edge was silently dead) — Greptile P2.
- flowToIr: a container/group node (foreach/loop/optional-group) is v2-only — its
  presence now forces v2 serialization (an inserted optional-group on a plain
  workflow no longer serializes as invalid v1) — CodeRabbit.
- Disabled optional-group bypass routes a plain success with no distinguishing
  value, so an outcome:* edge can't preempt success routing (inertness) — CodeRabbit.
- Downgrade heuristic: presence of a legacy optionalSteps key (incl. []) keeps v2.
- Resolver docblock corrected (config-less groups resolve to a fallback entry).
- Strengthen tests: assert both inserted groups + v2 round-trip; failure-edge
  rejection case.
- Changeset: bump to major (removed exported WorkflowOptionalStep type).
- Plan: record U7a as delivered in this cohort; only the workflow-step seam
  infra removal remains deferred.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:47:31 -07:00
gsxdsm
e5382f0d8c refactor(FN-6880): retire the legacy optional-steps declaration surface (U7a)
Optional steps are now graph-native optional-group nodes, so the dead
declaration model is removed: the WorkflowOptionalStep type + WorkflowIrV2
.optionalSteps field + validateOptionalSteps (core), and the editor's
declaration AUTHORING surface — WorkflowOptionalStepsPanel, optionalStepsOf,
and the flowToIr/serializeGraph optionalSteps threading (dashboard). A legacy
persisted optionalSteps key is tolerated (ignored) at parse. The per-task
TOGGLE surfaces (dropdown, inline card, modal, Workflow tab) are unchanged —
they consume ResolvedWorkflowOptionalStep, which stays. The workflow-step seam
infrastructure removal remains a separate documented follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:40:41 -07:00
gsxdsm
baa2e8f42b feat(FN-6880): insert add-ons as node subgraphs / optional groups (U5)
Surface all seven WORKFLOW_STEP_TEMPLATES add-ons in the editor's Built-in steps
palette with two insert variants: as a single node (existing stepTemplateToNode)
and as an optional-group-wrapped subgraph (optionalGroupFragmentIr + the existing
insertFragment path, which already expands optional-group children). Also update
the cross-package built-in failure-edge parity assertion for U6's
workflow-step -> browser-verification optional-group migration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 18:54:59 -07:00
gsxdsm
be7c23693c feat(FN-6880): author optional-group container in the node editor (U4)
Render and author optional-group as a third group-container kind beside
foreach/loop: register the node type (OptionalGroupNode) so it renders with a
header + defaultOn badge and parentId template children, treat it as a group
everywhere in workflow-flow-mapping (irToFlow children, flowToIr template
reassembly, cascade-delete, condition-editable), add a palette entry, and an
inspector defaultOn toggle. Includes a node-help entry and round-trip / toggle /
cascade-delete tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 18:29:58 -07:00
gsxdsm
7c8eba38b4 Address PR review feedback (#1703)
- FNXC requirement-trace comments on the stepwise workflow-step seam,
  the flowToIr v2-signal/byte-identity contract, and TaskForm's
  optional-steps create-mode behavior
2026-06-21 03:13:23 -07:00
gsxdsm
4c7bfcf175 feat(dashboard): preserve optionalSteps through flowToIr round-trip
Thread an optionalSteps param through flowToIr (counts as a v2 signal,
re-attached like fields/settings, omitted entirely when empty for byte
identity) and add an optionalStepsOf reader mirroring fieldsOf/settingsOf.
Without this, saving a workflow through the node editor silently dropped
its optional-step declaration.
2026-06-21 00:05:13 -07:00
gsxdsm
1a565a368b FN-6744: rescue WorkflowNodeEditor merge seam guard
Rescue the WorkflowNodeEditor quarantine by making duplicate merge seam detection reliable during initial canvas load.

- Derive fragment seam conflicts from the loaded workflow IR until React Flow nodes materialize.
- Treat IR merge nodes as merge seams so duplicate merge fragments are rejected consistently.
- Cover desktop and mobile duplicate merge fragment insertion paths and remove the test from quarantine.
- Document the FN-6744 rescue evidence and deletion-ratchet update.

Files changed:
 docs/testing.md                                    |  6 +++-
 .../app/components/WorkflowNodeEditor.tsx          | 11 +++++--
 .../__tests__/WorkflowNodeEditor.test.tsx          | 34 ++++++++++++++++------
 .../app/components/workflow-flow-mapping.ts        | 10 +++++++
 packages/dashboard/vitest.config.ts                |  8 +++--
 scripts/lib/test-quarantine.json                   |  5 ----
 6 files changed, 54 insertions(+), 20 deletions(-)

Fusion-Task-Id: FN-6744

Fusion-Task-Lineage: 0f5b167a-8efc-4458-ac9d-e719320b751f
2026-06-19 18:38:17 -07:00
gsxdsm
a067a33a20 FN-6525: reconcile stale workflow node columns
Reconcile workflow editor node placement when columns are deleted and re-added.

- Clear node column references that no longer exist before rebuilding swimlane bands.
- Preserve valid column placements across rename and reorder flows.
- Add regression coverage for delete-all/re-add column saves and IR validation.

Files changed:
 .../app/components/WorkflowNodeEditor.tsx          |  5 +-
 .../__tests__/WorkflowNodeEditor.test.tsx          | 35 ++++++++-
 .../__tests__/workflow-flow-mapping.test.ts        | 85 ++++++++++++++++++++++
 .../app/components/workflow-flow-mapping.ts        | 30 ++++++++
 4 files changed, 153 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6525

Fusion-Task-Lineage: e379ea8c-995f-4b1c-a2b9-30821bb5ae8c
2026-06-16 23:45:56 -07:00
gsxdsm
c8788d85c5 FN-6519: align workflow trait validation details
Align client workflow column validation with server trait conflict reporting.

- Add a helper that maps conflicting composed traits back to their catalog trait IDs.
- Populate client validation traitIds for complete/intake/archive/WIP conflicts.
- Cover client/server traitId parity for save-blocking workflow validation errors.
- Add a patch changeset for the published Fusion package.

Files changed:
 .../FN-6519-custom-workflow-trait-validator.md      |  5 +++++
 .../__tests__/workflow-flow-mapping.test.ts         | 19 ++++++++++++++++++-
 .../app/components/workflow-flow-mapping.ts         | 21 ++++++++++++++++++---
 3 files changed, 41 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6519
Fusion-Task-Lineage: c6f3197f-5474-482b-a63b-9d20d3af3aa9
2026-06-16 22:59:08 -07:00
gsxdsm
34ada00f80 FN-6345: show user steering messages in task chat
Display user steering comments alongside agent output and wake immediate-response agents when new messages are sent.

- Render persisted and optimistic user messages in the task chat transcript with mobile styling.
- Propagate updated task detail data after sends and roll back optimistic messages on failures.
- Cover steering route validation, immediate heartbeat wakeups, chat rendering, and workflow alias round-trips.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-6345-task-chat-user-messages.md      |   5 +
 packages/dashboard/app/components/TaskChatTab.css  |  32 ++++
 packages/dashboard/app/components/TaskChatTab.tsx  | 170 ++++++++++++++++-----
 .../dashboard/app/components/TaskDetailModal.tsx   |   8 +-
 .../app/components/__tests__/TaskChatTab.test.tsx  | 150 +++++++++++++++++-
 .../app/components/__tests__/board-mobile.test.tsx |   2 +-
 .../__tests__/workflow-flow-mapping.test.ts        |   4 +-
 .../app/components/workflow-flow-mapping.ts        |   4 +-
 .../src/__tests__/routes-tasks-ops.test.ts         |  86 +++++++++++
 9 files changed, 414 insertions(+), 47 deletions(-)

Fusion-Task-Id: FN-6345

Fusion-Task-Lineage: 0355cc67-bd23-4e90-9034-bbaae277cfd6
2026-06-13 02:23:27 -07:00
gsxdsm
ac8ad834ce Merge branch 'main' into fix/fn-352-no-commit-coordination 2026-06-12 21:39:07 -07:00
Phil Larson
3a729f53a9 fix(FN-352): allow no-commit coordination completion 2026-06-12 15:51:50 -07:00
Phil Larson
834ea3c227 fix(FN-343): address follow-up review findings 2026-06-12 15:51:50 -07:00
Phil Larson
16d71e6773 fix(FN-343): address PR review feedback 2026-06-12 15:51:50 -07:00
Phil Larson
2c8e9c6439 fix(dashboard): map merge workflow nodes in editor 2026-06-12 15:51:50 -07:00
Phil Larson
02a85818c1 fix(FN-343): address follow-up review findings 2026-06-12 15:51:15 -07:00
Phil Larson
2ac9968ea5 fix(FN-343): address PR review feedback 2026-06-12 15:51:15 -07:00
Phil Larson
271c0be231 fix(dashboard): map merge workflow nodes in editor 2026-06-12 15:51:14 -07:00
gsxdsm
22d6562494 FN-6261: map IR-only workflow nodes to editor types
Normalize graph-only workflow node kinds before rendering them in the workflow editor.\n\n- Add a typed mapping from IR-only merge, retry, recovery, branch, and PR node kinds to supported editor node kinds.\n- Keep same-kind editor node handling type-safe and fall back unknown graph-only kinds to prompt nodes.\n- Cover policy-node, foreach-template, merge-seam, and PR special cases in workflow-flow mapping tests.\n\nFiles changed:\n .../__tests__/workflow-flow-mapping.test.ts        | 101 ++++++++++++++++++++-\n .../app/components/workflow-flow-mapping.ts        |  71 ++++++++++-----\n 2 files changed, 149 insertions(+), 23 deletions(-)

Fusion-Task-Id: FN-6261

Fusion-Task-Lineage: 7c7ccb71-77b6-4759-95ab-6f577473fdb6
2026-06-11 22:55:48 -07:00
gsxdsm
143a724a99 FN-6239: map workflow merge nodes in the editor
Render workflow-owned merge and recovery IR nodes with existing dashboard editor shapes.

- Map merge gate, retry, recovery, and branch-group IR node kinds to supported editor node types.
- Update the workflow mapping assertion for merge-attempt failure routing.
- Quarantine the flaky QuickEntryBox dashboard test without reintroducing the rescued self-healing quarantine entry.

Files changed:
 .../app/components/__tests__/WorkflowNodeEditor.test.tsx    |  2 +-
 packages/dashboard/app/components/workflow-flow-mapping.ts  | 13 +++++++++++++
 packages/dashboard/vitest.config.ts                         |  2 +-
 scripts/lib/test-quarantine.json                            |  5 +++++
 4 files changed, 20 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6239

Fusion-Task-Lineage: 2ab31bd4-6fd7-4b71-b7cd-6cc99cce3bbb
2026-06-11 21:22:06 -07:00
gsxdsm
40c0048f72 FN-6024: fix built-in workflow graph edges
Ensure built-in workflow editor graphs render connected, clickable edges above swimlane backgrounds.

- add explicit React Flow z-index layering so built-in workflow edges render above column bands while nodes stay interactive
- keep swimlane band backgrounds translucent and preserve failure/rework edge styling for read-only built-in workflows
- expand workflow editor tests to cover built-in/custom edge projection, handle rendering, and CSS edge visibility contracts
- document the built-in workflow editor edge behavior and add a patch changeset for @runfusion/fusion

Files changed:
 .changeset/FN-6024-built-in-workflow-edges.md      |   5 +
 docs/dashboard-guide.md                            |   1 +
 packages/dashboard/app/components/WorkflowNodeEditor.css          |   2 +-
 packages/dashboard/app/components/__tests__/WorkflowNodeEditor.css.test.ts       |  25 ++++ -
 packages/dashboard/app/components/__tests__/WorkflowNodeEditor.test.tsx          | 106 ++++++++++++++++++++-
 packages/dashboard/app/components/workflow-flow-mapping.ts        |  15 ++-
 6 files changed, 145 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-6024

Fusion-Task-Lineage: 7151d59b-b591-4642-95ca-93cc35198d41
2026-06-08 13:32:58 -07:00
gsxdsm
75867c4002 fix(FN-0000): address workflow loop review feedback 2026-06-08 00:19:50 -07:00
gsxdsm
a504238d26 feat(FN-0000): add workflow loop nodes 2026-06-07 23:56:25 -07:00
gsxdsm
1922b5efc2 merge: main (workflow editor 109 / cli_sessions 110-111 / workflow_settings 112) — renumber PR-entity migration to 113, union core exports, TaskCard prNode + cliSessionState badges, executor PrNodeDeps + CliAgentRuntime options 2026-06-05 23:06:46 -07:00
gsxdsm
8a6a67a305 feat(pr): dashboard PR view, routes, node-state UI + user controls (U7)
Adds /api/pull-requests routes (list, detail, merge/approve/retry/close/
automerge — all re-fetch authoritative state before acting), a
PullRequestView rendering every entity state distinctly (creating/failed/
unverified/responding/await-review/conflict) with the action bar, live
auto-merge gate reason, and conflict CTA; TaskCard PR node-state badge +
link; and the R16 column-move-backward guard. User actions route through
the existing releaseHeldTaskByEvent primitives. Maps the new PR node kinds
in the workflow editor's kind resolver. 13 route tests + lazy-view guard
green; component test runs in CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 22:18:34 -07:00
gsxdsm
6d16c07197 merge: main (editor consolidation #1433, fast-tests, learnings) — renumber workflow_settings migration to 110, settings panel joins the sidebar disclosures, full-workspace literal sweep 2026-06-05 15:23:15 -07:00
gsxdsm
11fb9f1325 merge main: per-column agent assignment (binding validation, policy-escalation handshake, override notes) into workflow editor consolidation
Resolved 4 conflicts preserving both feature sets:
- WorkflowNodeEditor.tsx: kept card-node/edge/dialog/dirty-guard/auto-layout/
  onboarding/template/AI-edit features; wired main's columnAgentsEnabled flag
  gate, override-column agent registry load, and policy-escalation save retry
  (finishSave helper wraps both update payloads).
- WorkflowNodeEditor.test.tsx: kept U2/U4/AI-design describes plus main's U6
  column-agent describe; merged api mock + import lists.
- register-workflow-routes.ts: merged import sets (design DI seam + column-agent
  validators).
- agent-tools.ts: strip-approval-flags and column-agent binding assertion now
  both run in create/update tools.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:43:02 -07:00
gsxdsm
b7fa21c25e merge: main (column-agent assignment #1432) into workflow-settings — union executor/agent-tools/routes imports, both tool-description texts, both route helpers 2026-06-05 14:41:43 -07:00
gsxdsm
563cb5b372 Address PR review feedback (#1433)
- always dispose AI design session (try/finally) + rejecting-agent test
- prune expired design rate-limit entries per check
- apply workflowId precedence in createTaskWithReservedId
- compare-and-set migrated project default (no pre-transaction snapshot)
- reject fragment ids in setDefaultWorkflowId at the write boundary
- guard stripApprovalBypassFlags against malformed template nodes
- hoist duplicate stepToFragmentIr call in migration loop
- auto-layout preserves unplaced nodes (strictColumnForY)
- second same-pair connection births a failure edge for condition-capable sources
- insertFragment expands foreach templates into child nodes (lossless round-trip)
- copyIrWithFreshIds remaps namespaced foreach child layout keys
- discard stale AI-edit results after workflow switch
- i18n: returnEmptyString:false so empty locale placeholders fall back to en
- test fixes: schema-version titles, migrate idempotency assertion, TaskForm post-resolve + cross-mode regression, deterministic waits
2026-06-05 13:56:05 -07:00
gsxdsm
75ebe23b4f feat(dashboard): column agent picker, override visibility, write-time validation
U6: WorkflowColumnPanel agent picker + defer/override toggle with specified
interaction states (flags-off hint, loading, fetch-error, stale-agent
warning, bound-column badge); WorkflowNodeEditor overridden-by-column-agent
note + stale-id treatment; assertColumnAgentsExist + confirmPolicyEscalation
gate (R13) on workflow save routes; flowToIr now preserves column agent
bindings through the editor round-trip.
2026-06-04 23:53:22 -07:00
gsxdsm
7bbb8b650a feat(dashboard): fragment insertion, seam-conflict, and graph-copy helpers 2026-06-04 23:02:50 -07:00
gsxdsm
9089e18705 feat(dashboard): WorkflowSettingsPanel — definitions/values tabs, setting-value routes, flow-mapping round-trip 2026-06-04 22:57:01 -07:00
gsxdsm
f67a2542b9 feat(dashboard): node/edge deletion with safe cascade semantics 2026-06-04 19:45:44 -07:00
gsxdsm
ffc4d8a6ed feat(dashboard): success/failure edge authoring with cycle guard and interpreter-only banner 2026-06-04 19:35:34 -07:00
gsxdsm
297a00d3de feat(dashboard): redesign workflow nodes as card-style with config summaries 2026-06-04 19:26:55 -07:00
gsxdsm
3ebaa321f8 fix(review): apply code-review fixes — runId/foreachNodeId wiring, worktree-leak cleanup, rework re-execution, instance pruning, SIGKILL fallback, type dedup, board memo split, agent-native field-schema context + fn_workflow_get
17 findings from 12-reviewer code review applied:
- P1 runId trio (pin-probe/resume/markIntegrated used placeholder runId; 4-reviewer corroboration) + production-wiring tests
- P1 worktree/branch release on instance failure/exhaustion/abort
- P2 runGraphTaskStep no longer masks step-session failures; rejected memo cleared so rework re-executes
- P2 clearStaleInstanceStates wired at run start/end (mirrors branch pruning)
- P2 code-node timeout killSignal SIGKILL; dead template-recursion removed
- P1/P2 field-type re-declarations replaced with @fusion/core imports (stale comments removed)
- P2 Board memo split + TaskCard comparator stringify guard + modal prop-driven field defs
- HIGH agent-native: executor prompt injects custom-field schema/values; self-correcting rejection text; fn_workflow_get; fn_task_update bare-call guard; integration-conflict task log

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:01:55 -07:00
gsxdsm
e87e745379 feat(dashboard): WorkflowFieldsPanel — field-definition authoring with live badge preview (U13 completion)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 12:44:43 -07:00
gsxdsm
ad5cd579be feat(dashboard): U8 — node editor authoring for foreach/step-review/parse-steps/code, rework edge inspector, template round-trip
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 11:50:45 -07:00
gsxdsm
e5a0a199ea feat(dashboard): node editor authors columns, traits, hold and split/join nodes with inline validation (U10) 2026-06-04 01:46:51 -07:00
gsxdsm
eb67d08213 Address PR review feedback (#1363)
Greptile + CodeRabbit findings across core/engine/dashboard. Stale findings
(written against earlier commits) verified and skipped; valid ones fixed.

Engine:
- await-input: do not clear pausedReason in the /input route (the node's
  marker must survive unpause); the node clears it after consuming input.
  Embed a colon-free epoch watermark in the marker so only post-pause steering
  comments count as the reply (ISO timestamps collided with the colon
  separator and the dashboard question parser).
- gate nodes without a registered runner now fail closed (throw) instead of
  silently passing.
- a thrown interpreter error in maybeExecuteWorkflowGraph now falls back to the
  legacy pipeline instead of stranding the task in-progress.
- approved-CLI path clears the stale awaiting-cli-approval status/marker.

Core:
- persist+cascade workflow selection: purge task_workflow_selection rows and
  compiled workflow_steps on physical task deletes; migration 105 cleans
  already-orphaned rows; catch-cleanup for materialized steps when the owner
  write fails; WF-id allocation now in a BEGIN IMMEDIATE transaction.
- compiler validates the canonical execute->review->merge seam order (rejects
  duplicate/misordered seams).
- disk-backed reopen round-trip + tightened updatedAt/list assertions.

Dashboard:
- WorkflowSelector clears stale default/options across project changes and on
  fetch failure; InlineCreateCard/NewTaskModal reset the workflow on all
  clear/discard paths and include it in dirty-state.
- WorkflowNodeEditor: config-key deletion now persists; removed an invalid
  eslint-disable that was itself a hard lint error.
- TaskCard: single status badge for awaiting-input (no duplicate).
- WorkflowResultsTab: reset paused-action UI between pauses; surface
  resume/approve failures inline.
- TaskDetailModal: treat awaiting-user-input/awaiting-cli-approval/paused as
  not-in-progress for the live-log subscription.
- workflow-flow-mapping: don't write synthetic node names back into IR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:32:12 -07:00
gsxdsm
5502025001 fix: apply safe_auto code-review fixes
- runner: report visited nodes on mid-run interpreter errors
- handleGraphFailure: clear completed-task watchdog + untrack stuck detector
- getDefaultWorkflowId: use getSettingsFast (drop per-create listWorkflowSteps read)
- db: index workflows(createdAt) in base schema + migration 103
- store: hoist workflow-definition type imports; mapping: single editorKind call
- executor: drop backwards TaskDetail->Task cast in execute seam
2026-06-03 12:26:49 -07:00
gsxdsm
d071aecda6 feat(dashboard): visual graph node editor for workflows (U6, U7)
Add a React Flow (@xyflow/react) based WorkflowNodeEditor: a lazy-loaded modal
with a workflow list, a node palette (prompt/script/gate/merge-boundary),
drag-to-connect edges, a per-node inspector, and save with compile-validation
that surfaces non-linear graphs as a banner. Pure irToFlow/flowToIr mapping
round-trips the v1 IR plus editor layout. Reachable via a Graph editor button in
the Workflow Steps manager; mounted in AppModals behind a new modal-manager
flag. Adds a vendor-reactflow Vite chunk and a feature changeset.
2026-06-03 09:45:26 -07:00