From 04d2ef419dfe64c99da55ecead545cb1cc5cf185 Mon Sep 17 00:00:00 2001
From: centdix <40307056+centdix@users.noreply.github.com>
Date: Sat, 1 Nov 2025 15:17:56 +0100
Subject: [PATCH] feat(flow): Add graph diff visualizer (#6948)
* graph mode
* show colors
* show module diff viewer button
* better diff logic
* small width merge graph diff
* invert logic
* simplify
* better logic
* put removed modules in initial position
* nit
* nit
* fix conflicting ids
* fix
* add shadowed for after
* better position logic
* fix
* cleaning
* use splitpanes
* add toggle
* fix
* sync move
* icons
* handle zoom
* left header snippet
* cleaning
* cleaning
* remove stats
* big cleaning
* fix
* fix
* fix
* remove not working logic
* invert logic
* nit
* use in deploymentui
* fix typo
* no custom style
* handle nested
* simpler logic
* fix
* fix
---
.../src/lib/components/DeployWorkspace.svelte | 4 +-
frontend/src/lib/components/DiffDrawer.svelte | 68 ++-
.../lib/components/FlowGraphDiffViewer.svelte | 288 +++++++++
.../lib/components/copilot/chat/flow/core.ts | 2 +-
.../lib/components/copilot/chat/flow/utils.ts | 6 +
frontend/src/lib/components/flows/flowDiff.ts | 573 ++++++++++++++++++
.../flows/map/FlowModuleSchemaItem.svelte | 24 +-
.../lib/components/flows/map/MapItem.svelte | 13 +
.../components/flows/map/VirtualItem.svelte | 4 +-
.../lib/components/graph/FlowGraphV2.svelte | 120 ++--
.../graph/ViewportSynchronizer.svelte | 63 ++
.../components/graph/graphBuilder.svelte.ts | 14 +-
.../graph/renderers/nodes/InputNode.svelte | 16 +-
.../graph/renderers/nodes/ModuleNode.svelte | 2 +
.../flows/edit/[...path]/+page.svelte | 2 +-
15 files changed, 1137 insertions(+), 62 deletions(-)
create mode 100644 frontend/src/lib/components/FlowGraphDiffViewer.svelte
create mode 100644 frontend/src/lib/components/flows/flowDiff.ts
create mode 100644 frontend/src/lib/components/graph/ViewportSynchronizer.svelte
diff --git a/frontend/src/lib/components/DeployWorkspace.svelte b/frontend/src/lib/components/DeployWorkspace.svelte
index d56a9819e1..9cccd0cb29 100644
--- a/frontend/src/lib/components/DeployWorkspace.svelte
+++ b/frontend/src/lib/components/DeployWorkspace.svelte
@@ -60,6 +60,7 @@
let diffDrawer: DiffDrawer | undefined = $state(undefined)
let notSet: boolean | undefined = $state(undefined)
+ let isFlow: boolean | undefined = $state(undefined)
async function reload(path: string) {
try {
@@ -638,7 +639,7 @@
{:else if seeTarget == true}
All related deployable items
-
+
{#each dependencies ?? [] as { kind, path, include }, i}
{@const statusPath = computeStatusPath(kind, path)}
@@ -683,6 +684,7 @@
class="text-blue-600 font-normal mt-1"
onclick={() => {
showDiff(kind, path)
+ isFlow = kind === 'flow'
}}>diff
{/if}
{
if (!data || !diffType) return undefined
@@ -30,14 +31,16 @@
? 'metadata'
: undefined
})
+
let diffViewer: Drawer | undefined = $state(undefined)
interface Props {
restoreDeployed?: () => Promise
restoreDraft?: () => Promise
+ isFlow?: boolean
}
- let { restoreDeployed = async () => {}, restoreDraft = async () => {} }: Props = $props()
+ let { restoreDeployed = undefined, restoreDraft = undefined, isFlow = false }: Props = $props()
let data:
| {
@@ -158,7 +161,7 @@
unifiedSize="md"
variant="default"
wrapperClasses="self-start"
- on:click={restoreDraft}
+ onClick={restoreDraft}
disabled={orderedJsonStringify(data.draft) === orderedJsonStringify(data.current)}
>Restore to latest saved draft
@@ -167,7 +170,7 @@
unifiedSize="md"
variant="default"
wrapperClasses="self-start"
- on:click={restoreDeployed}
+ onClick={restoreDeployed}
disabled={!data.draft &&
orderedJsonStringify(data.deployed) === orderedJsonStringify(data.current)}
>
@@ -228,19 +231,50 @@
/>
{/await}
{:else if contentType === 'metadata'}
- {#await import('$lib/components/DiffEditor.svelte')}
-
- {:then Module}
-
- {/await}
+ {#if isFlow}
+
+
+
+
+ {#if flowdiffMode === 'yaml'}
+ {#await import('$lib/components/DiffEditor.svelte')}
+
+ {:then Module}
+
+ {/await}
+ {:else if flowdiffMode === 'graph'}
+ {#await import('$lib/components/FlowGraphDiffViewer.svelte')}
+
+ {:then Module}
+
+ {/await}
+ {/if}
+ {:else}
+ {#await import('$lib/components/DiffEditor.svelte')}
+
+ {:then Module}
+
+ {/await}
+ {/if}
{/if}
{/key}
@@ -264,7 +298,7 @@
{#if data?.button}