@flowdrop/flowdrop 1.15.0 → 2.0.0-beta.1
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.
- package/CHANGELOG.md +475 -0
- package/MIGRATION-2.0.md +472 -0
- package/README.md +23 -23
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/WorkflowAdapter.js +14 -8
- package/dist/adapters/agentspec/AgentSpecAdapter.js +7 -7
- package/dist/chat/batchFeedback.d.ts +39 -0
- package/dist/chat/batchFeedback.js +51 -0
- package/dist/commands/executor.js +15 -1
- package/dist/commands/storeIntegration.svelte.d.ts +4 -1
- package/dist/commands/storeIntegration.svelte.js +26 -21
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/App.svelte +162 -192
- package/dist/components/App.svelte.d.ts +47 -8
- package/dist/components/ConfigForm.svelte +71 -47
- package/dist/components/ConfigModal.svelte +7 -2
- package/dist/components/ConnectionLine.svelte +4 -2
- package/dist/components/Navbar.svelte +61 -1
- package/dist/components/NodeSidebar.svelte +27 -45
- package/dist/components/NodeStatusOverlay.svelte +94 -6
- package/dist/components/NodeSwapPicker.svelte +10 -8
- package/dist/components/PipelineStatus.svelte +16 -67
- package/dist/components/PortCoordinateTracker.svelte +5 -6
- package/dist/components/SchemaForm.stories.svelte +1 -3
- package/dist/components/SchemaForm.svelte +18 -25
- package/dist/components/SchemaForm.svelte.d.ts +0 -8
- package/dist/components/SettingsModal.svelte +8 -3
- package/dist/components/SettingsPanel.svelte +20 -4
- package/dist/components/SwapMappingEditor.svelte +67 -49
- package/dist/components/SwapMappingEditor.svelte.d.ts +0 -2
- package/dist/components/UniversalNode.svelte +9 -7
- package/dist/components/WorkflowEditor.svelte +118 -111
- package/dist/components/WorkflowEditor.svelte.d.ts +18 -10
- package/dist/components/chat/AIChatPanel.svelte +93 -89
- package/dist/components/chat/AIChatPanel.svelte.d.ts +0 -4
- package/dist/components/chat/CommandPreview.svelte +2 -1
- package/dist/components/console/CommandConsole.svelte +7 -5
- package/dist/components/console/ConsoleAutocomplete.svelte +10 -11
- package/dist/components/console/ConsoleAutocomplete.svelte.d.ts +6 -0
- package/dist/components/console/ConsoleInput.svelte +15 -6
- package/dist/components/console/ConsoleOutput.svelte +2 -1
- package/dist/components/form/FormArray.svelte +5 -9
- package/dist/components/form/FormArray.svelte.d.ts +2 -1
- package/dist/components/form/FormAutocomplete.svelte +8 -6
- package/dist/components/form/FormField.svelte +4 -2
- package/dist/components/form/FormFieldLight.svelte +4 -2
- package/dist/components/form/FormMarkdownEditor.svelte +9 -4
- package/dist/components/form/FormRangeField.svelte +1 -0
- package/dist/components/form/FormTemplateEditor.svelte +11 -3
- package/dist/components/form/FormToggle.svelte +5 -12
- package/dist/components/form/FormToggle.svelte.d.ts +4 -2
- package/dist/components/form/templateAutocomplete.js +1 -5
- package/dist/components/form/types.d.ts +1 -14
- package/dist/components/interrupt/FormPrompt.svelte +3 -2
- package/dist/components/interrupt/InterruptBubble.svelte +16 -17
- package/dist/components/interrupt/ReviewPrompt.svelte +10 -3
- package/dist/components/interrupt/TextInputPrompt.svelte +2 -1
- package/dist/components/layouts/MainLayout.svelte +20 -13
- package/dist/components/layouts/MainLayout.svelte.d.ts +4 -0
- package/dist/components/nodes/AtomNode.svelte +17 -5
- package/dist/components/nodes/GatewayNode.svelte +19 -10
- package/dist/components/nodes/IdeaNode.svelte +7 -0
- package/dist/components/nodes/SimpleNode.svelte +11 -6
- package/dist/components/nodes/SquareNode.svelte +15 -8
- package/dist/components/nodes/TerminalNode.svelte +9 -4
- package/dist/components/nodes/ToolNode.svelte +7 -1
- package/dist/components/nodes/WorkflowNode.svelte +16 -7
- package/dist/components/playground/ChatInput.svelte +11 -14
- package/dist/components/playground/ChatPanel.svelte +6 -49
- package/dist/components/playground/ChatPanel.svelte.d.ts +0 -14
- package/dist/components/playground/ControlPanel.svelte +134 -123
- package/dist/components/playground/ControlPanel.svelte.d.ts +3 -0
- package/dist/components/playground/ExecutionLogs.svelte +11 -9
- package/dist/components/playground/InputCollector.svelte +11 -9
- package/dist/components/playground/MessageStream.svelte +17 -23
- package/dist/components/playground/PipelineKanbanView.svelte +65 -6
- package/dist/components/playground/PipelinePanel.svelte +11 -5
- package/dist/components/playground/PipelineTableView.svelte +186 -44
- package/dist/components/playground/Playground.svelte +90 -92
- package/dist/components/playground/Playground.svelte.d.ts +2 -0
- package/dist/components/playground/PlaygroundApp.svelte +6 -1
- package/dist/components/playground/PlaygroundApp.svelte.d.ts +3 -0
- package/dist/components/playground/PlaygroundModal.svelte +13 -3
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -0
- package/dist/components/playground/PlaygroundStudio.svelte +34 -32
- package/dist/components/playground/PlaygroundStudio.svelte.d.ts +3 -0
- package/dist/components/playground/SessionManager.svelte +9 -12
- package/dist/components/playground/pipelineViewUtils.svelte.d.ts +28 -0
- package/dist/components/playground/pipelineViewUtils.svelte.js +38 -1
- package/dist/config/endpoints.d.ts +0 -7
- package/dist/config/endpoints.js +2 -10
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +6 -6
- package/dist/display/index.d.ts +0 -2
- package/dist/display/index.js +0 -6
- package/dist/editor/index.d.ts +19 -20
- package/dist/editor/index.js +25 -35
- package/dist/form/code.d.ts +25 -15
- package/dist/form/code.js +44 -41
- package/dist/form/fieldRegistry.d.ts +17 -13
- package/dist/form/fieldRegistry.js +32 -12
- package/dist/form/full.d.ts +17 -13
- package/dist/form/full.js +22 -27
- package/dist/form/index.d.ts +3 -3
- package/dist/form/index.js +3 -3
- package/dist/form/markdown.d.ts +13 -8
- package/dist/form/markdown.js +22 -23
- package/dist/helpers/proximityConnect.d.ts +3 -2
- package/dist/helpers/proximityConnect.js +2 -5
- package/dist/helpers/workflowEditorHelper.d.ts +12 -5
- package/dist/helpers/workflowEditorHelper.js +27 -25
- package/dist/index.d.ts +28 -24
- package/dist/index.js +27 -50
- package/dist/messages/defaults.d.ts +2 -5
- package/dist/messages/defaults.js +3 -6
- package/dist/messages/index.d.ts +0 -1
- package/dist/messages/index.js +0 -1
- package/dist/mocks/app-forms.d.ts +6 -2
- package/dist/mocks/app-forms.js +11 -4
- package/dist/openapi/v1/openapi.yaml +3 -3
- package/dist/playground/index.d.ts +2 -3
- package/dist/playground/index.js +2 -30
- package/dist/playground/mount.d.ts +15 -0
- package/dist/playground/mount.js +46 -20
- package/dist/registry/{BaseRegistry.d.ts → BaseRegistry.svelte.d.ts} +22 -1
- package/dist/registry/{BaseRegistry.js → BaseRegistry.svelte.js} +37 -1
- package/dist/registry/builtinFormats.d.ts +9 -18
- package/dist/registry/builtinFormats.js +9 -39
- package/dist/registry/builtinNodes.d.ts +0 -25
- package/dist/registry/builtinNodes.js +1 -50
- package/dist/registry/index.d.ts +3 -4
- package/dist/registry/index.js +4 -6
- package/dist/registry/nodeComponentRegistry.d.ts +182 -15
- package/dist/registry/nodeComponentRegistry.js +235 -17
- package/dist/registry/workflowFormatRegistry.d.ts +14 -9
- package/dist/registry/workflowFormatRegistry.js +24 -8
- package/dist/{schema → schemas}/index.d.ts +2 -2
- package/dist/{schema → schemas}/index.js +2 -2
- package/dist/schemas/v1/workflow.schema.json +3 -3
- package/dist/services/agentSpecExecutionService.js +0 -1
- package/dist/services/apiVariableService.d.ts +2 -1
- package/dist/services/apiVariableService.js +5 -22
- package/dist/services/autoSaveService.d.ts +7 -0
- package/dist/services/autoSaveService.js +6 -4
- package/dist/services/chatService.d.ts +8 -4
- package/dist/services/chatService.js +15 -15
- package/dist/services/draftStorage.d.ts +129 -13
- package/dist/services/draftStorage.js +185 -37
- package/dist/services/dynamicSchemaService.d.ts +2 -1
- package/dist/services/dynamicSchemaService.js +5 -22
- package/dist/services/globalSave.d.ts +13 -12
- package/dist/services/globalSave.js +29 -51
- package/dist/services/historyService.d.ts +9 -3
- package/dist/services/historyService.js +9 -3
- package/dist/services/interruptService.d.ts +14 -9
- package/dist/services/interruptService.js +27 -27
- package/dist/services/nodeExecutionService.d.ts +18 -3
- package/dist/services/nodeExecutionService.js +71 -45
- package/dist/services/playgroundService.d.ts +14 -9
- package/dist/services/playgroundService.js +31 -30
- package/dist/services/variableService.d.ts +2 -1
- package/dist/services/variableService.js +2 -2
- package/dist/services/workflowStorage.js +6 -6
- package/dist/stores/apiContext.d.ts +45 -0
- package/dist/stores/apiContext.js +65 -0
- package/dist/stores/categoriesStore.svelte.d.ts +28 -23
- package/dist/stores/categoriesStore.svelte.js +70 -64
- package/dist/stores/getInstance.svelte.d.ts +39 -0
- package/dist/stores/getInstance.svelte.js +65 -0
- package/dist/stores/historyStore.svelte.d.ts +77 -93
- package/dist/stores/historyStore.svelte.js +134 -160
- package/dist/stores/instanceContainer.svelte.d.ts +111 -0
- package/dist/stores/instanceContainer.svelte.js +114 -0
- package/dist/stores/interruptStore.svelte.d.ts +112 -82
- package/dist/stores/interruptStore.svelte.js +253 -226
- package/dist/stores/pipelinePanelStore.svelte.d.ts +27 -3
- package/dist/stores/pipelinePanelStore.svelte.js +61 -14
- package/dist/stores/playgroundStore.svelte.d.ts +169 -222
- package/dist/stores/playgroundStore.svelte.js +515 -580
- package/dist/stores/portCoordinateStore.svelte.d.ts +57 -51
- package/dist/stores/portCoordinateStore.svelte.js +109 -98
- package/dist/stores/settingsStore.svelte.d.ts +4 -1
- package/dist/stores/settingsStore.svelte.js +47 -12
- package/dist/stores/workflowStore.svelte.d.ts +178 -213
- package/dist/stores/workflowStore.svelte.js +449 -501
- package/dist/stories/EdgeDecorator.svelte +5 -2
- package/dist/stories/NodeDecorator.svelte +5 -3
- package/dist/svelte-app.d.ts +60 -10
- package/dist/svelte-app.js +157 -53
- package/dist/types/events.d.ts +6 -3
- package/dist/types/index.d.ts +33 -3
- package/dist/types/navbar.d.ts +7 -0
- package/dist/types/playground.d.ts +18 -3
- package/dist/types/settings.d.ts +13 -0
- package/dist/types/settings.js +1 -0
- package/dist/utils/colors.d.ts +47 -21
- package/dist/utils/colors.js +69 -68
- package/dist/utils/connections.d.ts +9 -15
- package/dist/utils/connections.js +13 -32
- package/dist/utils/duration.d.ts +13 -0
- package/dist/utils/duration.js +45 -0
- package/dist/utils/icons.d.ts +5 -2
- package/dist/utils/icons.js +6 -5
- package/dist/utils/nodeSwap.d.ts +6 -2
- package/dist/utils/nodeSwap.js +62 -126
- package/dist/utils/nodeTypes.d.ts +17 -8
- package/dist/utils/nodeTypes.js +26 -19
- package/dist/utils/performanceUtils.js +7 -0
- package/package.json +6 -5
- package/dist/messages/deprecation.d.ts +0 -20
- package/dist/messages/deprecation.js +0 -33
- package/dist/registry/plugin.d.ts +0 -215
- package/dist/registry/plugin.js +0 -249
- package/dist/services/api.d.ts +0 -129
- package/dist/services/api.js +0 -217
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
getCategoryColorToken,
|
|
19
19
|
getPortBackgroundColor
|
|
20
20
|
} from '../../utils/colors.js';
|
|
21
|
-
import {
|
|
21
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
22
22
|
import { m } from '../../messages/index.js';
|
|
23
23
|
|
|
24
24
|
interface Props {
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
|
|
32
32
|
let props: Props = $props();
|
|
33
33
|
|
|
34
|
+
const fd = getInstance();
|
|
35
|
+
const checker = fd.portCompatibility;
|
|
36
|
+
|
|
34
37
|
// Hoist the graph branch — three reads in the template, two inside
|
|
35
38
|
// {#each port} / {#each branch} loops. One getter walk per render.
|
|
36
39
|
const graph = $derived(m().nodes.graph);
|
|
@@ -80,7 +83,7 @@
|
|
|
80
83
|
|
|
81
84
|
// Check if port is connected
|
|
82
85
|
const handleId = `${props.data.nodeId}-${type}-${port.id}`;
|
|
83
|
-
return
|
|
86
|
+
return fd.workflow.connectedHandles.has(handleId);
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
/**
|
|
@@ -103,7 +106,7 @@
|
|
|
103
106
|
|
|
104
107
|
// Check if branch output is connected
|
|
105
108
|
const handleId = `${props.data.nodeId}-output-${branchName}`;
|
|
106
|
-
return
|
|
109
|
+
return fd.workflow.connectedHandles.has(handleId);
|
|
107
110
|
}
|
|
108
111
|
|
|
109
112
|
// Gateway-specific data - branches are calculated at runtime from config
|
|
@@ -173,10 +176,10 @@
|
|
|
173
176
|
<!-- Node Icon with Squircle Background -->
|
|
174
177
|
<div
|
|
175
178
|
class="flowdrop-workflow-node__icon-wrapper"
|
|
176
|
-
style="--_icon-color: {getCategoryColorToken(props.data.metadata.category)}"
|
|
179
|
+
style="--_icon-color: {getCategoryColorToken(fd.categories, props.data.metadata.category)}"
|
|
177
180
|
>
|
|
178
181
|
<Icon
|
|
179
|
-
icon={getNodeIcon(props.data.metadata.icon, props.data.metadata.category)}
|
|
182
|
+
icon={getNodeIcon(fd.categories, props.data.metadata.icon, props.data.metadata.category)}
|
|
180
183
|
class="flowdrop-workflow-node__icon"
|
|
181
184
|
/>
|
|
182
185
|
</div>
|
|
@@ -208,6 +211,7 @@
|
|
|
208
211
|
id={`${props.data.nodeId}-input-${port.id}`}
|
|
209
212
|
class="flowdrop-workflow-node__handle"
|
|
210
213
|
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
|
|
214
|
+
checker,
|
|
211
215
|
port.dataType
|
|
212
216
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
213
217
|
tabindex={-1}
|
|
@@ -220,11 +224,13 @@
|
|
|
220
224
|
<span
|
|
221
225
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
222
226
|
style="background-color: {getPortBackgroundColor(
|
|
227
|
+
checker,
|
|
223
228
|
port.dataType,
|
|
224
229
|
15
|
|
225
230
|
)}; color: {getDataTypeColorToken(
|
|
231
|
+
checker,
|
|
226
232
|
port.dataType
|
|
227
|
-
)}; border: 1px solid {getPortBackgroundColor(port.dataType, 30)};"
|
|
233
|
+
)}; border: 1px solid {getPortBackgroundColor(checker, port.dataType, 30)};"
|
|
228
234
|
>
|
|
229
235
|
{port.dataType}
|
|
230
236
|
</span>
|
|
@@ -250,7 +256,7 @@
|
|
|
250
256
|
{#if visibleBranches.length > 0}
|
|
251
257
|
<div class="flowdrop-workflow-node__ports">
|
|
252
258
|
<div class="flowdrop-workflow-node__ports-list">
|
|
253
|
-
{#each visibleBranches as branch
|
|
259
|
+
{#each visibleBranches as branch (branch.name)}
|
|
254
260
|
{@const isActive = isBranchActive(branch.name)}
|
|
255
261
|
<div class="flowdrop-workflow-node__port">
|
|
256
262
|
<!-- Port Info: padding lives here so handle position is simple -->
|
|
@@ -261,7 +267,7 @@
|
|
|
261
267
|
class="flowdrop-flex flowdrop-gap--2 flowdrop-justify--end flowdrop-items--center"
|
|
262
268
|
>
|
|
263
269
|
{#if isActive}
|
|
264
|
-
<span style="color: {getDataTypeColorToken('trigger')};">
|
|
270
|
+
<span style="color: {getDataTypeColorToken(checker, 'trigger')};">
|
|
265
271
|
<Icon icon="mdi:check-circle" />
|
|
266
272
|
</span>
|
|
267
273
|
{/if}
|
|
@@ -274,11 +280,13 @@
|
|
|
274
280
|
<span
|
|
275
281
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
276
282
|
style="background-color: {getPortBackgroundColor(
|
|
283
|
+
checker,
|
|
277
284
|
'trigger',
|
|
278
285
|
15
|
|
279
286
|
)}; color: {getDataTypeColorToken(
|
|
287
|
+
checker,
|
|
280
288
|
'trigger'
|
|
281
|
-
)}; border: 1px solid {getPortBackgroundColor('trigger', 30)};"
|
|
289
|
+
)}; border: 1px solid {getPortBackgroundColor(checker, 'trigger', 30)};"
|
|
282
290
|
>
|
|
283
291
|
trigger
|
|
284
292
|
</span>
|
|
@@ -292,8 +300,9 @@
|
|
|
292
300
|
id={`${props.data.nodeId}-output-${branch.name}`}
|
|
293
301
|
class={`flowdrop-workflow-node__handle ${isActive ? 'flowdrop-workflow-node__handle--active' : ''}`}
|
|
294
302
|
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {isActive
|
|
295
|
-
? getDataTypeColorToken('trigger')
|
|
303
|
+
? getDataTypeColorToken(checker, 'trigger')
|
|
296
304
|
: getDataTypeColorToken(
|
|
305
|
+
checker,
|
|
297
306
|
'trigger'
|
|
298
307
|
)}; --fd-handle-border-color: var(--fd-handle-border);"
|
|
299
308
|
tabindex={-1}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type { ConfigValues, NodeMetadata } from '../../types/index.js';
|
|
12
12
|
import Icon from '@iconify/svelte';
|
|
13
13
|
import { getDataTypeColor } from '../../utils/colors.js';
|
|
14
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
14
15
|
import { m } from '../../messages/index.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
@@ -34,6 +35,8 @@
|
|
|
34
35
|
isError?: boolean;
|
|
35
36
|
}>();
|
|
36
37
|
|
|
38
|
+
const checker = getInstance().portCompatibility;
|
|
39
|
+
|
|
37
40
|
/**
|
|
38
41
|
* Instance-specific title override from config.
|
|
39
42
|
* Falls back to the original label if not set.
|
|
@@ -151,6 +154,7 @@
|
|
|
151
154
|
type="target"
|
|
152
155
|
position={Position.Left}
|
|
153
156
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
157
|
+
checker,
|
|
154
158
|
IDEA_DATA_TYPE
|
|
155
159
|
)}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); z-index: 30;"
|
|
156
160
|
id={`${props.data.nodeId}-input-left`}
|
|
@@ -163,6 +167,7 @@
|
|
|
163
167
|
type="target"
|
|
164
168
|
position={Position.Top}
|
|
165
169
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
170
|
+
checker,
|
|
166
171
|
IDEA_DATA_TYPE
|
|
167
172
|
)}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); z-index: 30;"
|
|
168
173
|
id={`${props.data.nodeId}-input-top`}
|
|
@@ -215,6 +220,7 @@
|
|
|
215
220
|
type="source"
|
|
216
221
|
position={Position.Right}
|
|
217
222
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
223
|
+
checker,
|
|
218
224
|
IDEA_DATA_TYPE
|
|
219
225
|
)}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); z-index: 30;"
|
|
220
226
|
id={`${props.data.nodeId}-output-right`}
|
|
@@ -227,6 +233,7 @@
|
|
|
227
233
|
type="source"
|
|
228
234
|
position={Position.Bottom}
|
|
229
235
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
236
|
+
checker,
|
|
230
237
|
IDEA_DATA_TYPE
|
|
231
238
|
)}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); z-index: 30;"
|
|
232
239
|
id={`${props.data.nodeId}-output-bottom`}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { dynamicPortToNodePort } from '../../types/index.js';
|
|
22
22
|
import Icon from '@iconify/svelte';
|
|
23
23
|
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
|
|
24
|
-
import {
|
|
24
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
25
25
|
import { applyPortOrder, getPortTop, isPortVisible } from '../../utils/portUtils.js';
|
|
26
26
|
import CogIcon from '../icons/CogIcon.svelte';
|
|
27
27
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
@@ -44,6 +44,9 @@
|
|
|
44
44
|
isError?: boolean;
|
|
45
45
|
}>();
|
|
46
46
|
|
|
47
|
+
const fd = getInstance();
|
|
48
|
+
const checker = fd.portCompatibility;
|
|
49
|
+
|
|
47
50
|
/**
|
|
48
51
|
* Get UI extension settings from extensions, merging node type defaults with instance overrides.
|
|
49
52
|
*/
|
|
@@ -141,7 +144,7 @@
|
|
|
141
144
|
'input',
|
|
142
145
|
hiddenPorts,
|
|
143
146
|
hideUnconnectedHandles,
|
|
144
|
-
|
|
147
|
+
fd.workflow.connectedHandles,
|
|
145
148
|
props.data.nodeId
|
|
146
149
|
)
|
|
147
150
|
)
|
|
@@ -160,7 +163,7 @@
|
|
|
160
163
|
'output',
|
|
161
164
|
hiddenPorts,
|
|
162
165
|
hideUnconnectedHandles,
|
|
163
|
-
|
|
166
|
+
fd.workflow.connectedHandles,
|
|
164
167
|
props.data.nodeId
|
|
165
168
|
)
|
|
166
169
|
)
|
|
@@ -178,11 +181,12 @@
|
|
|
178
181
|
</script>
|
|
179
182
|
|
|
180
183
|
<!-- Input Handles: 1 port centered at 40px; N ports at 20px start, 40px gap -->
|
|
181
|
-
{#each visibleInputPorts as port, index}
|
|
184
|
+
{#each visibleInputPorts as port, index (port.id)}
|
|
182
185
|
<Handle
|
|
183
186
|
type="target"
|
|
184
187
|
position={Position.Left}
|
|
185
188
|
style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
189
|
+
checker,
|
|
186
190
|
port.dataType
|
|
187
191
|
)}); --fd-handle-border-color: var(--fd-handle-border); top: {getPortTop(
|
|
188
192
|
index,
|
|
@@ -214,7 +218,7 @@
|
|
|
214
218
|
<!-- Node Icon (circle dot) — visibility controlled by --fd-node-circle-display -->
|
|
215
219
|
<span
|
|
216
220
|
class="flowdrop-simple-node__color-dot"
|
|
217
|
-
style="background: {getCategoryColorToken(props.data.metadata?.category)}"
|
|
221
|
+
style="background: {getCategoryColorToken(fd.categories, props.data.metadata?.category)}"
|
|
218
222
|
></span>
|
|
219
223
|
|
|
220
224
|
<!-- Node Title -->
|
|
@@ -256,11 +260,12 @@
|
|
|
256
260
|
</div>
|
|
257
261
|
|
|
258
262
|
<!-- Output Handles: 1 port centered at 40px; N ports at 20px start, 40px gap -->
|
|
259
|
-
{#each visibleOutputPorts as port, index}
|
|
263
|
+
{#each visibleOutputPorts as port, index (port.id)}
|
|
260
264
|
<Handle
|
|
261
265
|
type="source"
|
|
262
266
|
position={Position.Right}
|
|
263
267
|
style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
268
|
+
checker,
|
|
264
269
|
port.dataType
|
|
265
270
|
)}); --fd-handle-border-color: var(--fd-handle-border); top: {getPortTop(
|
|
266
271
|
index,
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import Icon from '@iconify/svelte';
|
|
23
23
|
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
|
|
24
24
|
import { getNodeIcon } from '../../utils/icons.js';
|
|
25
|
-
import {
|
|
25
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
26
26
|
import { applyPortOrder, getPortTop, isPortVisible } from '../../utils/portUtils.js';
|
|
27
27
|
import CogIcon from '../icons/CogIcon.svelte';
|
|
28
28
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
@@ -45,6 +45,9 @@
|
|
|
45
45
|
isError?: boolean;
|
|
46
46
|
}>();
|
|
47
47
|
|
|
48
|
+
const fd = getInstance();
|
|
49
|
+
const checker = fd.portCompatibility;
|
|
50
|
+
|
|
48
51
|
/**
|
|
49
52
|
* Get UI extension settings from extensions, merging node type defaults with instance overrides.
|
|
50
53
|
*/
|
|
@@ -66,13 +69,15 @@
|
|
|
66
69
|
* Get icon using the same resolution as WorkflowNode
|
|
67
70
|
* Uses getNodeIcon utility with category fallback
|
|
68
71
|
*/
|
|
69
|
-
let squareIcon = $derived(
|
|
72
|
+
let squareIcon = $derived(
|
|
73
|
+
getNodeIcon(fd.categories, props.data.metadata?.icon, props.data.metadata?.category)
|
|
74
|
+
);
|
|
70
75
|
|
|
71
76
|
/**
|
|
72
77
|
* Get icon color using category-based color tokens for consistency
|
|
73
78
|
* Falls back to primary color if category not available
|
|
74
79
|
*/
|
|
75
|
-
let squareColor = $derived(getCategoryColorToken(props.data.metadata?.category));
|
|
80
|
+
let squareColor = $derived(getCategoryColorToken(fd.categories, props.data.metadata?.category));
|
|
76
81
|
|
|
77
82
|
// Handle configuration sidebar - now using global ConfigSidebar
|
|
78
83
|
function openConfigSidebar(): void {
|
|
@@ -129,7 +134,7 @@
|
|
|
129
134
|
'input',
|
|
130
135
|
hiddenPorts,
|
|
131
136
|
hideUnconnectedHandles,
|
|
132
|
-
|
|
137
|
+
fd.workflow.connectedHandles,
|
|
133
138
|
props.data.nodeId
|
|
134
139
|
)
|
|
135
140
|
)
|
|
@@ -148,7 +153,7 @@
|
|
|
148
153
|
'output',
|
|
149
154
|
hiddenPorts,
|
|
150
155
|
hideUnconnectedHandles,
|
|
151
|
-
|
|
156
|
+
fd.workflow.connectedHandles,
|
|
152
157
|
props.data.nodeId
|
|
153
158
|
)
|
|
154
159
|
)
|
|
@@ -167,11 +172,12 @@
|
|
|
167
172
|
</script>
|
|
168
173
|
|
|
169
174
|
<!-- Input Handles: 1 port centered at 40px; N ports at 20px start, 40px gap -->
|
|
170
|
-
{#each visibleInputPorts as port, index}
|
|
175
|
+
{#each visibleInputPorts as port, index (port.id)}
|
|
171
176
|
<Handle
|
|
172
177
|
type="target"
|
|
173
178
|
position={Position.Left}
|
|
174
179
|
style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
180
|
+
checker,
|
|
175
181
|
port.dataType
|
|
176
182
|
)}); --fd-handle-border-color: var(--fd-handle-border); top: {getPortTop(
|
|
177
183
|
index,
|
|
@@ -203,7 +209,7 @@
|
|
|
203
209
|
<!-- Circle dot — visibility controlled by --fd-node-circle-display -->
|
|
204
210
|
<span
|
|
205
211
|
class="flowdrop-square-node__color-dot"
|
|
206
|
-
style="background: {getCategoryColorToken(props.data.metadata?.category)}"
|
|
212
|
+
style="background: {getCategoryColorToken(fd.categories, props.data.metadata?.category)}"
|
|
207
213
|
></span>
|
|
208
214
|
</div>
|
|
209
215
|
|
|
@@ -232,11 +238,12 @@
|
|
|
232
238
|
</div>
|
|
233
239
|
|
|
234
240
|
<!-- Output Handles: 1 port centered at 40px; N ports at 20px start, 40px gap -->
|
|
235
|
-
{#each visibleOutputPorts as port, index}
|
|
241
|
+
{#each visibleOutputPorts as port, index (port.id)}
|
|
236
242
|
<Handle
|
|
237
243
|
type="source"
|
|
238
244
|
position={Position.Right}
|
|
239
245
|
style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
246
|
+
checker,
|
|
240
247
|
port.dataType
|
|
241
248
|
)}); --fd-handle-border-color: var(--fd-handle-border); top: {getPortTop(
|
|
242
249
|
index,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
|
|
16
16
|
import { getNodeIcon } from '../../utils/icons.js';
|
|
17
17
|
import { getCircleHandlePosition } from '../../utils/handlePositioning.js';
|
|
18
|
-
import {
|
|
18
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Terminal node variant types
|
|
@@ -83,6 +83,9 @@
|
|
|
83
83
|
isError?: boolean;
|
|
84
84
|
}>();
|
|
85
85
|
|
|
86
|
+
const fd = getInstance();
|
|
87
|
+
const checker = fd.portCompatibility;
|
|
88
|
+
|
|
86
89
|
/**
|
|
87
90
|
* Determine terminal variant from config or metadata
|
|
88
91
|
* Priority: config.variant > metadata tag detection > default to "start"
|
|
@@ -156,7 +159,7 @@
|
|
|
156
159
|
return true;
|
|
157
160
|
}
|
|
158
161
|
const handleId = `${props.data.nodeId}-${type}-${port.id}`;
|
|
159
|
-
return
|
|
162
|
+
return fd.workflow.connectedHandles.has(handleId);
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
/**
|
|
@@ -165,7 +168,7 @@
|
|
|
165
168
|
*/
|
|
166
169
|
let terminalIcon = $derived(
|
|
167
170
|
props.data.metadata?.icon
|
|
168
|
-
? getNodeIcon(props.data.metadata.icon, props.data.metadata?.category)
|
|
171
|
+
? getNodeIcon(fd.categories, props.data.metadata.icon, props.data.metadata?.category)
|
|
169
172
|
: variantConfig.icon
|
|
170
173
|
);
|
|
171
174
|
|
|
@@ -175,7 +178,7 @@
|
|
|
175
178
|
*/
|
|
176
179
|
let terminalColor = $derived(
|
|
177
180
|
props.data.metadata?.category
|
|
178
|
-
? getCategoryColorToken(props.data.metadata.category)
|
|
181
|
+
? getCategoryColorToken(fd.categories, props.data.metadata.category)
|
|
179
182
|
: variantConfig.color
|
|
180
183
|
);
|
|
181
184
|
|
|
@@ -363,6 +366,7 @@
|
|
|
363
366
|
type="target"
|
|
364
367
|
position={Position.Left}
|
|
365
368
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
369
|
+
checker,
|
|
366
370
|
port.dataType
|
|
367
371
|
)}; --fd-handle-border-color: var(--fd-handle-border); left: {pos.left}px; top: {pos.top}px; transform: translate(-50%, -50%); z-index: 30;"
|
|
368
372
|
id={`${props.data.nodeId}-input-${port.id}`}
|
|
@@ -386,6 +390,7 @@
|
|
|
386
390
|
position={Position.Right}
|
|
387
391
|
id={`${props.data.nodeId}-output-${port.id}`}
|
|
388
392
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
393
|
+
checker,
|
|
389
394
|
port.dataType
|
|
390
395
|
)}; --fd-handle-border-color: var(--fd-handle-border); left: {pos.left}px; top: {pos.top}px; transform: translate(-50%, -50%); z-index: 30;"
|
|
391
396
|
/>
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { Position, Handle } from '@xyflow/svelte';
|
|
9
9
|
import Icon from '@iconify/svelte';
|
|
10
10
|
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors';
|
|
11
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
11
12
|
import type { NodeMetadata, NodePort } from '../../types/index.js';
|
|
12
13
|
import CogIcon from '../icons/CogIcon.svelte';
|
|
13
14
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
@@ -46,6 +47,9 @@
|
|
|
46
47
|
isError?: boolean;
|
|
47
48
|
}>();
|
|
48
49
|
|
|
50
|
+
const fd = getInstance();
|
|
51
|
+
const checker = fd.portCompatibility;
|
|
52
|
+
|
|
49
53
|
// Prioritize metadata over config for tool nodes (metadata is the node definition)
|
|
50
54
|
let toolIcon = $derived(
|
|
51
55
|
(props.data.metadata?.icon as string) || (props.data.config?.icon as string) || 'mdi:tools'
|
|
@@ -171,6 +175,7 @@
|
|
|
171
175
|
position={Position.Left}
|
|
172
176
|
id={`${props.data.nodeId}-input-${toolInputPort.id}`}
|
|
173
177
|
style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
178
|
+
checker,
|
|
174
179
|
portDataType
|
|
175
180
|
)}); --fd-handle-border-color: var(--fd-handle-border);"
|
|
176
181
|
/>
|
|
@@ -199,7 +204,7 @@
|
|
|
199
204
|
<!-- Circle dot — visibility controlled by --fd-node-circle-display -->
|
|
200
205
|
<span
|
|
201
206
|
class="flowdrop-tool-node__color-dot"
|
|
202
|
-
style="background: {getCategoryColorToken(props.data.metadata?.category)}"
|
|
207
|
+
style="background: {getCategoryColorToken(fd.categories, props.data.metadata?.category)}"
|
|
203
208
|
></span>
|
|
204
209
|
|
|
205
210
|
<!-- Tool Info -->
|
|
@@ -249,6 +254,7 @@
|
|
|
249
254
|
position={Position.Right}
|
|
250
255
|
id={`${props.data.nodeId}-output-${toolOutputPort.id}`}
|
|
251
256
|
style="top: 40px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
257
|
+
checker,
|
|
252
258
|
portDataType
|
|
253
259
|
)}); --fd-handle-border-color: var(--fd-handle-border);"
|
|
254
260
|
/>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
getCategoryColorToken,
|
|
23
23
|
getPortBackgroundColor
|
|
24
24
|
} from '../../utils/colors.js';
|
|
25
|
-
import {
|
|
25
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
26
26
|
import { applyPortOrder } from '../../utils/portUtils.js';
|
|
27
27
|
import { m } from '../../messages/index.js';
|
|
28
28
|
|
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
let props: Props = $props();
|
|
38
38
|
let isHandleInteraction = $state(false);
|
|
39
39
|
|
|
40
|
+
const fd = getInstance();
|
|
41
|
+
const checker = fd.portCompatibility;
|
|
42
|
+
|
|
40
43
|
// Hoist the graph branch — three reads in the template, two of them inside
|
|
41
44
|
// {#each port} loops where N×M reads add up. One getter walk per render.
|
|
42
45
|
const graph = $derived(m().nodes.graph);
|
|
@@ -145,7 +148,7 @@
|
|
|
145
148
|
|
|
146
149
|
// Check if port is connected
|
|
147
150
|
const handleId = `${props.data.nodeId}-${type}-${port.id}`;
|
|
148
|
-
return
|
|
151
|
+
return fd.workflow.connectedHandles.has(handleId);
|
|
149
152
|
}
|
|
150
153
|
|
|
151
154
|
/**
|
|
@@ -219,17 +222,17 @@
|
|
|
219
222
|
<!-- Squircle icon — visibility controlled by --fd-node-icon-display -->
|
|
220
223
|
<div
|
|
221
224
|
class="flowdrop-workflow-node__icon-wrapper"
|
|
222
|
-
style="--_icon-color: {getCategoryColorToken(props.data.metadata.category)}"
|
|
225
|
+
style="--_icon-color: {getCategoryColorToken(fd.categories, props.data.metadata.category)}"
|
|
223
226
|
>
|
|
224
227
|
<Icon
|
|
225
|
-
icon={getNodeIcon(props.data.metadata.icon, props.data.metadata.category)}
|
|
228
|
+
icon={getNodeIcon(fd.categories, props.data.metadata.icon, props.data.metadata.category)}
|
|
226
229
|
class="flowdrop-workflow-node__icon"
|
|
227
230
|
/>
|
|
228
231
|
</div>
|
|
229
232
|
<!-- Circle dot — visibility controlled by --fd-node-circle-display -->
|
|
230
233
|
<span
|
|
231
234
|
class="flowdrop-workflow-node__color-dot"
|
|
232
|
-
style="background: {getCategoryColorToken(props.data.metadata.category)}"
|
|
235
|
+
style="background: {getCategoryColorToken(fd.categories, props.data.metadata.category)}"
|
|
233
236
|
></span>
|
|
234
237
|
|
|
235
238
|
<!-- Node Title - Icon and Title on same line -->
|
|
@@ -262,6 +265,7 @@
|
|
|
262
265
|
id={`${props.data.nodeId}-input-${port.id}`}
|
|
263
266
|
class="flowdrop-workflow-node__handle"
|
|
264
267
|
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColorToken(
|
|
268
|
+
checker,
|
|
265
269
|
port.dataType
|
|
266
270
|
)}); --fd-handle-border-color: var(--fd-handle-border);"
|
|
267
271
|
tabindex={-1}
|
|
@@ -274,11 +278,13 @@
|
|
|
274
278
|
<span
|
|
275
279
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
276
280
|
style="background-color: {getPortBackgroundColor(
|
|
281
|
+
checker,
|
|
277
282
|
port.dataType,
|
|
278
283
|
15
|
|
279
284
|
)}; color: {getDataTypeColorToken(
|
|
285
|
+
checker,
|
|
280
286
|
port.dataType
|
|
281
|
-
)}; border: 1px solid {getPortBackgroundColor(port.dataType, 30)};"
|
|
287
|
+
)}; border: 1px solid {getPortBackgroundColor(checker, port.dataType, 30)};"
|
|
282
288
|
>
|
|
283
289
|
{port.dataType}
|
|
284
290
|
</span>
|
|
@@ -315,11 +321,13 @@
|
|
|
315
321
|
<span
|
|
316
322
|
class="flowdrop-badge flowdrop-badge--sm"
|
|
317
323
|
style="background-color: {getPortBackgroundColor(
|
|
324
|
+
checker,
|
|
318
325
|
port.dataType,
|
|
319
326
|
15
|
|
320
327
|
)}; color: {getDataTypeColorToken(
|
|
328
|
+
checker,
|
|
321
329
|
port.dataType
|
|
322
|
-
)}; border: 1px solid {getPortBackgroundColor(port.dataType, 30)};"
|
|
330
|
+
)}; border: 1px solid {getPortBackgroundColor(checker, port.dataType, 30)};"
|
|
323
331
|
>
|
|
324
332
|
{port.dataType}
|
|
325
333
|
</span>
|
|
@@ -338,6 +346,7 @@
|
|
|
338
346
|
id={`${props.data.nodeId}-output-${port.id}`}
|
|
339
347
|
class="flowdrop-workflow-node__handle"
|
|
340
348
|
style="top: 50%; transform: translateY(-50%); --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColorToken(
|
|
349
|
+
checker,
|
|
341
350
|
port.dataType
|
|
342
351
|
)}); --fd-handle-border-color: var(--fd-handle-border);"
|
|
343
352
|
tabindex={-1}
|
|
@@ -12,14 +12,11 @@
|
|
|
12
12
|
import Icon from '@iconify/svelte';
|
|
13
13
|
import { tick, untrack } from 'svelte';
|
|
14
14
|
import { hasEnableRunFlag } from '../../types/playground.js';
|
|
15
|
-
import {
|
|
16
|
-
getMessages,
|
|
17
|
-
getIsExecuting,
|
|
18
|
-
getCanSendMessage,
|
|
19
|
-
getCurrentSession
|
|
20
|
-
} from '../../stores/playgroundStore.svelte.js';
|
|
15
|
+
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
21
16
|
import { m } from '../../messages/index.js';
|
|
22
17
|
|
|
18
|
+
const fd = getInstance();
|
|
19
|
+
|
|
23
20
|
interface Props {
|
|
24
21
|
placeholder?: string;
|
|
25
22
|
/** Show the textarea (default: true). When false, only the Run button is shown. */
|
|
@@ -65,7 +62,7 @@
|
|
|
65
62
|
let seenEnableRunCount = 0;
|
|
66
63
|
|
|
67
64
|
$effect(() => {
|
|
68
|
-
const count =
|
|
65
|
+
const count = fd.playground.messages.filter((m) => hasEnableRunFlag(m.metadata)).length;
|
|
69
66
|
if (count > seenEnableRunCount) {
|
|
70
67
|
untrack(() => {
|
|
71
68
|
seenEnableRunCount = count;
|
|
@@ -75,7 +72,7 @@
|
|
|
75
72
|
});
|
|
76
73
|
|
|
77
74
|
$effect(() => {
|
|
78
|
-
if (
|
|
75
|
+
if (fd.playground.currentSession?.id) {
|
|
79
76
|
untrack(() => {
|
|
80
77
|
seenEnableRunCount = 0;
|
|
81
78
|
});
|
|
@@ -87,7 +84,7 @@
|
|
|
87
84
|
|
|
88
85
|
/** Auto-focus input when execution completes */
|
|
89
86
|
$effect(() => {
|
|
90
|
-
const nowExecuting =
|
|
87
|
+
const nowExecuting = fd.playground.isExecuting;
|
|
91
88
|
if (wasExecuting && !nowExecuting && inputField) {
|
|
92
89
|
tick().then(() => inputField?.focus({ preventScroll: true }));
|
|
93
90
|
}
|
|
@@ -98,7 +95,7 @@
|
|
|
98
95
|
|
|
99
96
|
function handleSend(): void {
|
|
100
97
|
const trimmedValue = inputValue.trim();
|
|
101
|
-
if (!trimmedValue || !
|
|
98
|
+
if (!trimmedValue || !fd.playground.canSendMessage) return;
|
|
102
99
|
|
|
103
100
|
onSendMessage?.(trimmedValue);
|
|
104
101
|
inputValue = '';
|
|
@@ -124,7 +121,7 @@
|
|
|
124
121
|
}
|
|
125
122
|
|
|
126
123
|
function handleRun(): void {
|
|
127
|
-
if (
|
|
124
|
+
if (fd.playground.isExecuting || !runEnabled) return;
|
|
128
125
|
runEnabled = false;
|
|
129
126
|
onSendMessage?.(resolvedPredefinedMessage);
|
|
130
127
|
}
|
|
@@ -153,14 +150,14 @@
|
|
|
153
150
|
class="chat-input__textarea"
|
|
154
151
|
placeholder={resolvedPlaceholder}
|
|
155
152
|
rows="1"
|
|
156
|
-
disabled={
|
|
153
|
+
disabled={fd.playground.isExecuting || !fd.playground.currentSession}
|
|
157
154
|
onkeydown={handleKeydown}
|
|
158
155
|
oninput={handleInput}
|
|
159
156
|
></textarea>
|
|
160
157
|
</div>
|
|
161
158
|
{/if}
|
|
162
159
|
|
|
163
|
-
{#if
|
|
160
|
+
{#if fd.playground.isExecuting}
|
|
164
161
|
<button
|
|
165
162
|
type="button"
|
|
166
163
|
class="chat-input__stop-btn"
|
|
@@ -176,7 +173,7 @@
|
|
|
176
173
|
type="button"
|
|
177
174
|
class="chat-input__send-btn"
|
|
178
175
|
onclick={handleSend}
|
|
179
|
-
disabled={!inputValue.trim() || !
|
|
176
|
+
disabled={!inputValue.trim() || !fd.playground.canSendMessage}
|
|
180
177
|
title={actions.sendTitle}
|
|
181
178
|
aria-label={actions.sendTitle}
|
|
182
179
|
>
|