@flowdrop/flowdrop 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +68 -24
  2. package/dist/adapters/WorkflowAdapter.js +2 -22
  3. package/dist/adapters/agentspec/autoLayout.d.ts +51 -5
  4. package/dist/adapters/agentspec/autoLayout.js +120 -23
  5. package/dist/chat/commandClassifier.d.ts +19 -0
  6. package/dist/chat/commandClassifier.js +30 -0
  7. package/dist/chat/index.d.ts +27 -0
  8. package/dist/chat/index.js +32 -0
  9. package/dist/chat/responseParser.d.ts +21 -0
  10. package/dist/chat/responseParser.js +87 -0
  11. package/dist/commands/batch.d.ts +18 -0
  12. package/dist/commands/batch.js +56 -0
  13. package/dist/commands/executor.d.ts +37 -0
  14. package/dist/commands/executor.js +1044 -0
  15. package/dist/commands/index.d.ts +14 -0
  16. package/dist/commands/index.js +17 -0
  17. package/dist/commands/parser.d.ts +16 -0
  18. package/dist/commands/parser.js +278 -0
  19. package/dist/commands/positioner.d.ts +19 -0
  20. package/dist/commands/positioner.js +33 -0
  21. package/dist/commands/storeIntegration.svelte.d.ts +16 -0
  22. package/dist/commands/storeIntegration.svelte.js +67 -0
  23. package/dist/commands/types.d.ts +343 -0
  24. package/dist/commands/types.js +45 -0
  25. package/dist/components/App.svelte +351 -12
  26. package/dist/components/App.svelte.d.ts +3 -0
  27. package/dist/components/CanvasController.svelte +38 -0
  28. package/dist/components/CanvasController.svelte.d.ts +32 -0
  29. package/dist/components/ConfigMappingRow.svelte +130 -0
  30. package/dist/components/ConfigMappingRow.svelte.d.ts +8 -0
  31. package/dist/components/ConfigPanel.svelte +56 -7
  32. package/dist/components/ConfigPanel.svelte.d.ts +2 -0
  33. package/dist/components/FlowDropEdge.svelte +2 -10
  34. package/dist/components/LogsSidebar.svelte +5 -5
  35. package/dist/components/NodeSidebar.svelte +15 -49
  36. package/dist/components/NodeSwapPicker.svelte +537 -0
  37. package/dist/components/NodeSwapPicker.svelte.d.ts +16 -0
  38. package/dist/components/PortMappingRow.svelte +209 -0
  39. package/dist/components/PortMappingRow.svelte.d.ts +12 -0
  40. package/dist/components/SwapMappingEditor.svelte +550 -0
  41. package/dist/components/SwapMappingEditor.svelte.d.ts +12 -0
  42. package/dist/components/WorkflowEditor.svelte +99 -4
  43. package/dist/components/WorkflowEditor.svelte.d.ts +8 -0
  44. package/dist/components/chat/AIChatPanel.svelte +658 -0
  45. package/dist/components/chat/AIChatPanel.svelte.d.ts +13 -0
  46. package/dist/components/chat/CommandPreview.svelte +184 -0
  47. package/dist/components/chat/CommandPreview.svelte.d.ts +9 -0
  48. package/dist/components/console/CommandConsole.stories.svelte +93 -0
  49. package/dist/components/console/CommandConsole.stories.svelte.d.ts +27 -0
  50. package/dist/components/console/CommandConsole.svelte +259 -0
  51. package/dist/components/console/CommandConsole.svelte.d.ts +11 -0
  52. package/dist/components/console/ConsoleAutocomplete.svelte +139 -0
  53. package/dist/components/console/ConsoleAutocomplete.svelte.d.ts +21 -0
  54. package/dist/components/console/ConsoleInput.svelte +712 -0
  55. package/dist/components/console/ConsoleInput.svelte.d.ts +16 -0
  56. package/dist/components/console/ConsoleOutput.svelte +121 -0
  57. package/dist/components/console/ConsoleOutput.svelte.d.ts +11 -0
  58. package/dist/components/console/formatters.d.ts +26 -0
  59. package/dist/components/console/formatters.js +118 -0
  60. package/dist/components/interrupt/index.d.ts +1 -0
  61. package/dist/components/interrupt/index.js +1 -0
  62. package/dist/config/endpoints.d.ts +8 -0
  63. package/dist/config/endpoints.js +5 -0
  64. package/dist/core/index.d.ts +5 -0
  65. package/dist/core/index.js +9 -0
  66. package/dist/editor/index.d.ts +3 -1
  67. package/dist/editor/index.js +4 -2
  68. package/dist/helpers/proximityConnect.js +8 -1
  69. package/dist/helpers/workflowEditorHelper.d.ts +3 -53
  70. package/dist/helpers/workflowEditorHelper.js +13 -228
  71. package/dist/playground/index.d.ts +1 -1
  72. package/dist/playground/index.js +1 -1
  73. package/dist/schemas/v1/workflow.schema.json +107 -22
  74. package/dist/services/chatService.d.ts +65 -0
  75. package/dist/services/chatService.js +131 -0
  76. package/dist/services/historyService.d.ts +6 -4
  77. package/dist/services/historyService.js +21 -6
  78. package/dist/stores/interruptStore.svelte.js +6 -1
  79. package/dist/stores/playgroundStore.svelte.d.ts +1 -1
  80. package/dist/stores/playgroundStore.svelte.js +11 -2
  81. package/dist/stores/portCoordinateStore.svelte.d.ts +4 -0
  82. package/dist/stores/portCoordinateStore.svelte.js +20 -26
  83. package/dist/stores/workflowStore.svelte.d.ts +31 -2
  84. package/dist/stores/workflowStore.svelte.js +84 -64
  85. package/dist/types/chat.d.ts +63 -0
  86. package/dist/types/chat.js +9 -0
  87. package/dist/types/events.d.ts +28 -2
  88. package/dist/types/events.js +1 -0
  89. package/dist/types/index.d.ts +8 -0
  90. package/dist/types/settings.d.ts +6 -0
  91. package/dist/types/settings.js +3 -0
  92. package/dist/utils/edgeStyling.d.ts +42 -0
  93. package/dist/utils/edgeStyling.js +176 -0
  94. package/dist/utils/nodeIds.d.ts +31 -0
  95. package/dist/utils/nodeIds.js +42 -0
  96. package/dist/utils/nodeSwap.d.ts +221 -0
  97. package/dist/utils/nodeSwap.js +686 -0
  98. package/package.json +6 -1
  99. package/dist/helpers/nodeLayoutHelper.d.ts +0 -14
  100. package/dist/helpers/nodeLayoutHelper.js +0 -19
@@ -28,6 +28,7 @@
28
28
  WorkflowEdge,
29
29
  } from "../types/index.js";
30
30
  import CanvasBanner from "./CanvasBanner.svelte";
31
+ import CanvasController from "./CanvasController.svelte";
31
32
  import FlowDropZone from "./FlowDropZone.svelte";
32
33
  import EdgeRefresher from "./EdgeRefresher.svelte";
33
34
  import { tick, untrack } from "svelte";
@@ -65,6 +66,7 @@
65
66
  import { logger } from "../utils/logger.js";
66
67
  import { validateWorkflowData } from "../utils/validation.js";
67
68
  import { createEditorStateMachine } from "../stores/editorStateMachine.svelte.js";
69
+ import Icon from "@iconify/svelte";
68
70
 
69
71
  interface Props {
70
72
  nodes?: NodeMetadata[];
@@ -84,6 +86,9 @@
84
86
  >;
85
87
  // Pipeline ID for fetching node execution info from jobs
86
88
  pipelineId?: string;
89
+ // Console toggle
90
+ consoleOpen?: boolean;
91
+ onToggleConsole?: () => void;
87
92
  }
88
93
 
89
94
  let props: Props = $props();
@@ -595,11 +600,13 @@
595
600
  });
596
601
 
597
602
  /**
598
- * Check if workflow has cycles
603
+ * Cached cycle check skips DFS during drag/connect via FSM suppressEffect guard.
604
+ * $derived deduplicates the boolean result so the template only re-renders on change.
599
605
  */
600
- function checkWorkflowCycles(): boolean {
606
+ let hasCycles = $derived.by(() => {
607
+ if (machine.permissions.suppressEffect) return false;
601
608
  return WorkflowOperationsHelper.checkWorkflowCycles(flowNodes, flowEdges);
602
- }
609
+ });
603
610
 
604
611
  /**
605
612
  * Handle drop event and add new node to canvas
@@ -688,6 +695,9 @@
688
695
  */
689
696
  let nodeIdToRefresh = $state<string | null>(null);
690
697
 
698
+ // Canvas viewport controller ref (rendered inside SvelteFlowProvider)
699
+ let canvasControllerRef: CanvasController | undefined = $state();
700
+
691
701
  /**
692
702
  * Update a node's data in the local editor state.
693
703
  * Called by App.svelte AFTER it has already updated the global store via
@@ -733,6 +743,32 @@
733
743
  nodeIdToRefresh = nodeId;
734
744
  }
735
745
 
746
+ // Canvas viewport methods (forwarded to CanvasController inside SvelteFlowProvider)
747
+
748
+ export function canvasFitView(): void {
749
+ canvasControllerRef?.canvasFitView();
750
+ }
751
+
752
+ export function canvasZoomIn(): void {
753
+ canvasControllerRef?.canvasZoomIn();
754
+ }
755
+
756
+ export function canvasZoomOut(): void {
757
+ canvasControllerRef?.canvasZoomOut();
758
+ }
759
+
760
+ export function canvasZoomTo(level: number): void {
761
+ canvasControllerRef?.canvasZoomTo(level);
762
+ }
763
+
764
+ export function canvasPanTo(x: number, y: number): void {
765
+ canvasControllerRef?.canvasPanTo(x, y);
766
+ }
767
+
768
+ export function canvasResetView(): void {
769
+ canvasControllerRef?.canvasResetView();
770
+ }
771
+
736
772
  /**
737
773
  * Callback when edge refresh is complete
738
774
  */
@@ -785,6 +821,9 @@
785
821
  <svelte:window onkeydown={handleKeydown} />
786
822
 
787
823
  <SvelteFlowProvider>
824
+ <!-- Canvas viewport controller - provides fitView, zoom, pan methods -->
825
+ <CanvasController bind:this={canvasControllerRef} />
826
+
788
827
  <!-- EdgeRefresher component - handles updateNodeInternals calls -->
789
828
  <EdgeRefresher
790
829
  {nodeIdToRefresh}
@@ -838,6 +877,18 @@
838
877
  fitView={getEditorSettings().fitViewOnLoad}
839
878
  >
840
879
  <Controls />
880
+ {#if !props.readOnly && !props.lockWorkflow && props.onToggleConsole}
881
+ <button
882
+ class="flowdrop-console-toggle"
883
+ class:flowdrop-console-toggle--active={props.consoleOpen}
884
+ onclick={props.onToggleConsole}
885
+ aria-label="Command Console (`)"
886
+ title="Command Console (`)"
887
+ type="button"
888
+ >
889
+ <Icon icon="heroicons:command-line" width="18" height="18" />
890
+ </button>
891
+ {/if}
841
892
  <!-- Always render Background for consistent bg color in dark/light mode -->
842
893
  <Background
843
894
  gap={getEditorSettings().gridSize}
@@ -894,7 +945,7 @@
894
945
  >{flowEdges.length} connections</span
895
946
  >
896
947
 
897
- {#if checkWorkflowCycles()}
948
+ {#if hasCycles}
898
949
  <span class="flowdrop-text--xs flowdrop-text--gray">•</span>
899
950
  <span
900
951
  class="flowdrop-text--xs flowdrop-font--medium flowdrop-text--error"
@@ -964,6 +1015,50 @@
964
1015
  justify-content: space-between;
965
1016
  }
966
1017
 
1018
+ .flowdrop-console-toggle {
1019
+ position: absolute;
1020
+ bottom: 140px;
1021
+ left: 12px;
1022
+ z-index: 5;
1023
+ display: flex;
1024
+ align-items: center;
1025
+ justify-content: center;
1026
+ width: 2rem;
1027
+ height: 2rem;
1028
+ border: 1px solid var(--fd-border);
1029
+ border-radius: var(--fd-radius-md);
1030
+ background-color: var(--fd-background);
1031
+ color: var(--fd-muted-foreground);
1032
+ cursor: pointer;
1033
+ box-shadow: var(--fd-shadow-sm);
1034
+ transition:
1035
+ color var(--fd-transition-fast),
1036
+ background-color var(--fd-transition-fast),
1037
+ box-shadow var(--fd-transition-fast);
1038
+ }
1039
+
1040
+ .flowdrop-console-toggle:hover {
1041
+ color: var(--fd-foreground);
1042
+ background-color: var(--fd-subtle);
1043
+ box-shadow: var(--fd-shadow-md);
1044
+ }
1045
+
1046
+ .flowdrop-console-toggle:focus {
1047
+ outline: none;
1048
+ box-shadow: 0 0 0 2px var(--fd-ring);
1049
+ }
1050
+
1051
+ .flowdrop-console-toggle--active {
1052
+ color: var(--fd-primary);
1053
+ background-color: var(--fd-primary-muted);
1054
+ border-color: var(--fd-primary);
1055
+ }
1056
+
1057
+ .flowdrop-console-toggle--active:hover {
1058
+ color: var(--fd-primary);
1059
+ background-color: var(--fd-primary-muted);
1060
+ }
1061
+
967
1062
  :global(.flowdrop-workflow-editor .svelte-flow__node:hover) {
968
1063
  transform: translateY(-2px);
969
1064
  }
@@ -14,10 +14,18 @@ interface Props {
14
14
  readOnly?: boolean;
15
15
  nodeStatuses?: Record<string, "pending" | "running" | "completed" | "error">;
16
16
  pipelineId?: string;
17
+ consoleOpen?: boolean;
18
+ onToggleConsole?: () => void;
17
19
  }
18
20
  declare const WorkflowEditor: import("svelte").Component<Props, {
19
21
  updateNodeData: (nodeId: string, dataUpdates: Partial<WorkflowNodeType["data"]>) => void;
20
22
  refreshEdgePositions: (nodeId: string) => Promise<void>;
23
+ canvasFitView: () => void;
24
+ canvasZoomIn: () => void;
25
+ canvasZoomOut: () => void;
26
+ canvasZoomTo: (level: number) => void;
27
+ canvasPanTo: (x: number, y: number) => void;
28
+ canvasResetView: () => void;
21
29
  }, "">;
22
30
  type WorkflowEditor = ReturnType<typeof WorkflowEditor>;
23
31
  export default WorkflowEditor;