@d34dman/flowdrop 0.0.60 → 0.0.62

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 (207) hide show
  1. package/README.md +6 -0
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -1
  4. package/dist/api/client.d.ts +4 -0
  5. package/dist/api/client.js +6 -1
  6. package/dist/api/enhanced-client.js +7 -6
  7. package/dist/components/App.svelte +143 -219
  8. package/dist/components/CanvasBanner.stories.svelte +25 -0
  9. package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
  10. package/dist/components/CanvasBanner.svelte +2 -2
  11. package/dist/components/ConfigForm.svelte +37 -36
  12. package/dist/components/ConfigPanel.stories.svelte +38 -0
  13. package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
  14. package/dist/components/ConfigPanel.svelte +2 -2
  15. package/dist/components/ConnectionLine.svelte +2 -2
  16. package/dist/components/FlowDropZone.svelte +18 -2
  17. package/dist/components/FlowDropZone.svelte.d.ts +2 -0
  18. package/dist/components/LoadingSpinner.stories.svelte +30 -0
  19. package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
  20. package/dist/components/Logo.stories.svelte +22 -0
  21. package/dist/components/Logo.stories.svelte.d.ts +27 -0
  22. package/dist/components/Logo.svelte +33 -13
  23. package/dist/components/Logo.svelte.d.ts +1 -1
  24. package/dist/components/MarkdownDisplay.stories.svelte +21 -0
  25. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
  26. package/dist/components/MarkdownDisplay.svelte +4 -3
  27. package/dist/components/Navbar.stories.svelte +41 -0
  28. package/dist/components/Navbar.stories.svelte.d.ts +27 -0
  29. package/dist/components/Navbar.svelte +4 -4
  30. package/dist/components/NodeSidebar.svelte +12 -12
  31. package/dist/components/NodeStatusOverlay.stories.svelte +74 -0
  32. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
  33. package/dist/components/PipelineStatus.svelte +11 -4
  34. package/dist/components/PortCoordinateTracker.svelte +1 -1
  35. package/dist/components/SchemaForm.stories.svelte +101 -0
  36. package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
  37. package/dist/components/SchemaForm.svelte +17 -12
  38. package/dist/components/SettingsModal.svelte +3 -3
  39. package/dist/components/SettingsPanel.svelte +23 -22
  40. package/dist/components/StatusIcon.stories.svelte +60 -0
  41. package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
  42. package/dist/components/StatusIcon.svelte +7 -0
  43. package/dist/components/StatusLabel.stories.svelte +17 -0
  44. package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
  45. package/dist/components/ThemeToggle.stories.svelte +25 -0
  46. package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
  47. package/dist/components/ThemeToggle.svelte +8 -8
  48. package/dist/components/UniversalNode.svelte +1 -1
  49. package/dist/components/WorkflowEditor.svelte +298 -294
  50. package/dist/components/form/FormAutocomplete.svelte +20 -19
  51. package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
  52. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
  53. package/dist/components/form/FormField.svelte +3 -3
  54. package/dist/components/form/FormFieldLight.svelte +2 -2
  55. package/dist/components/form/FormFieldWrapper.stories.svelte +31 -0
  56. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
  57. package/dist/components/form/FormFieldset.svelte +7 -7
  58. package/dist/components/form/FormNumberField.stories.svelte +33 -0
  59. package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
  60. package/dist/components/form/FormRangeField.stories.svelte +31 -0
  61. package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
  62. package/dist/components/form/FormSelect.stories.svelte +50 -0
  63. package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
  64. package/dist/components/form/FormTemplateEditor.svelte +2 -1
  65. package/dist/components/form/FormTextField.stories.svelte +30 -0
  66. package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
  67. package/dist/components/form/FormTextarea.stories.svelte +31 -0
  68. package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
  69. package/dist/components/form/FormToggle.stories.svelte +30 -0
  70. package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
  71. package/dist/components/form/FormUISchemaRenderer.svelte +1 -1
  72. package/dist/components/form/types.d.ts +15 -47
  73. package/dist/components/interrupt/ChoicePrompt.stories.svelte +43 -0
  74. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
  75. package/dist/components/interrupt/ChoicePrompt.svelte +24 -24
  76. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +49 -0
  77. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
  78. package/dist/components/interrupt/ConfirmationPrompt.svelte +19 -19
  79. package/dist/components/interrupt/FormPrompt.svelte +15 -15
  80. package/dist/components/interrupt/InterruptBubble.svelte +202 -236
  81. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +1 -1
  82. package/dist/components/interrupt/ReviewPrompt.stories.svelte +46 -0
  83. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
  84. package/dist/components/interrupt/ReviewPrompt.svelte +842 -0
  85. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
  86. package/dist/components/interrupt/TextInputPrompt.stories.svelte +34 -0
  87. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
  88. package/dist/components/interrupt/TextInputPrompt.svelte +21 -21
  89. package/dist/components/nodes/GatewayNode.stories.svelte +76 -0
  90. package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
  91. package/dist/components/nodes/GatewayNode.svelte +19 -17
  92. package/dist/components/nodes/IdeaNode.stories.svelte +48 -0
  93. package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
  94. package/dist/components/nodes/IdeaNode.svelte +10 -26
  95. package/dist/components/nodes/NotesNode.stories.svelte +69 -0
  96. package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
  97. package/dist/components/nodes/NotesNode.svelte +8 -8
  98. package/dist/components/nodes/SimpleNode.stories.svelte +101 -0
  99. package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
  100. package/dist/components/nodes/SimpleNode.svelte +16 -24
  101. package/dist/components/nodes/SquareNode.stories.svelte +56 -0
  102. package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
  103. package/dist/components/nodes/SquareNode.svelte +13 -21
  104. package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
  105. package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
  106. package/dist/components/nodes/TerminalNode.svelte +6 -6
  107. package/dist/components/nodes/ToolNode.stories.svelte +71 -0
  108. package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
  109. package/dist/components/nodes/ToolNode.svelte +7 -15
  110. package/dist/components/nodes/WorkflowNode.stories.svelte +50 -0
  111. package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
  112. package/dist/components/nodes/WorkflowNode.svelte +13 -13
  113. package/dist/components/playground/ChatPanel.svelte +48 -48
  114. package/dist/components/playground/ExecutionLogs.svelte +23 -23
  115. package/dist/components/playground/InputCollector.svelte +24 -24
  116. package/dist/components/playground/MessageBubble.stories.svelte +49 -0
  117. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
  118. package/dist/components/playground/MessageBubble.svelte +49 -46
  119. package/dist/components/playground/Playground.svelte +203 -172
  120. package/dist/components/playground/PlaygroundModal.svelte +5 -5
  121. package/dist/components/playground/SessionManager.svelte +26 -26
  122. package/dist/config/constants.d.ts +22 -0
  123. package/dist/config/constants.js +22 -0
  124. package/dist/config/endpoints.d.ts +19 -0
  125. package/dist/config/runtimeConfig.js +2 -1
  126. package/dist/core/index.d.ts +5 -2
  127. package/dist/core/index.js +9 -1
  128. package/dist/editor/index.d.ts +13 -9
  129. package/dist/editor/index.js +15 -11
  130. package/dist/form/code.d.ts +2 -1
  131. package/dist/form/code.js +1 -3
  132. package/dist/form/markdown.d.ts +2 -1
  133. package/dist/form/markdown.js +1 -3
  134. package/dist/helpers/workflowEditorHelper.js +13 -9
  135. package/dist/mocks/app-forms.js +1 -0
  136. package/dist/mocks/app-navigation.js +3 -1
  137. package/dist/mocks/app-stores.d.ts +4 -4
  138. package/dist/playground/index.d.ts +5 -4
  139. package/dist/playground/index.js +15 -11
  140. package/dist/playground/mount.d.ts +20 -1
  141. package/dist/playground/mount.js +24 -6
  142. package/dist/services/agentSpecExecutionService.js +2 -1
  143. package/dist/services/api.js +10 -18
  144. package/dist/services/apiVariableService.js +2 -1
  145. package/dist/services/autoSaveService.d.ts +3 -3
  146. package/dist/services/autoSaveService.js +21 -17
  147. package/dist/services/categoriesApi.js +13 -5
  148. package/dist/services/draftStorage.js +5 -4
  149. package/dist/services/dynamicSchemaService.js +4 -4
  150. package/dist/services/globalSave.d.ts +60 -11
  151. package/dist/services/globalSave.js +160 -83
  152. package/dist/services/historyService.d.ts +2 -1
  153. package/dist/services/historyService.js +7 -3
  154. package/dist/services/interruptService.js +9 -8
  155. package/dist/services/nodeExecutionService.js +14 -6
  156. package/dist/services/playgroundService.d.ts +3 -2
  157. package/dist/services/playgroundService.js +8 -7
  158. package/dist/services/portConfigApi.js +11 -7
  159. package/dist/services/toastService.d.ts +1 -1
  160. package/dist/services/toastService.js +6 -5
  161. package/dist/services/variableService.js +3 -2
  162. package/dist/settings/index.d.ts +1 -1
  163. package/dist/settings/index.js +1 -1
  164. package/dist/stores/{categoriesStore.d.ts → categoriesStore.svelte.d.ts} +3 -3
  165. package/dist/stores/{categoriesStore.js → categoriesStore.svelte.js} +15 -18
  166. package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
  167. package/dist/stores/editorStateMachine.svelte.js +132 -0
  168. package/dist/stores/{historyStore.d.ts → historyStore.svelte.d.ts} +18 -15
  169. package/dist/stores/{historyStore.js → historyStore.svelte.js} +40 -21
  170. package/dist/stores/{interruptStore.d.ts → interruptStore.svelte.d.ts} +16 -15
  171. package/dist/stores/{interruptStore.js → interruptStore.svelte.js} +85 -94
  172. package/dist/stores/{playgroundStore.d.ts → playgroundStore.svelte.d.ts} +52 -34
  173. package/dist/stores/{playgroundStore.js → playgroundStore.svelte.js} +193 -100
  174. package/dist/stores/{portCoordinateStore.d.ts → portCoordinateStore.svelte.d.ts} +10 -4
  175. package/dist/stores/{portCoordinateStore.js → portCoordinateStore.svelte.js} +38 -35
  176. package/dist/stores/{settingsStore.d.ts → settingsStore.svelte.d.ts} +45 -28
  177. package/dist/stores/{settingsStore.js → settingsStore.svelte.js} +169 -128
  178. package/dist/stores/{workflowStore.d.ts → workflowStore.svelte.d.ts} +101 -65
  179. package/dist/stores/{workflowStore.js → workflowStore.svelte.js} +285 -239
  180. package/dist/stories/CanvasDecorator.svelte +50 -0
  181. package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
  182. package/dist/stories/NodeDecorator.svelte +74 -0
  183. package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
  184. package/dist/stories/utils.d.ts +93 -0
  185. package/dist/stories/utils.js +122 -0
  186. package/dist/styles/base.css +114 -61
  187. package/dist/styles/toast.css +2 -2
  188. package/dist/styles/tokens.css +250 -185
  189. package/dist/svelte-app.d.ts +0 -6
  190. package/dist/svelte-app.js +13 -31
  191. package/dist/types/index.d.ts +2 -0
  192. package/dist/types/interrupt.d.ts +89 -5
  193. package/dist/types/interrupt.js +13 -1
  194. package/dist/types/playground.d.ts +42 -1
  195. package/dist/types/playground.js +38 -0
  196. package/dist/types/settings.js +1 -1
  197. package/dist/utils/colors.js +4 -4
  198. package/dist/utils/connections.js +33 -8
  199. package/dist/utils/icons.js +1 -1
  200. package/dist/utils/logger.d.ts +47 -0
  201. package/dist/utils/logger.js +72 -0
  202. package/dist/utils/nodeWrapper.js +1 -1
  203. package/dist/utils/sanitize.d.ts +19 -0
  204. package/dist/utils/sanitize.js +31 -0
  205. package/dist/utils/validation.d.ts +29 -0
  206. package/dist/utils/validation.js +39 -0
  207. package/package.json +243 -232
@@ -0,0 +1,71 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+ import { createSampleNodeData } from "../../stories/utils.js";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Nodes/ToolNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ <NodeDecorator data={createSampleNodeData({
17
+ label: "AI Content Analyzer",
18
+ metadata: {
19
+ id: "ai_content_analyzer",
20
+ name: "AI Content Analyzer",
21
+ description: "AI-powered content analysis for smart text processing and context understanding",
22
+ category: "ai",
23
+ version: "1.0.0",
24
+ type: "tool",
25
+ supportedTypes: ["tool", "default"],
26
+ icon: "mdi:brain",
27
+ color: "#9C27B0",
28
+ inputs: [
29
+ { id: "content", name: "Content to Analyze", type: "input", dataType: "mixed", required: false, description: "Text content or array of content items for AI analysis" },
30
+ { id: "tool", name: "Tool", type: "input", dataType: "tool", required: false, description: "Available Tools" },
31
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
32
+ ],
33
+ outputs: [
34
+ { id: "tool", name: "Tool", type: "output", dataType: "tool", required: false, description: "Available tools" },
35
+ { id: "analyzed_content", name: "analyzed_content", type: "output", dataType: "array", required: false, description: "Content items with AI analysis results" },
36
+ { id: "total_analyzed", name: "total_analyzed", type: "output", dataType: "number", required: false, description: "Total number of items analyzed" },
37
+ { id: "analysis_mode", name: "analysis_mode", type: "output", dataType: "string", required: false, description: "The analysis mode used" },
38
+ ],
39
+ },
40
+ })} />
41
+ </Story>
42
+
43
+ <Story name="Multiple Parameters">
44
+ <NodeDecorator data={createSampleNodeData({
45
+ label: "Content Classifier",
46
+ metadata: {
47
+ id: "content_classifier",
48
+ name: "Content Classifier",
49
+ description: "Classify content into categories (support, features, sales) for proper triage",
50
+ category: "ai",
51
+ version: "1.0.0",
52
+ type: "tool",
53
+ supportedTypes: ["tool", "default"],
54
+ icon: "mdi:tag-multiple",
55
+ color: "#9C27B0",
56
+ inputs: [
57
+ { id: "tool", name: "Tool", type: "input", dataType: "tool", required: false, description: "Available Tools" },
58
+ { id: "structured_data", name: "Structured Data", type: "input", dataType: "json", required: false, description: "Processed form data for classification" },
59
+ { id: "raw_data", name: "Raw Data", type: "input", dataType: "json", required: false, description: "Original form data" },
60
+ { id: "submission_id", name: "Submission ID", type: "input", dataType: "string", required: false, description: "Unique submission identifier" },
61
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
62
+ ],
63
+ outputs: [
64
+ { id: "tool", name: "Tool", type: "output", dataType: "tool", required: false, description: "Available tools" },
65
+ { id: "primary_category", name: "primary_category", type: "output", dataType: "string", required: false, description: "Primary classification category" },
66
+ { id: "confidence", name: "confidence", type: "output", dataType: "number", required: false, description: "Classification confidence score (0-1)" },
67
+ { id: "priority_level", name: "priority_level", type: "output", dataType: "string", required: false, description: "Priority level (normal, medium, high)" },
68
+ ],
69
+ },
70
+ })} />
71
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default ToolNode;
2
+ type ToolNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const ToolNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -8,7 +8,7 @@
8
8
  import { Position, Handle } from '@xyflow/svelte';
9
9
  import Icon from '@iconify/svelte';
10
10
  import { getDataTypeColor } from '../../utils/colors';
11
- import type { NodeMetadata } from '../../types/index.js';
11
+ import type { NodeMetadata, NodePort } from '../../types/index.js';
12
12
 
13
13
  interface ToolNodeParameter {
14
14
  name: string;
@@ -104,18 +104,18 @@
104
104
 
105
105
  // Check for matching interface ports in metadata
106
106
  let hasToolInputPort = $derived(
107
- props.data.metadata?.inputs?.some((port) => port.dataType === portDataType) || false
107
+ props.data.metadata?.inputs?.some((port: NodePort) => port.dataType === portDataType) || false
108
108
  );
109
109
  let hasToolOutputPort = $derived(
110
- props.data.metadata?.outputs?.some((port) => port.dataType === portDataType) || false
110
+ props.data.metadata?.outputs?.some((port: NodePort) => port.dataType === portDataType) || false
111
111
  );
112
112
 
113
113
  // Get the actual matching ports for proper handle generation
114
114
  let toolInputPort = $derived(
115
- props.data.metadata?.inputs?.find((port) => port.dataType === portDataType)
115
+ props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === portDataType)
116
116
  );
117
117
  let toolOutputPort = $derived(
118
- props.data.metadata?.outputs?.find((port) => port.dataType === portDataType)
118
+ props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === portDataType)
119
119
  );
120
120
 
121
121
  /**
@@ -164,7 +164,7 @@
164
164
  type="target"
165
165
  position={Position.Left}
166
166
  id={`${props.data.nodeId}-input-${toolInputPort.id}`}
167
- style="top: 40px; transform: translateY(-50%); margin-left: -10px; --fd-handle-fill: {getDataTypeColor(
167
+ style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
168
168
  portDataType
169
169
  )}; --fd-handle-border-color: var(--fd-handle-border);"
170
170
  />
@@ -237,7 +237,7 @@
237
237
  type="source"
238
238
  position={Position.Right}
239
239
  id={`${props.data.nodeId}-output-${toolOutputPort.id}`}
240
- style="top: 40px; transform: translateY(-50%); margin-right: -10px; --fd-handle-fill: {getDataTypeColor(
240
+ style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: {getDataTypeColor(
241
241
  portDataType
242
242
  )}; --fd-handle-border-color: var(--fd-handle-border);"
243
243
  />
@@ -456,14 +456,6 @@
456
456
  pointer-events: auto !important;
457
457
  }
458
458
 
459
- :global(.svelte-flow__node-tool .svelte-flow__handle-left) {
460
- left: -10px !important;
461
- }
462
-
463
- :global(.svelte-flow__node-tool .svelte-flow__handle-right) {
464
- right: -10px !important;
465
- }
466
-
467
459
  :global(.svelte-flow__node-tool .svelte-flow__handle:hover) {
468
460
  transform: translateY(-50%) scale(1.2) !important;
469
461
  }
@@ -0,0 +1,50 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+ import { createSampleNodeData } from "../../stories/utils.js";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Nodes/WorkflowNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ <NodeDecorator data={createSampleNodeData({
17
+ label: "Sub Workflow",
18
+ metadata: {
19
+ id: "sub-workflow",
20
+ name: "Sub Workflow",
21
+ description: "Execute a nested workflow",
22
+ category: "bundles",
23
+ version: "1.0.0",
24
+ type: "workflow",
25
+ icon: "mdi:sitemap",
26
+ inputs: [{ id: "input", name: "Input", type: "input", dataType: "any", required: false }],
27
+ outputs: [{ id: "output", name: "Output", type: "output", dataType: "any" }],
28
+ },
29
+ })} />
30
+ </Story>
31
+
32
+ <Story name="Selected">
33
+ <NodeDecorator data={createSampleNodeData({
34
+ label: "Data Pipeline",
35
+ metadata: {
36
+ id: "data-pipeline",
37
+ name: "Data Pipeline",
38
+ description: "Process data through a pipeline workflow",
39
+ category: "bundles",
40
+ version: "1.0.0",
41
+ type: "workflow",
42
+ icon: "mdi:pipe",
43
+ inputs: [
44
+ { id: "data", name: "Data", type: "input", dataType: "any", required: true },
45
+ { id: "config", name: "Config", type: "input", dataType: "object", required: false },
46
+ ],
47
+ outputs: [{ id: "result", name: "Result", type: "output", dataType: "any" }],
48
+ },
49
+ })} selected={true} />
50
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default WorkflowNode;
2
+ type WorkflowNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const WorkflowNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -19,7 +19,7 @@
19
19
  getCategoryColorToken,
20
20
  getPortBackgroundColor
21
21
  } from '../../utils/colors.js';
22
- import { connectedHandles } from '../../stores/workflowStore.js';
22
+ import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
23
23
 
24
24
  interface Props {
25
25
  data: WorkflowNode['data'] & {
@@ -107,7 +107,7 @@
107
107
 
108
108
  // Check if port is connected
109
109
  const handleId = `${props.data.nodeId}-${type}-${port.id}`;
110
- return $connectedHandles.has(handleId);
110
+ return getConnectedHandles().has(handleId);
111
111
  }
112
112
 
113
113
  /**
@@ -218,7 +218,7 @@
218
218
  position={Position.Left}
219
219
  id={`${props.data.nodeId}-input-${port.id}`}
220
220
  class="flowdrop-workflow-node__handle"
221
- style="top: 50%; transform: translateY(-50%); left: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {getDataTypeColorToken(
221
+ style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
222
222
  port.dataType
223
223
  )}; --fd-handle-border-color: var(--fd-handle-border);"
224
224
  role="button"
@@ -296,7 +296,7 @@
296
296
  position={Position.Right}
297
297
  id={`${props.data.nodeId}-output-${port.id}`}
298
298
  class="flowdrop-workflow-node__handle"
299
- style="top: 50%; transform: translateY(-50%); right: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {getDataTypeColorToken(
299
+ style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
300
300
  port.dataType
301
301
  )}; --fd-handle-border-color: var(--fd-handle-border);"
302
302
  role="button"
@@ -358,7 +358,7 @@
358
358
 
359
359
  .flowdrop-workflow-node__header {
360
360
  box-sizing: border-box;
361
- padding: var(--fd-node-header-gap) var(--fd-space-4);
361
+ padding: var(--fd-node-header-gap) var(--fd-space-xl);
362
362
  border-bottom: 1px solid var(--fd-border-muted);
363
363
  background: var(--fd-header);
364
364
  border-top-left-radius: var(--fd-radius-xl);
@@ -375,7 +375,7 @@
375
375
  .flowdrop-workflow-node__header-title {
376
376
  display: flex;
377
377
  align-items: center;
378
- gap: var(--fd-space-3);
378
+ gap: var(--fd-space-md);
379
379
  min-height: var(--fd-node-header-title-height);
380
380
  flex-shrink: 0;
381
381
  }
@@ -453,16 +453,16 @@
453
453
  align-items: center;
454
454
  gap: 0;
455
455
  min-height: var(--fd-node-port-row-height);
456
- padding: var(--fd-space-1) 0;
456
+ padding: var(--fd-space-3xs) 0;
457
457
  position: relative;
458
458
  }
459
459
 
460
460
  .flowdrop-workflow-node__port-content {
461
- padding: 0 var(--fd-space-4);
461
+ padding: 0 var(--fd-space-xl);
462
462
  }
463
463
 
464
464
  .flowdrop-badge {
465
- padding: 0.125rem var(--fd-space-1);
465
+ padding: 0.125rem var(--fd-space-3xs);
466
466
  border-radius: var(--fd-radius-sm);
467
467
  font-size: 0.625rem;
468
468
  font-weight: 500;
@@ -477,7 +477,7 @@
477
477
 
478
478
  .flowdrop-badge--sm {
479
479
  font-size: 0.625rem;
480
- padding: 0.125rem var(--fd-space-1);
480
+ padding: 0.125rem var(--fd-space-3xs);
481
481
  }
482
482
 
483
483
  /* Handle overrides: hover scale (base 20px/12px from base.css) */
@@ -495,7 +495,7 @@
495
495
  }
496
496
 
497
497
  .flowdrop-gap--2 {
498
- gap: var(--fd-space-2);
498
+ gap: var(--fd-space-xs);
499
499
  }
500
500
 
501
501
  .flowdrop-items--center {
@@ -540,8 +540,8 @@
540
540
 
541
541
  .flowdrop-workflow-node__config-btn {
542
542
  position: absolute;
543
- top: var(--fd-space-2);
544
- right: var(--fd-space-2);
543
+ top: var(--fd-space-xs);
544
+ right: var(--fd-space-xs);
545
545
  width: 1.5rem;
546
546
  height: 1.5rem;
547
547
  background-color: var(--fd-backdrop);
@@ -19,17 +19,17 @@
19
19
  metadataToInterrupt
20
20
  } from '../../types/interrupt.js';
21
21
  import {
22
- messages,
23
- chatMessages,
24
- isExecuting,
25
- sessionStatus,
26
- currentSession
27
- } from '../../stores/playgroundStore.js';
22
+ getMessages,
23
+ getChatMessages,
24
+ getIsExecuting,
25
+ getSessionStatus,
26
+ getCurrentSession
27
+ } from '../../stores/playgroundStore.svelte.js';
28
28
  import {
29
- interrupts,
29
+ getInterruptsMap,
30
30
  interruptActions,
31
31
  getInterruptByMessageId
32
- } from '../../stores/interruptStore.js';
32
+ } from '../../stores/interruptStore.svelte.js';
33
33
 
34
34
  /**
35
35
  * Component props
@@ -115,7 +115,7 @@
115
115
  /**
116
116
  * Filter messages based on showLogsInline setting
117
117
  */
118
- const displayMessages = $derived(showLogsInline ? $messages : $chatMessages);
118
+ const displayMessages = $derived(showLogsInline ? getMessages() : getChatMessages());
119
119
 
120
120
  /**
121
121
  * Track previous message count for detecting new messages.
@@ -209,7 +209,7 @@
209
209
  */
210
210
  const interruptsByMessageId = $derived(
211
211
  new Map(
212
- Array.from($interrupts.values())
212
+ Array.from(getInterruptsMap().values())
213
213
  .filter((i) => i.messageId)
214
214
  .map((i) => [i.messageId, i])
215
215
  )
@@ -225,19 +225,19 @@
225
225
  /**
226
226
  * Check if we should show the welcome state
227
227
  */
228
- const showWelcome = $derived(!$currentSession && displayMessages.length === 0);
228
+ const showWelcome = $derived(!getCurrentSession() && displayMessages.length === 0);
229
229
 
230
230
  /**
231
231
  * Check if we should show the empty chat state (session exists but no messages)
232
232
  */
233
- const showEmptyChat = $derived($currentSession && displayMessages.length === 0);
233
+ const showEmptyChat = $derived(getCurrentSession() && displayMessages.length === 0);
234
234
 
235
235
  /**
236
236
  * Handle sending a message
237
237
  */
238
238
  function handleSend(): void {
239
239
  const trimmedValue = inputValue.trim();
240
- if (!trimmedValue || $isExecuting) {
240
+ if (!trimmedValue || getIsExecuting()) {
241
241
  return;
242
242
  }
243
243
 
@@ -278,7 +278,7 @@
278
278
  * Disables the Run button after clicking until backend re-enables it.
279
279
  */
280
280
  function handleRun(): void {
281
- if ($isExecuting || !runEnabled) {
281
+ if (getIsExecuting() || !runEnabled) {
282
282
  return;
283
283
  }
284
284
  // Disable the Run button after clicking
@@ -318,7 +318,7 @@
318
318
  * This ensures a fresh state for each session.
319
319
  */
320
320
  $effect(() => {
321
- const session = $currentSession;
321
+ const session = getCurrentSession();
322
322
  if (session) {
323
323
  // Reset to enabled state for new/changed sessions
324
324
  runEnabled = true;
@@ -388,7 +388,7 @@
388
388
  * Auto-focus input when execution completes or session becomes ready
389
389
  */
390
390
  $effect(() => {
391
- const currentlyExecuting = $isExecuting;
391
+ const currentlyExecuting = getIsExecuting();
392
392
 
393
393
  // Focus input when execution completes (was executing, now not)
394
394
  if (wasExecuting && !currentlyExecuting && inputField) {
@@ -405,8 +405,8 @@
405
405
  * Focus input when session status changes to idle or completed
406
406
  */
407
407
  $effect(() => {
408
- const status = $sessionStatus;
409
- if ((status === 'idle' || status === 'completed') && inputField && !$isExecuting) {
408
+ const status = getSessionStatus();
409
+ if ((status === 'idle' || status === 'completed') && inputField && !getIsExecuting()) {
410
410
  tick().then(() => {
411
411
  inputField?.focus();
412
412
  });
@@ -417,8 +417,8 @@
417
417
  * Focus input when a new session is created/loaded
418
418
  */
419
419
  $effect(() => {
420
- const session = $currentSession;
421
- if (session && inputField && !$isExecuting) {
420
+ const session = getCurrentSession();
421
+ if (session && inputField && !getIsExecuting()) {
422
422
  tick().then(() => {
423
423
  inputField?.focus();
424
424
  });
@@ -545,7 +545,7 @@
545
545
  {/if}
546
546
  {/each}
547
547
 
548
- {#if $isExecuting}
548
+ {#if getIsExecuting()}
549
549
  <div class="chat-panel__typing">
550
550
  <div class="chat-panel__typing-indicator">
551
551
  <span></span>
@@ -579,14 +579,14 @@
579
579
  class="chat-panel__input"
580
580
  {placeholder}
581
581
  rows="1"
582
- disabled={$isExecuting}
582
+ disabled={getIsExecuting()}
583
583
  onkeydown={handleKeydown}
584
584
  oninput={handleInput}
585
585
  ></textarea>
586
586
  </div>
587
587
  {/if}
588
588
 
589
- {#if $sessionStatus === 'running' || $isExecuting}
589
+ {#if getSessionStatus() === 'running' || getIsExecuting()}
590
590
  <button
591
591
  type="button"
592
592
  class="chat-panel__stop-btn"
@@ -637,7 +637,7 @@
637
637
  flex: 1;
638
638
  min-height: 0; /* Critical: allows overflow to work in flex container */
639
639
  overflow-y: auto;
640
- padding: var(--fd-space-6);
640
+ padding: var(--fd-space-3xl);
641
641
  scroll-behavior: smooth;
642
642
  }
643
643
 
@@ -649,7 +649,7 @@
649
649
  justify-content: center;
650
650
  height: 100%;
651
651
  text-align: center;
652
- padding: var(--fd-space-8);
652
+ padding: var(--fd-space-4xl);
653
653
  }
654
654
 
655
655
  .chat-panel__welcome-icon {
@@ -658,7 +658,7 @@
658
658
  justify-content: center;
659
659
  width: 80px;
660
660
  height: 80px;
661
- margin-bottom: var(--fd-space-6);
661
+ margin-bottom: var(--fd-space-3xl);
662
662
  color: var(--fd-foreground);
663
663
  }
664
664
 
@@ -671,7 +671,7 @@
671
671
  font-size: var(--fd-text-2xl);
672
672
  font-weight: 600;
673
673
  color: var(--fd-foreground);
674
- margin: 0 0 var(--fd-space-2) 0;
674
+ margin: 0 0 var(--fd-space-xs) 0;
675
675
  }
676
676
 
677
677
  .chat-panel__welcome-text {
@@ -684,9 +684,9 @@
684
684
  .chat-panel__typing {
685
685
  display: flex;
686
686
  align-items: center;
687
- gap: var(--fd-space-2);
688
- padding: var(--fd-space-3) var(--fd-space-4);
689
- margin-top: var(--fd-space-2);
687
+ gap: var(--fd-space-xs);
688
+ padding: var(--fd-space-md) var(--fd-space-xl);
689
+ margin-top: var(--fd-space-xs);
690
690
  background-color: var(--fd-muted);
691
691
  border-radius: var(--fd-radius-2xl);
692
692
  width: fit-content;
@@ -694,12 +694,12 @@
694
694
 
695
695
  .chat-panel__typing-indicator {
696
696
  display: flex;
697
- gap: var(--fd-space-1);
697
+ gap: var(--fd-space-3xs);
698
698
  }
699
699
 
700
700
  .chat-panel__typing-indicator span {
701
- width: 0.375rem;
702
- height: 0.375rem;
701
+ width: var(--fd-space-2xs);
702
+ height: var(--fd-space-2xs);
703
703
  background-color: var(--fd-muted-foreground);
704
704
  border-radius: var(--fd-radius-full);
705
705
  animation: bounce 1.4s ease-in-out infinite;
@@ -736,7 +736,7 @@
736
736
  /* Input Area - Always stays at bottom, never shrinks */
737
737
  .chat-panel__input-area {
738
738
  flex-shrink: 0;
739
- padding: var(--fd-space-4) var(--fd-space-6) var(--fd-space-6);
739
+ padding: var(--fd-space-xl) var(--fd-space-3xl) var(--fd-space-3xl);
740
740
  background-color: var(--fd-background);
741
741
  border-top: 1px solid var(--fd-border-muted);
742
742
  }
@@ -744,7 +744,7 @@
744
744
  .chat-panel__input-container {
745
745
  display: flex;
746
746
  align-items: flex-end;
747
- gap: var(--fd-space-3);
747
+ gap: var(--fd-space-md);
748
748
  max-width: 800px;
749
749
  margin: 0 auto;
750
750
  }
@@ -756,7 +756,7 @@
756
756
  background-color: var(--fd-background);
757
757
  border: 1px solid var(--fd-border);
758
758
  border-radius: var(--fd-radius-xl);
759
- padding: 0.625rem var(--fd-space-3);
759
+ padding: var(--fd-space-sm) var(--fd-space-md);
760
760
  transition:
761
761
  border-color var(--fd-transition-fast),
762
762
  box-shadow var(--fd-transition-fast);
@@ -774,7 +774,7 @@
774
774
  resize: none;
775
775
  font-family: inherit;
776
776
  font-size: var(--fd-text-base);
777
- line-height: 1.5;
777
+ line-height: var(--fd-leading-normal);
778
778
  max-height: 120px;
779
779
  background: transparent;
780
780
  color: var(--fd-foreground);
@@ -793,7 +793,7 @@
793
793
  display: flex;
794
794
  align-items: center;
795
795
  justify-content: center;
796
- padding: 0.625rem var(--fd-space-5);
796
+ padding: var(--fd-space-sm) var(--fd-space-2xl);
797
797
  border: none;
798
798
  border-radius: var(--fd-radius-lg);
799
799
  background-color: var(--fd-foreground);
@@ -818,8 +818,8 @@
818
818
  .chat-panel__stop-btn {
819
819
  display: flex;
820
820
  align-items: center;
821
- gap: var(--fd-space-1);
822
- padding: 0.625rem var(--fd-space-4);
821
+ gap: var(--fd-space-3xs);
822
+ padding: var(--fd-space-sm) var(--fd-space-xl);
823
823
  border: none;
824
824
  border-radius: var(--fd-radius-lg);
825
825
  background-color: var(--fd-error);
@@ -839,8 +839,8 @@
839
839
  .chat-panel__run-btn {
840
840
  display: flex;
841
841
  align-items: center;
842
- gap: var(--fd-space-1);
843
- padding: 0.625rem var(--fd-space-5);
842
+ gap: var(--fd-space-3xs);
843
+ padding: var(--fd-space-sm) var(--fd-space-2xl);
844
844
  border: none;
845
845
  border-radius: var(--fd-radius-lg);
846
846
  background-color: var(--fd-success);
@@ -872,8 +872,8 @@
872
872
  display: flex;
873
873
  align-items: center;
874
874
  justify-content: center;
875
- gap: var(--fd-space-2);
876
- padding: var(--fd-space-3) var(--fd-space-4);
875
+ gap: var(--fd-space-xs);
876
+ padding: var(--fd-space-md) var(--fd-space-xl);
877
877
  background-color: var(--fd-muted);
878
878
  border-radius: var(--fd-radius-lg);
879
879
  color: var(--fd-muted-foreground);
@@ -885,21 +885,21 @@
885
885
  /* Responsive */
886
886
  @media (max-width: 640px) {
887
887
  .chat-panel__messages {
888
- padding: var(--fd-space-4);
888
+ padding: var(--fd-space-xl);
889
889
  }
890
890
 
891
891
  .chat-panel__input-area {
892
- padding: var(--fd-space-3) var(--fd-space-4) var(--fd-space-4);
892
+ padding: var(--fd-space-md) var(--fd-space-xl) var(--fd-space-xl);
893
893
  }
894
894
 
895
895
  .chat-panel__input-container {
896
- gap: var(--fd-space-2);
896
+ gap: var(--fd-space-xs);
897
897
  }
898
898
 
899
899
  .chat-panel__send-btn,
900
900
  .chat-panel__stop-btn,
901
901
  .chat-panel__run-btn {
902
- padding: var(--fd-space-2) var(--fd-space-4);
902
+ padding: var(--fd-space-xs) var(--fd-space-xl);
903
903
  }
904
904
  }
905
905
  </style>