@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.
Files changed (215) hide show
  1. package/CHANGELOG.md +475 -0
  2. package/MIGRATION-2.0.md +472 -0
  3. package/README.md +23 -23
  4. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  5. package/dist/adapters/WorkflowAdapter.js +14 -8
  6. package/dist/adapters/agentspec/AgentSpecAdapter.js +7 -7
  7. package/dist/chat/batchFeedback.d.ts +39 -0
  8. package/dist/chat/batchFeedback.js +51 -0
  9. package/dist/commands/executor.js +15 -1
  10. package/dist/commands/storeIntegration.svelte.d.ts +4 -1
  11. package/dist/commands/storeIntegration.svelte.js +26 -21
  12. package/dist/commands/types.d.ts +2 -0
  13. package/dist/components/App.svelte +162 -192
  14. package/dist/components/App.svelte.d.ts +47 -8
  15. package/dist/components/ConfigForm.svelte +71 -47
  16. package/dist/components/ConfigModal.svelte +7 -2
  17. package/dist/components/ConnectionLine.svelte +4 -2
  18. package/dist/components/Navbar.svelte +61 -1
  19. package/dist/components/NodeSidebar.svelte +27 -45
  20. package/dist/components/NodeStatusOverlay.svelte +94 -6
  21. package/dist/components/NodeSwapPicker.svelte +10 -8
  22. package/dist/components/PipelineStatus.svelte +16 -67
  23. package/dist/components/PortCoordinateTracker.svelte +5 -6
  24. package/dist/components/SchemaForm.stories.svelte +1 -3
  25. package/dist/components/SchemaForm.svelte +18 -25
  26. package/dist/components/SchemaForm.svelte.d.ts +0 -8
  27. package/dist/components/SettingsModal.svelte +8 -3
  28. package/dist/components/SettingsPanel.svelte +20 -4
  29. package/dist/components/SwapMappingEditor.svelte +67 -49
  30. package/dist/components/SwapMappingEditor.svelte.d.ts +0 -2
  31. package/dist/components/UniversalNode.svelte +9 -7
  32. package/dist/components/WorkflowEditor.svelte +118 -111
  33. package/dist/components/WorkflowEditor.svelte.d.ts +18 -10
  34. package/dist/components/chat/AIChatPanel.svelte +93 -89
  35. package/dist/components/chat/AIChatPanel.svelte.d.ts +0 -4
  36. package/dist/components/chat/CommandPreview.svelte +2 -1
  37. package/dist/components/console/CommandConsole.svelte +7 -5
  38. package/dist/components/console/ConsoleAutocomplete.svelte +10 -11
  39. package/dist/components/console/ConsoleAutocomplete.svelte.d.ts +6 -0
  40. package/dist/components/console/ConsoleInput.svelte +15 -6
  41. package/dist/components/console/ConsoleOutput.svelte +2 -1
  42. package/dist/components/form/FormArray.svelte +5 -9
  43. package/dist/components/form/FormArray.svelte.d.ts +2 -1
  44. package/dist/components/form/FormAutocomplete.svelte +8 -6
  45. package/dist/components/form/FormField.svelte +4 -2
  46. package/dist/components/form/FormFieldLight.svelte +4 -2
  47. package/dist/components/form/FormMarkdownEditor.svelte +9 -4
  48. package/dist/components/form/FormRangeField.svelte +1 -0
  49. package/dist/components/form/FormTemplateEditor.svelte +11 -3
  50. package/dist/components/form/FormToggle.svelte +5 -12
  51. package/dist/components/form/FormToggle.svelte.d.ts +4 -2
  52. package/dist/components/form/templateAutocomplete.js +1 -5
  53. package/dist/components/form/types.d.ts +1 -14
  54. package/dist/components/interrupt/FormPrompt.svelte +3 -2
  55. package/dist/components/interrupt/InterruptBubble.svelte +16 -17
  56. package/dist/components/interrupt/ReviewPrompt.svelte +10 -3
  57. package/dist/components/interrupt/TextInputPrompt.svelte +2 -1
  58. package/dist/components/layouts/MainLayout.svelte +20 -13
  59. package/dist/components/layouts/MainLayout.svelte.d.ts +4 -0
  60. package/dist/components/nodes/AtomNode.svelte +17 -5
  61. package/dist/components/nodes/GatewayNode.svelte +19 -10
  62. package/dist/components/nodes/IdeaNode.svelte +7 -0
  63. package/dist/components/nodes/SimpleNode.svelte +11 -6
  64. package/dist/components/nodes/SquareNode.svelte +15 -8
  65. package/dist/components/nodes/TerminalNode.svelte +9 -4
  66. package/dist/components/nodes/ToolNode.svelte +7 -1
  67. package/dist/components/nodes/WorkflowNode.svelte +16 -7
  68. package/dist/components/playground/ChatInput.svelte +11 -14
  69. package/dist/components/playground/ChatPanel.svelte +6 -49
  70. package/dist/components/playground/ChatPanel.svelte.d.ts +0 -14
  71. package/dist/components/playground/ControlPanel.svelte +134 -123
  72. package/dist/components/playground/ControlPanel.svelte.d.ts +3 -0
  73. package/dist/components/playground/ExecutionLogs.svelte +11 -9
  74. package/dist/components/playground/InputCollector.svelte +11 -9
  75. package/dist/components/playground/MessageStream.svelte +17 -23
  76. package/dist/components/playground/PipelineKanbanView.svelte +65 -6
  77. package/dist/components/playground/PipelinePanel.svelte +11 -5
  78. package/dist/components/playground/PipelineTableView.svelte +186 -44
  79. package/dist/components/playground/Playground.svelte +90 -92
  80. package/dist/components/playground/Playground.svelte.d.ts +2 -0
  81. package/dist/components/playground/PlaygroundApp.svelte +6 -1
  82. package/dist/components/playground/PlaygroundApp.svelte.d.ts +3 -0
  83. package/dist/components/playground/PlaygroundModal.svelte +13 -3
  84. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -0
  85. package/dist/components/playground/PlaygroundStudio.svelte +34 -32
  86. package/dist/components/playground/PlaygroundStudio.svelte.d.ts +3 -0
  87. package/dist/components/playground/SessionManager.svelte +9 -12
  88. package/dist/components/playground/pipelineViewUtils.svelte.d.ts +28 -0
  89. package/dist/components/playground/pipelineViewUtils.svelte.js +38 -1
  90. package/dist/config/endpoints.d.ts +0 -7
  91. package/dist/config/endpoints.js +2 -10
  92. package/dist/core/index.d.ts +4 -4
  93. package/dist/core/index.js +6 -6
  94. package/dist/display/index.d.ts +0 -2
  95. package/dist/display/index.js +0 -6
  96. package/dist/editor/index.d.ts +19 -20
  97. package/dist/editor/index.js +25 -35
  98. package/dist/form/code.d.ts +25 -15
  99. package/dist/form/code.js +44 -41
  100. package/dist/form/fieldRegistry.d.ts +17 -13
  101. package/dist/form/fieldRegistry.js +32 -12
  102. package/dist/form/full.d.ts +17 -13
  103. package/dist/form/full.js +22 -27
  104. package/dist/form/index.d.ts +3 -3
  105. package/dist/form/index.js +3 -3
  106. package/dist/form/markdown.d.ts +13 -8
  107. package/dist/form/markdown.js +22 -23
  108. package/dist/helpers/proximityConnect.d.ts +3 -2
  109. package/dist/helpers/proximityConnect.js +2 -5
  110. package/dist/helpers/workflowEditorHelper.d.ts +12 -5
  111. package/dist/helpers/workflowEditorHelper.js +27 -25
  112. package/dist/index.d.ts +28 -24
  113. package/dist/index.js +27 -50
  114. package/dist/messages/defaults.d.ts +2 -5
  115. package/dist/messages/defaults.js +3 -6
  116. package/dist/messages/index.d.ts +0 -1
  117. package/dist/messages/index.js +0 -1
  118. package/dist/mocks/app-forms.d.ts +6 -2
  119. package/dist/mocks/app-forms.js +11 -4
  120. package/dist/openapi/v1/openapi.yaml +3 -3
  121. package/dist/playground/index.d.ts +2 -3
  122. package/dist/playground/index.js +2 -30
  123. package/dist/playground/mount.d.ts +15 -0
  124. package/dist/playground/mount.js +46 -20
  125. package/dist/registry/{BaseRegistry.d.ts → BaseRegistry.svelte.d.ts} +22 -1
  126. package/dist/registry/{BaseRegistry.js → BaseRegistry.svelte.js} +37 -1
  127. package/dist/registry/builtinFormats.d.ts +9 -18
  128. package/dist/registry/builtinFormats.js +9 -39
  129. package/dist/registry/builtinNodes.d.ts +0 -25
  130. package/dist/registry/builtinNodes.js +1 -50
  131. package/dist/registry/index.d.ts +3 -4
  132. package/dist/registry/index.js +4 -6
  133. package/dist/registry/nodeComponentRegistry.d.ts +182 -15
  134. package/dist/registry/nodeComponentRegistry.js +235 -17
  135. package/dist/registry/workflowFormatRegistry.d.ts +14 -9
  136. package/dist/registry/workflowFormatRegistry.js +24 -8
  137. package/dist/{schema → schemas}/index.d.ts +2 -2
  138. package/dist/{schema → schemas}/index.js +2 -2
  139. package/dist/schemas/v1/workflow.schema.json +3 -3
  140. package/dist/services/agentSpecExecutionService.js +0 -1
  141. package/dist/services/apiVariableService.d.ts +2 -1
  142. package/dist/services/apiVariableService.js +5 -22
  143. package/dist/services/autoSaveService.d.ts +7 -0
  144. package/dist/services/autoSaveService.js +6 -4
  145. package/dist/services/chatService.d.ts +8 -4
  146. package/dist/services/chatService.js +15 -15
  147. package/dist/services/draftStorage.d.ts +129 -13
  148. package/dist/services/draftStorage.js +185 -37
  149. package/dist/services/dynamicSchemaService.d.ts +2 -1
  150. package/dist/services/dynamicSchemaService.js +5 -22
  151. package/dist/services/globalSave.d.ts +13 -12
  152. package/dist/services/globalSave.js +29 -51
  153. package/dist/services/historyService.d.ts +9 -3
  154. package/dist/services/historyService.js +9 -3
  155. package/dist/services/interruptService.d.ts +14 -9
  156. package/dist/services/interruptService.js +27 -27
  157. package/dist/services/nodeExecutionService.d.ts +18 -3
  158. package/dist/services/nodeExecutionService.js +71 -45
  159. package/dist/services/playgroundService.d.ts +14 -9
  160. package/dist/services/playgroundService.js +31 -30
  161. package/dist/services/variableService.d.ts +2 -1
  162. package/dist/services/variableService.js +2 -2
  163. package/dist/services/workflowStorage.js +6 -6
  164. package/dist/stores/apiContext.d.ts +45 -0
  165. package/dist/stores/apiContext.js +65 -0
  166. package/dist/stores/categoriesStore.svelte.d.ts +28 -23
  167. package/dist/stores/categoriesStore.svelte.js +70 -64
  168. package/dist/stores/getInstance.svelte.d.ts +39 -0
  169. package/dist/stores/getInstance.svelte.js +65 -0
  170. package/dist/stores/historyStore.svelte.d.ts +77 -93
  171. package/dist/stores/historyStore.svelte.js +134 -160
  172. package/dist/stores/instanceContainer.svelte.d.ts +111 -0
  173. package/dist/stores/instanceContainer.svelte.js +114 -0
  174. package/dist/stores/interruptStore.svelte.d.ts +112 -82
  175. package/dist/stores/interruptStore.svelte.js +253 -226
  176. package/dist/stores/pipelinePanelStore.svelte.d.ts +27 -3
  177. package/dist/stores/pipelinePanelStore.svelte.js +61 -14
  178. package/dist/stores/playgroundStore.svelte.d.ts +169 -222
  179. package/dist/stores/playgroundStore.svelte.js +515 -580
  180. package/dist/stores/portCoordinateStore.svelte.d.ts +57 -51
  181. package/dist/stores/portCoordinateStore.svelte.js +109 -98
  182. package/dist/stores/settingsStore.svelte.d.ts +4 -1
  183. package/dist/stores/settingsStore.svelte.js +47 -12
  184. package/dist/stores/workflowStore.svelte.d.ts +178 -213
  185. package/dist/stores/workflowStore.svelte.js +449 -501
  186. package/dist/stories/EdgeDecorator.svelte +5 -2
  187. package/dist/stories/NodeDecorator.svelte +5 -3
  188. package/dist/svelte-app.d.ts +60 -10
  189. package/dist/svelte-app.js +157 -53
  190. package/dist/types/events.d.ts +6 -3
  191. package/dist/types/index.d.ts +33 -3
  192. package/dist/types/navbar.d.ts +7 -0
  193. package/dist/types/playground.d.ts +18 -3
  194. package/dist/types/settings.d.ts +13 -0
  195. package/dist/types/settings.js +1 -0
  196. package/dist/utils/colors.d.ts +47 -21
  197. package/dist/utils/colors.js +69 -68
  198. package/dist/utils/connections.d.ts +9 -15
  199. package/dist/utils/connections.js +13 -32
  200. package/dist/utils/duration.d.ts +13 -0
  201. package/dist/utils/duration.js +45 -0
  202. package/dist/utils/icons.d.ts +5 -2
  203. package/dist/utils/icons.js +6 -5
  204. package/dist/utils/nodeSwap.d.ts +6 -2
  205. package/dist/utils/nodeSwap.js +62 -126
  206. package/dist/utils/nodeTypes.d.ts +17 -8
  207. package/dist/utils/nodeTypes.js +26 -19
  208. package/dist/utils/performanceUtils.js +7 -0
  209. package/package.json +6 -5
  210. package/dist/messages/deprecation.d.ts +0 -20
  211. package/dist/messages/deprecation.js +0 -33
  212. package/dist/registry/plugin.d.ts +0 -215
  213. package/dist/registry/plugin.js +0 -249
  214. package/dist/services/api.d.ts +0 -129
  215. package/dist/services/api.js +0 -217
@@ -3,19 +3,8 @@
3
3
  import Icon from '@iconify/svelte';
4
4
  import Playground from './Playground.svelte';
5
5
  import PipelinePanel from './PipelinePanel.svelte';
6
- import {
7
- getPipelinePanelOpen,
8
- pipelinePanelActions
9
- } from '../../stores/pipelinePanelStore.svelte.js';
10
- import {
11
- getActiveExecutionId,
12
- getPinnedExecutionId,
13
- getLatestExecutionId,
14
- getPipelineRefreshTrigger,
15
- getSelectableExecutions,
16
- playgroundActions
17
- } from '../../stores/playgroundStore.svelte.js';
18
- import { setEndpointConfig, workflowApi } from '../../services/api.js';
6
+ import { provideInstance } from '../../stores/getInstance.svelte.js';
7
+ import type { FlowDropInstance } from '../../stores/instanceContainer.svelte.js';
19
8
  import { logger } from '../../utils/logger.js';
20
9
  import type { Workflow, PipelineViewDef } from '../../types/index.js';
21
10
  import type { EndpointConfig } from '../../config/endpoints.js';
@@ -46,6 +35,8 @@
46
35
  onClose?: () => void;
47
36
  /** Additional pipeline views injected by the consumer */
48
37
  extraPipelineViews?: PipelineViewDef[];
38
+ /** Explicit FlowDrop instance; defaults to context or the page-default instance. */
39
+ instance?: FlowDropInstance;
49
40
  }
50
41
 
51
42
  let {
@@ -60,17 +51,28 @@
60
51
  initialPipelineWidth = 500,
61
52
  onSessionNavigate,
62
53
  onClose,
63
- extraPipelineViews = []
54
+ extraPipelineViews = [],
55
+ instance
64
56
  }: Props = $props();
65
57
 
66
- // svelte-ignore state_referenced_locally seed mutable state from the prop's initial value; workflow may load asynchronously below
58
+ // Resolve/provide once at init; the instance prop is a fixed mount-time choice.
59
+ // svelte-ignore state_referenced_locally
60
+ const fd = provideInstance(instance);
61
+
62
+ // Pre-bound toggle for detached callback props (onclick / onTogglePanel).
63
+ const togglePipeline = () => fd.pipelinePanel.toggle();
64
+
65
+ // seed mutable state from the prop's initial value; workflow may load asynchronously below
66
+ // svelte-ignore state_referenced_locally
67
67
  let resolvedWorkflow = $state<Workflow | null>(workflowProp ?? null);
68
- // svelte-ignore state_referenced_locally — initial loading flag derived from whether a workflow was provided up front
68
+ // initial loading flag derived from whether a workflow was provided up front
69
+ // svelte-ignore state_referenced_locally
69
70
  let workflowLoading = $state(workflowProp === undefined);
70
71
  let workflowError = $state<string | null>(null);
71
72
 
72
73
  let splitEl = $state<HTMLElement | null>(null);
73
- // svelte-ignore state_referenced_locally — seed mutable width from the initial prop; it changes as the user drags the resizer
74
+ // seed mutable width from the initial prop; it changes as the user drags the resizer
75
+ // svelte-ignore state_referenced_locally
74
76
  let pipelineWidth = $state(initialPipelineWidth);
75
77
  let isResizing = $state(false);
76
78
  let containerWidth = $state(0);
@@ -92,12 +94,12 @@
92
94
  });
93
95
 
94
96
  onMount(() => {
95
- pipelinePanelActions.init();
97
+ fd.pipelinePanel.init();
96
98
  if (initialPipelineOpen !== undefined) {
97
- pipelinePanelActions.setOpen(initialPipelineOpen);
99
+ fd.pipelinePanel.setOpen(initialPipelineOpen);
98
100
  }
99
101
  if (endpointConfig) {
100
- setEndpointConfig(endpointConfig);
102
+ fd.api.configure(endpointConfig);
101
103
  }
102
104
  if (!workflowProp) {
103
105
  void loadWorkflow();
@@ -115,7 +117,7 @@
115
117
  try {
116
118
  workflowLoading = true;
117
119
  workflowError = null;
118
- resolvedWorkflow = await workflowApi.getWorkflow(workflowId);
120
+ resolvedWorkflow = await fd.api.client.loadWorkflow(workflowId);
119
121
  } catch (err) {
120
122
  workflowError = err instanceof Error ? err.message : 'Failed to load workflow';
121
123
  logger.error('[PlaygroundStudio] Workflow load failed:', err);
@@ -162,16 +164,16 @@
162
164
  style="--playground-studio-min-chat-width: {minChatWidth}px"
163
165
  >
164
166
  <div class="playground-studio__panes" bind:this={splitEl}>
165
- {#if getPipelinePanelOpen() && resolvedWorkflow && endpointConfig}
166
- {@const activeId = getActiveExecutionId()}
167
- {@const executions = getSelectableExecutions()}
167
+ {#if fd.pipelinePanel.isOpen && resolvedWorkflow && endpointConfig}
168
+ {@const activeId = fd.playground.activeExecutionId}
169
+ {@const executions = fd.playground.selectableExecutions}
168
170
 
169
171
  <div class="playground-studio__pipeline" style="width: {pipelineWidth}px;">
170
172
  <button
171
173
  type="button"
172
174
  class="playground-studio__back-to-chat"
173
175
  aria-label="Back to chat"
174
- onclick={pipelinePanelActions.toggle}
176
+ onclick={togglePipeline}
175
177
  >
176
178
  <Icon icon="mdi:arrow-left" aria-hidden="true" />
177
179
  <span>Back to chat</span>
@@ -180,11 +182,11 @@
180
182
  pipelineId={activeId}
181
183
  workflow={resolvedWorkflow}
182
184
  {endpointConfig}
183
- isPinned={getPinnedExecutionId() !== null}
185
+ isPinned={fd.playground.pinnedExecutionId !== null}
184
186
  {executions}
185
- latestExecutionId={getLatestExecutionId()}
186
- onSelectExecution={(id) => playgroundActions.pinExecution(id)}
187
- refreshTrigger={getPipelineRefreshTrigger()}
187
+ latestExecutionId={fd.playground.latestExecutionId}
188
+ onSelectExecution={(id) => fd.playground.pinExecution(id)}
189
+ refreshTrigger={fd.playground.pipelineRefreshTrigger}
188
190
  extraViews={extraPipelineViews}
189
191
  />
190
192
  </div>
@@ -214,7 +216,7 @@
214
216
 
215
217
  <div
216
218
  class="playground-studio__chat"
217
- class:playground-studio__chat--solo={!getPipelinePanelOpen()}
219
+ class:playground-studio__chat--solo={!fd.pipelinePanel.isOpen}
218
220
  >
219
221
  {#if workflowLoading}
220
222
  <div class="playground-studio__loading">
@@ -241,8 +243,8 @@
241
243
  {config}
242
244
  {onClose}
243
245
  {onSessionNavigate}
244
- onTogglePanel={pipelinePanelActions.toggle}
245
- isPipelinePanelOpen={getPipelinePanelOpen()}
246
+ onTogglePanel={togglePipeline}
247
+ isPipelinePanelOpen={fd.pipelinePanel.isOpen}
246
248
  />
247
249
  {/key}
248
250
  {/if}
@@ -1,3 +1,4 @@
1
+ import type { FlowDropInstance } from '../../stores/instanceContainer.svelte.js';
1
2
  import type { Workflow, PipelineViewDef } from '../../types/index.js';
2
3
  import type { EndpointConfig } from '../../config/endpoints.js';
3
4
  import type { PlaygroundConfig, PlaygroundMode } from '../../types/playground.js';
@@ -26,6 +27,8 @@ interface Props {
26
27
  onClose?: () => void;
27
28
  /** Additional pipeline views injected by the consumer */
28
29
  extraPipelineViews?: PipelineViewDef[];
30
+ /** Explicit FlowDrop instance; defaults to context or the page-default instance. */
31
+ instance?: FlowDropInstance;
29
32
  }
30
33
  declare const PlaygroundStudio: import("svelte").Component<Props, {}, "">;
31
34
  type PlaygroundStudio = ReturnType<typeof PlaygroundStudio>;
@@ -10,14 +10,11 @@
10
10
  import Icon from '@iconify/svelte';
11
11
  import { slide } from 'svelte/transition';
12
12
  import type { PlaygroundSession } from '../../types/playground.js';
13
- import {
14
- getSessions,
15
- getCurrentSession,
16
- getIsLoading,
17
- getSessionCount
18
- } from '../../stores/playgroundStore.svelte.js';
13
+ import { getInstance } from '../../stores/getInstance.svelte.js';
19
14
  import { m } from '../../messages/index.js';
20
15
 
16
+ const fd = getInstance();
17
+
21
18
  /**
22
19
  * Component props
23
20
  */
@@ -175,8 +172,8 @@
175
172
  <div class="session-manager__title">
176
173
  <Icon icon="mdi:history" />
177
174
  <span>{t.header}</span>
178
- {#if getSessionCount() > 0}
179
- <span class="session-manager__count">{getSessionCount()}</span>
175
+ {#if fd.playground.sessionCount > 0}
176
+ <span class="session-manager__count">{fd.playground.sessionCount}</span>
180
177
  {/if}
181
178
  </div>
182
179
  <Icon
@@ -193,7 +190,7 @@
193
190
  type="button"
194
191
  class="session-manager__new-btn"
195
192
  onclick={onCreateSession}
196
- disabled={getIsLoading()}
193
+ disabled={fd.playground.isLoading}
197
194
  >
198
195
  <Icon icon="mdi:plus" />
199
196
  {t.newSession}
@@ -201,16 +198,16 @@
201
198
 
202
199
  <!-- Sessions List -->
203
200
  <div class="session-manager__list">
204
- {#if getSessions().length === 0}
201
+ {#if fd.playground.sessions.length === 0}
205
202
  <div class="session-manager__empty">
206
203
  <Icon icon="mdi:chat-outline" />
207
204
  <span>{t.empty}</span>
208
205
  </div>
209
206
  {:else}
210
- {#each getSessions() as session (session.id)}
207
+ {#each fd.playground.sessions as session (session.id)}
211
208
  <div
212
209
  class="session-manager__item"
213
- class:session-manager__item--active={getCurrentSession()?.id === session.id}
210
+ class:session-manager__item--active={fd.playground.currentSession?.id === session.id}
214
211
  role="button"
215
212
  tabindex="0"
216
213
  onclick={() => handleSelectSession(session.id)}
@@ -5,7 +5,34 @@ export interface NodeStatusData {
5
5
  status: string;
6
6
  last_executed?: string | null;
7
7
  execution_time?: number | null;
8
+ /** Precise duration in microseconds, from orchestrator-stamped job metadata */
9
+ execution_time_us?: number | null;
8
10
  error?: string | null;
11
+ /** Number of jobs for this node that actually ran (loop iterations) */
12
+ executions?: number | null;
13
+ /** Per-status job counts, e.g. { completed: 2, skipped: 1 } */
14
+ status_counts?: Record<string, number> | null;
15
+ }
16
+ /**
17
+ * One job from the pipeline payload. Loop-orchestrated workflows create one
18
+ * job per iteration for the same node, so a node can have several of these —
19
+ * the label carries the iteration suffix (e.g. "Invoke tool #2").
20
+ */
21
+ export interface PipelineJobItem {
22
+ id: string;
23
+ label: string;
24
+ nodeId: string;
25
+ status: string;
26
+ createdAt?: string | null;
27
+ started?: string | null;
28
+ completed?: string | null;
29
+ /** Precise duration in microseconds, when the job ran to completion */
30
+ executionTimeUs?: number | null;
31
+ error?: string | null;
32
+ retryCount?: number | null;
33
+ maxRetries?: number | null;
34
+ inputData?: unknown;
35
+ outputData?: unknown;
9
36
  }
10
37
  export declare function resolveStatus(raw: NodeStatusData | undefined): NodeStatus;
11
38
  /**
@@ -15,6 +42,7 @@ export declare function resolveStatus(raw: NodeStatusData | undefined): NodeStat
15
42
  */
16
43
  export declare function createPipelineDataFetcher(getPipelineId: () => string, endpointConfig: EndpointConfig): {
17
44
  readonly nodeStatusMap: Record<string, NodeStatusData>;
45
+ readonly jobs: PipelineJobItem[];
18
46
  readonly kanbanConfig: KanbanColumnDef[] | null;
19
47
  readonly isLoading: boolean;
20
48
  readonly isError: boolean;
@@ -11,6 +11,35 @@ const KNOWN_STATUSES = new Set([
11
11
  'failed',
12
12
  'cancelled'
13
13
  ]);
14
+ function toJobItem(raw, index) {
15
+ const started = typeof raw.started === 'string' ? raw.started : null;
16
+ const completed = typeof raw.completed === 'string' ? raw.completed : null;
17
+ // Prefer the orchestrator-stamped microsecond duration; fall back to the
18
+ // second-granularity timestamps for jobs that predate the metadata stamp.
19
+ let executionTimeUs = typeof raw.execution_time_us === 'number' ? raw.execution_time_us : null;
20
+ if (executionTimeUs == null && started && completed) {
21
+ const startMs = Date.parse(started);
22
+ const endMs = Date.parse(completed);
23
+ if (!Number.isNaN(startMs) && !Number.isNaN(endMs)) {
24
+ executionTimeUs = (endMs - startMs) * 1000;
25
+ }
26
+ }
27
+ return {
28
+ id: typeof raw.id === 'string' || typeof raw.id === 'number' ? String(raw.id) : `job-${index}`,
29
+ label: typeof raw.label === 'string' ? raw.label : '',
30
+ nodeId: typeof raw.node_id === 'string' ? raw.node_id : '',
31
+ status: typeof raw.status === 'string' ? raw.status : 'idle',
32
+ createdAt: typeof raw.created_at === 'string' ? raw.created_at : null,
33
+ started,
34
+ completed,
35
+ executionTimeUs,
36
+ error: typeof raw.error_message === 'string' ? raw.error_message : null,
37
+ retryCount: typeof raw.retry_count === 'number' ? raw.retry_count : null,
38
+ maxRetries: typeof raw.max_retries === 'number' ? raw.max_retries : null,
39
+ inputData: raw.input_data ?? null,
40
+ outputData: raw.output_data ?? null
41
+ };
42
+ }
14
43
  export function resolveStatus(raw) {
15
44
  if (!raw)
16
45
  return 'pending';
@@ -29,6 +58,7 @@ export function resolveStatus(raw) {
29
58
  export function createPipelineDataFetcher(getPipelineId, endpointConfig) {
30
59
  const client = new EnhancedFlowDropApiClient(endpointConfig);
31
60
  let nodeStatusMap = $state({});
61
+ let jobs = $state([]);
32
62
  let kanbanConfig = $state(null);
33
63
  let isLoading = $state(false);
34
64
  let isError = $state(false);
@@ -43,10 +73,14 @@ export function createPipelineDataFetcher(getPipelineId, endpointConfig) {
43
73
  status: info.status,
44
74
  last_executed: info.last_executed,
45
75
  execution_time: info.execution_time,
46
- error: info.error
76
+ execution_time_us: info.execution_time_us,
77
+ error: info.error,
78
+ executions: info.executions,
79
+ status_counts: info.status_counts
47
80
  };
48
81
  }
49
82
  nodeStatusMap = map;
83
+ jobs = (data.jobs ?? []).map(toJobItem);
50
84
  if (data.kanban_config?.columns) {
51
85
  // Server sends statuses as string[]; trust the server and cast at this
52
86
  // boundary. resolveStatus() handles unknown values at read time.
@@ -70,6 +104,9 @@ export function createPipelineDataFetcher(getPipelineId, endpointConfig) {
70
104
  get nodeStatusMap() {
71
105
  return nodeStatusMap;
72
106
  },
107
+ get jobs() {
108
+ return jobs;
109
+ },
73
110
  get kanbanConfig() {
74
111
  return kanbanConfig;
75
112
  },
@@ -110,13 +110,6 @@ export interface EndpointConfig {
110
110
  headers?: {
111
111
  [key: string]: Record<string, string>;
112
112
  };
113
- /** Authentication configuration */
114
- auth?: {
115
- type: 'none' | 'bearer' | 'api_key' | 'custom';
116
- token?: string;
117
- apiKey?: string;
118
- headers?: Record<string, string>;
119
- };
120
113
  /** Request timeout in milliseconds */
121
114
  timeout?: number;
122
115
  /** Retry configuration */
@@ -132,16 +132,8 @@ export function getEndpointHeaders(config, endpointKey) {
132
132
  const baseHeaders = {
133
133
  'Content-Type': 'application/json'
134
134
  };
135
- // Add authentication headers
136
- if (config.auth?.type === 'bearer' && config.auth.token) {
137
- baseHeaders['Authorization'] = `Bearer ${config.auth.token}`;
138
- }
139
- else if (config.auth?.type === 'api_key' && config.auth.apiKey) {
140
- baseHeaders['X-API-Key'] = config.auth.apiKey;
141
- }
142
- else if (config.auth?.type === 'custom' && config.auth.headers) {
143
- Object.assign(baseHeaders, config.auth.headers);
144
- }
135
+ // Authentication is supplied via the AuthProvider passed to the API client /
136
+ // ApiContext EndpointConfig no longer carries an `auth` block.
145
137
  // Add endpoint-specific headers
146
138
  const endpointHeaders = config.headers?.[endpointKey];
147
139
  if (endpointHeaders) {
@@ -22,12 +22,12 @@ export type { WorkflowEditorConfig, EditorFeatures, UIConfig, APIConfig, Executi
22
22
  export type { AuthProvider, StaticAuthConfig, CallbackAuthConfig } from '../types/auth.js';
23
23
  export type { WorkflowChangeType, FlowDropEventHandlers, FlowDropFeatures } from '../types/events.js';
24
24
  export type { FieldSchema, FieldType, FieldFormat, FieldOption, SchemaFormProps, BaseFieldProps, TextFieldProps, TextareaFieldProps, NumberFieldProps, ToggleFieldProps, RangeFieldProps, SelectFieldProps, CheckboxGroupFieldProps, ArrayFieldProps, CodeEditorFieldProps, MarkdownEditorFieldProps, TemplateEditorFieldProps, FormFieldFactoryProps, FormFieldWrapperProps } from '../components/form/types.js';
25
- export { BaseRegistry } from '../registry/BaseRegistry.js';
25
+ export { BaseRegistry } from '../registry/BaseRegistry.svelte.js';
26
26
  export type { NodeComponentProps, NodeTypeInfo, NodeComponentRegistration, NodeComponentCategory, StatusPosition, StatusSize, NodeRegistrationFilter, FlowDropPluginConfig, PluginNodeDefinition, PluginRegistrationResult } from '../registry/index.js';
27
27
  export type { FieldMatcherRegistration } from '../form/fieldRegistry.js';
28
- export { workflowFormatRegistry } from '../registry/workflowFormatRegistry.js';
28
+ export { WorkflowFormatRegistry } from '../registry/workflowFormatRegistry.js';
29
29
  export type { WorkflowFormatAdapter, FormatValidationResult } from '../registry/workflowFormatRegistry.js';
30
- export { registerBuiltinFormats, areBuiltinFormatsRegistered, resetBuiltinFormatRegistration } from '../registry/builtinFormats.js';
30
+ export { getBuiltinFormatAdapters } from '../registry/builtinFormats.js';
31
31
  export type { ToastType, ToastOptions } from '../services/toastService.js';
32
32
  export type { DynamicSchemaResult } from '../services/dynamicSchemaService.js';
33
33
  export type { PlaygroundSession, PlaygroundMessage, PlaygroundInputField, PlaygroundMessageRequest, PlaygroundMessagesResult, PlaygroundConfig, PlaygroundMode, PlaygroundSessionStatus, PlaygroundMessageRole, PlaygroundMessageLevel, PlaygroundMessageMetadata, PlaygroundApiResponse, PlaygroundSessionsResponse, PlaygroundSessionResponse, PlaygroundMessageResponse, PlaygroundMessagesApiResponse } from '../types/playground.js';
@@ -70,7 +70,7 @@ export type { AgentSpecEndpointConfig } from '../config/agentSpecEndpoints.js';
70
70
  export { defaultAgentSpecEndpoints, createAgentSpecEndpointConfig, buildAgentSpecUrl, getAgentSpecAuthHeaders } from '../config/agentSpecEndpoints.js';
71
71
  export { AgentSpecExecutionService, agentSpecExecutionService } from '../services/agentSpecExecutionService.js';
72
72
  export type { AgentSpecExecutionHandle } from '../services/agentSpecExecutionService.js';
73
- export { workflowSchema, WORKFLOW_SCHEMA_VERSION } from '../schema/index.js';
73
+ export { workflowSchema, WORKFLOW_SCHEMA_VERSION } from '../schemas/index.js';
74
74
  export type { FlowDropTheme, FlowDropThemeName, FlowDropThemeConfig } from '../types/theme.js';
75
75
  export { defaultTheme, minimalTheme, resolveTheme } from '../themes/index.js';
76
76
  export type { FlowDropSkin, FlowDropSkinName, FlowDropSkinTokens } from '../types/skin.js';
@@ -17,11 +17,11 @@
17
17
  export { DEFAULT_WORKFLOW_FORMAT } from '../types/index.js';
18
18
  export { isUISchemaControl, isUISchemaVerticalLayout, isUISchemaGroup } from '../types/index.js';
19
19
  // Base registry
20
- export { BaseRegistry } from '../registry/BaseRegistry.js';
21
- // Workflow format registry
22
- export { workflowFormatRegistry } from '../registry/workflowFormatRegistry.js';
23
- // Built-in format registration helpers
24
- export { registerBuiltinFormats, areBuiltinFormatsRegistered, resetBuiltinFormatRegistration } from '../registry/builtinFormats.js';
20
+ export { BaseRegistry } from '../registry/BaseRegistry.svelte.js';
21
+ // Workflow format registry (the class — instances live on `fd.formats`)
22
+ export { WorkflowFormatRegistry } from '../registry/workflowFormatRegistry.js';
23
+ // Built-in format adapters (used to seed instance format registries)
24
+ export { getBuiltinFormatAdapters } from '../registry/builtinFormats.js';
25
25
  export { isChatInputNode, CHAT_INPUT_PATTERNS } from '../types/playground.js';
26
26
  // ============================================================================
27
27
  // Authentication Providers (no dependencies)
@@ -85,7 +85,7 @@ export { AgentSpecExecutionService, agentSpecExecutionService } from '../service
85
85
  // ============================================================================
86
86
  // Workflow JSON Schema
87
87
  // ============================================================================
88
- export { workflowSchema, WORKFLOW_SCHEMA_VERSION } from '../schema/index.js';
88
+ export { workflowSchema, WORKFLOW_SCHEMA_VERSION } from '../schemas/index.js';
89
89
  export { defaultTheme, minimalTheme, resolveTheme } from '../themes/index.js';
90
90
  export { slateSkin, defaultSkin } from '../skins/index.js';
91
91
  export { getTheme as theme, getResolvedTheme as resolvedTheme, setTheme, toggleTheme, cycleTheme, initializeTheme, isThemeInitialized } from '../stores/settingsStore.svelte.js';
@@ -2,7 +2,6 @@
2
2
  * FlowDrop Display Module
3
3
  *
4
4
  * Provides display components for rendering content.
5
- * This module includes the marked library for markdown rendering.
6
5
  *
7
6
  * @module display
8
7
  *
@@ -26,4 +25,3 @@
26
25
  * ```
27
26
  */
28
27
  export { default as MarkdownDisplay } from '../components/MarkdownDisplay.svelte';
29
- export { marked } from 'marked';
@@ -2,7 +2,6 @@
2
2
  * FlowDrop Display Module
3
3
  *
4
4
  * Provides display components for rendering content.
5
- * This module includes the marked library for markdown rendering.
6
5
  *
7
6
  * @module display
8
7
  *
@@ -29,8 +28,3 @@
29
28
  // Display Components
30
29
  // ============================================================================
31
30
  export { default as MarkdownDisplay } from '../components/MarkdownDisplay.svelte';
32
- // ============================================================================
33
- // Re-export marked for advanced usage
34
- // ============================================================================
35
- // Users can use marked directly if they need more control
36
- export { marked } from 'marked';
@@ -5,9 +5,14 @@
5
5
  * building visual workflow editors. This module includes @xyflow/svelte
6
6
  * and all node components.
7
7
  *
8
- * **Important: Single-instance only.** FlowDrop uses module-level singleton
9
- * stores for state management. Only one FlowDrop editor instance per page
10
- * is supported. This is a known architectural limitation.
8
+ * **Multi-instance support.** Each mount gets its own `FlowDropInstance`
9
+ * state container (workflow, undo/redo, playground, …), so multiple editors
10
+ * can coexist on one page. Pass `instanceId` to the mount options to scope
11
+ * draft/panel storage keys per editor; in Svelte, pass `instance` to <App>
12
+ * or resolve it in components via `getInstance()`. State is addressed through
13
+ * the instance — there is no page-default module-level store API.
14
+ * Page-global by design: theme/settings, port-compatibility config, and API
15
+ * endpoint config.
11
16
  *
12
17
  * @module editor
13
18
  *
@@ -31,7 +36,6 @@
31
36
  * <WorkflowEditor nodes={availableNodes} />
32
37
  * ```
33
38
  */
34
- import '../registry/builtinNodes.js';
35
39
  export { default as WorkflowEditor } from '../components/WorkflowEditor.svelte';
36
40
  export { default as App } from '../components/App.svelte';
37
41
  export { default as WorkflowNodeComponent } from '../components/nodes/WorkflowNode.svelte';
@@ -58,33 +62,28 @@ export { default as PipelineStatus } from '../components/PipelineStatus.svelte';
58
62
  export { default as Navbar } from '../components/Navbar.svelte';
59
63
  export { default as Logo } from '../components/Logo.svelte';
60
64
  export { default as CommandConsole } from '../components/console/CommandConsole.svelte';
61
- export { default as Playground } from '../components/playground/Playground.svelte';
62
- export { default as PlaygroundModal } from '../components/playground/PlaygroundModal.svelte';
63
- export { default as ChatPanel } from '../components/playground/ChatPanel.svelte';
64
- export { default as SessionManager } from '../components/playground/SessionManager.svelte';
65
- export { default as InputCollector } from '../components/playground/InputCollector.svelte';
66
- export { default as ExecutionLogs } from '../components/playground/ExecutionLogs.svelte';
67
- export { default as MessageBubble } from '../components/playground/MessageBubble.svelte';
68
65
  export { mountWorkflowEditor, mountFlowDropApp, unmountFlowDropApp } from '../svelte-app.js';
69
- export { nodeComponentRegistry, createNamespacedType, parseNamespacedType, BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE, registerBuiltinNodes, areBuiltinsRegistered, isBuiltinType, getBuiltinTypes, resolveBuiltinAlias, registerFlowDropPlugin, unregisterFlowDropPlugin, registerCustomNode, createPlugin, isValidNamespace, getRegisteredPlugins, getPluginNodeCount } from '../registry/index.js';
66
+ export { NodeComponentRegistry, createNamespacedType, parseNamespacedType, BUILTIN_NODE_COMPONENTS, BUILTIN_NODE_TYPES, FLOWDROP_SOURCE, isBuiltinType, getBuiltinTypes, resolveBuiltinAlias, createPlugin, isValidNamespace } from '../registry/index.js';
70
67
  export { EdgeStylingHelper, NodeOperationsHelper, WorkflowOperationsHelper, ConfigurationHelper } from '../helpers/workflowEditorHelper.js';
71
- export { getWorkflowStore, workflowActions, getWorkflowId, getWorkflowName, getWorkflowNodes, getWorkflowEdges, getWorkflowMetadata, getWorkflowFormat, getWorkflowChanged, getWorkflowValidation, getWorkflowMetadataChanged, getConnectedHandles, getIsDirty, isDirty, markAsSaved, getEditVersion, getWorkflow as getWorkflowFromStore, setOnDirtyStateChange, setOnWorkflowChange, setHistoryEnabled, isHistoryEnabled, setRestoringFromHistory } from '../stores/workflowStore.svelte.js';
72
- export { rebuildAllPortCoordinates, updateNodePortCoordinates, removeNodePortCoordinates, getPortCoordinate, getNodePortCoordinates, getPortCoordinateSnapshot, getPortCoordinates } from '../stores/portCoordinateStore.svelte.js';
73
- export { getHistoryState, getCanUndo, getCanRedo, historyActions, setOnRestoreCallback, cleanupHistorySubscription, historyService, HistoryService } from '../stores/historyStore.svelte.js';
68
+ export { createFlowDropInstance, getDefaultInstance, type FlowDropInstance, type CreateInstanceOptions } from '../stores/instanceContainer.svelte.js';
69
+ export { getInstance, provideInstance, FLOWDROP_INSTANCE_KEY } from '../stores/getInstance.svelte.js';
70
+ export { WorkflowStore, type WorkflowStoreActions } from '../stores/workflowStore.svelte.js';
71
+ export { HistoryStore, type HistoryStoreActions } from '../stores/historyStore.svelte.js';
72
+ export { ApiContext } from '../stores/apiContext.js';
73
+ export { PortCoordinateStore } from '../stores/portCoordinateStore.svelte.js';
74
+ export { HistoryService } from '../services/historyService.js';
74
75
  export type { HistoryEntry, HistoryState, PushOptions } from '../stores/historyStore.svelte.js';
75
- export { setEndpointConfig, getEndpointConfig, nodeApi, workflowApi, api } from '../services/api.js';
76
76
  export { showSuccess, showError, showWarning, showInfo, showLoading, dismissToast, dismissAllToasts, showPromise, showConfirmation, apiToasts, workflowToasts, pipelineToasts } from '../services/toastService.js';
77
77
  export { NodeExecutionService, nodeExecutionService } from '../services/nodeExecutionService.js';
78
- export { PlaygroundService, playgroundService } from '../services/playgroundService.js';
79
- export { getCurrentSession, getSessions, getMessages, getIsExecuting, getCanSendMessage, getIsLoading, getError as getPlaygroundError, getCurrentWorkflow, getLastPollSequenceNumber, getSessionStatus, getMessageCount, getChatMessages, getLogMessages, getLatestMessage, getInputFields, getHasChatInput, getSessionCount, playgroundActions, applyServerResponse, subscribeToSessionStatus, getCurrentSessionId, isSessionSelected, getMessagesSnapshot, getLatestSequenceNumber } from '../stores/playgroundStore.svelte.js';
80
78
  export { saveWorkflow, updateWorkflow, getWorkflow, getWorkflows, deleteWorkflow, getWorkflowCount, initializeSampleWorkflows } from '../services/workflowStorage.js';
81
79
  export { globalSaveWorkflow, globalExportWorkflow } from '../services/globalSave.js';
82
80
  export { fetchPortConfig, validatePortConfig } from '../services/portConfigApi.js';
83
81
  export { fetchCategories, validateCategories } from '../services/categoriesApi.js';
84
82
  export { fetchDynamicSchema, resolveExternalEditUrl, getEffectiveConfigEditOptions, clearSchemaCache, invalidateSchemaCache, hasConfigEditOptions, shouldShowExternalEdit, shouldUseDynamicSchema } from '../services/dynamicSchemaService.js';
85
- export { getDraftStorageKey, saveDraft, loadDraft, deleteDraft, hasDraft, getDraftMetadata, clearAllDrafts, DraftAutoSaveManager } from '../services/draftStorage.js';
83
+ export { getDraftStorageKey, saveDraft, loadDraft, deleteDraft, hasDraft, getDraftMetadata, clearAllDrafts, setDraftStorage, getDraftStorage, resolveDraftStorage, DraftAutoSaveManager } from '../services/draftStorage.js';
84
+ export type { DraftStorageAdapter, DraftStorageType, DraftStorageOption } from '../services/draftStorage.js';
86
85
  export { EnhancedFlowDropApiClient, ApiError } from '../api/enhanced-client.js';
87
- export { isLoopbackEdge, isValidLoopbackCycle, PortCompatibilityChecker, initializePortCompatibility, getPortCompatibilityChecker, getPossibleConnections, validateConnection, getConnectionSuggestions, hasCycles, hasInvalidCycles, getExecutionOrder } from '../utils/connections.js';
86
+ export { isLoopbackEdge, isValidLoopbackCycle, PortCompatibilityChecker, getPossibleConnections, validateConnection, getConnectionSuggestions, hasCycles, hasInvalidCycles, getExecutionOrder } from '../utils/connections.js';
88
87
  export { fetchRuntimeConfig, getRuntimeConfig, clearRuntimeConfigCache, initRuntimeConfig } from '../config/runtimeConfig.js';
89
88
  export type { RuntimeConfig } from '../config/runtimeConfig.js';
90
89
  export type { Workflow, WorkflowNode, WorkflowEdge, NodeMetadata, NodePort, DynamicPort, Branch, ExecutionStatus, ExecutionResult, FlowDropConfig, PortConfig, ConfigSchema, ConfigProperty, ConfigEditOptions } from '../types/index.js';