@flowdrop/flowdrop 2.0.0-beta.1 → 2.0.0-beta.3

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 (149) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/MIGRATION-2.0.md +173 -3
  3. package/dist/api/enhanced-client.js +6 -11
  4. package/dist/components/App.svelte +22 -45
  5. package/dist/components/App.svelte.d.ts +2 -7
  6. package/dist/components/CanvasIconButton.svelte +76 -0
  7. package/dist/components/CanvasIconButton.svelte.d.ts +18 -0
  8. package/dist/components/ConfigForm.svelte +6 -21
  9. package/dist/components/ConfigPanel.svelte +4 -3
  10. package/dist/components/LogoWordmark.svelte +113 -0
  11. package/dist/components/LogoWordmark.svelte.d.ts +26 -0
  12. package/dist/components/Navbar.svelte +8 -59
  13. package/dist/components/NodeSidebar.svelte +4 -11
  14. package/dist/components/NodeSwapPicker.svelte +0 -2
  15. package/dist/components/PipelineStatus.svelte +6 -1
  16. package/dist/components/PipelineStatus.svelte.d.ts +3 -0
  17. package/dist/components/PortMappingRow.svelte +0 -2
  18. package/dist/components/SchemaForm.svelte +4 -14
  19. package/dist/components/SettingsModal.svelte +0 -5
  20. package/dist/components/SettingsPanel.svelte +2 -6
  21. package/dist/components/ThemeToggle.svelte +0 -5
  22. package/dist/components/UniversalNode.svelte +32 -1
  23. package/dist/components/WorkflowEditor.svelte +66 -52
  24. package/dist/components/WorkflowEditor.svelte.d.ts +21 -0
  25. package/dist/components/chat/AIChatPanel.svelte +7 -2
  26. package/dist/components/console/ConsoleAutocomplete.svelte +1 -1
  27. package/dist/components/console/ConsoleOutput.svelte +2 -2
  28. package/dist/components/form/FormArray.svelte +0 -16
  29. package/dist/components/form/FormAutocomplete.svelte +18 -15
  30. package/dist/components/form/FormCheckboxGroup.svelte +0 -4
  31. package/dist/components/form/FormCodeEditor.svelte +9 -7
  32. package/dist/components/form/FormFieldLight.svelte +33 -4
  33. package/dist/components/form/FormFieldLight.svelte.d.ts +12 -0
  34. package/dist/components/form/FormMarkdownEditor.svelte +8 -5
  35. package/dist/components/form/FormNumberField.svelte +0 -4
  36. package/dist/components/form/FormRangeField.svelte +1 -20
  37. package/dist/components/form/FormSelect.svelte +10 -6
  38. package/dist/components/form/FormTemplateEditor.svelte +6 -4
  39. package/dist/components/form/FormTextField.svelte +10 -6
  40. package/dist/components/form/FormTextarea.svelte +10 -6
  41. package/dist/components/form/FormToggle.svelte +0 -4
  42. package/dist/components/form/FormUISchemaRenderer.svelte +3 -1
  43. package/dist/components/icons/CommandLineIcon.svelte +15 -0
  44. package/dist/components/icons/CommandLineIcon.svelte.d.ts +26 -0
  45. package/dist/components/icons/MenuIcon.svelte +4 -0
  46. package/dist/components/icons/MenuIcon.svelte.d.ts +26 -0
  47. package/dist/components/icons/MenuOpenIcon.svelte +6 -0
  48. package/dist/components/icons/MenuOpenIcon.svelte.d.ts +26 -0
  49. package/dist/components/interrupt/ChoicePrompt.svelte +0 -10
  50. package/dist/components/interrupt/ConfirmationPrompt.svelte +0 -5
  51. package/dist/components/interrupt/InterruptBubble.svelte +11 -12
  52. package/dist/components/interrupt/ReviewPrompt.svelte +0 -20
  53. package/dist/components/interrupt/TextInputPrompt.svelte +0 -6
  54. package/dist/components/layouts/MainLayout.svelte +4 -5
  55. package/dist/components/nodes/AtomNode.svelte +46 -34
  56. package/dist/components/nodes/GatewayNode.svelte +91 -99
  57. package/dist/components/nodes/IdeaNode.svelte +62 -90
  58. package/dist/components/nodes/NodeConfigButton.svelte +86 -0
  59. package/dist/components/nodes/NodeConfigButton.svelte.d.ts +15 -0
  60. package/dist/components/nodes/NotesNode.svelte +70 -81
  61. package/dist/components/nodes/SimpleNode.svelte +28 -78
  62. package/dist/components/nodes/SquareNode.svelte +79 -109
  63. package/dist/components/nodes/TerminalNode.svelte +28 -86
  64. package/dist/components/nodes/ToolNode.svelte +82 -95
  65. package/dist/components/nodes/WorkflowNode.svelte +91 -100
  66. package/dist/components/playground/ChatInput.svelte +0 -1
  67. package/dist/components/playground/InputCollector.svelte +0 -2
  68. package/dist/components/playground/PipelineKanbanView.svelte +4 -2
  69. package/dist/components/playground/PipelineKanbanView.svelte.d.ts +2 -0
  70. package/dist/components/playground/PipelinePanel.svelte +20 -3
  71. package/dist/components/playground/PipelinePanel.svelte.d.ts +2 -0
  72. package/dist/components/playground/PipelineTableView.svelte +4 -2
  73. package/dist/components/playground/PipelineTableView.svelte.d.ts +2 -0
  74. package/dist/components/playground/Playground.svelte +76 -25
  75. package/dist/components/playground/Playground.svelte.d.ts +3 -0
  76. package/dist/components/playground/PlaygroundApp.svelte +6 -1
  77. package/dist/components/playground/PlaygroundApp.svelte.d.ts +3 -0
  78. package/dist/components/playground/PlaygroundModal.svelte +5 -0
  79. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -0
  80. package/dist/components/playground/PlaygroundStudio.svelte +7 -6
  81. package/dist/components/playground/PlaygroundStudio.svelte.d.ts +3 -0
  82. package/dist/components/playground/pipelineViewUtils.svelte.d.ts +2 -1
  83. package/dist/components/playground/pipelineViewUtils.svelte.js +2 -2
  84. package/dist/config/endpoints.d.ts +23 -0
  85. package/dist/config/endpoints.js +28 -0
  86. package/dist/core/index.d.ts +1 -2
  87. package/dist/core/index.js +2 -6
  88. package/dist/display/index.d.ts +6 -1
  89. package/dist/display/index.js +9 -1
  90. package/dist/editor/index.d.ts +1 -1
  91. package/dist/editor/index.js +1 -1
  92. package/dist/form/full.d.ts +2 -1
  93. package/dist/form/full.js +4 -1
  94. package/dist/form/index.d.ts +0 -1
  95. package/dist/form/index.js +3 -2
  96. package/dist/helpers/workflowEditorHelper.d.ts +4 -2
  97. package/dist/helpers/workflowEditorHelper.js +4 -3
  98. package/dist/playground/index.d.ts +2 -2
  99. package/dist/playground/index.js +2 -2
  100. package/dist/playground/mount.d.ts +19 -5
  101. package/dist/playground/mount.js +16 -8
  102. package/dist/registry/builtinNodeTypes.d.ts +53 -0
  103. package/dist/registry/builtinNodeTypes.js +67 -0
  104. package/dist/registry/builtinNodes.d.ts +2 -39
  105. package/dist/registry/builtinNodes.js +6 -53
  106. package/dist/services/agentSpecExecutionService.d.ts +0 -2
  107. package/dist/services/agentSpecExecutionService.js +0 -2
  108. package/dist/services/apiVariableService.js +12 -26
  109. package/dist/services/categoriesApi.js +3 -6
  110. package/dist/services/chatService.d.ts +4 -3
  111. package/dist/services/chatService.js +13 -18
  112. package/dist/services/interruptService.d.ts +7 -6
  113. package/dist/services/interruptService.js +19 -21
  114. package/dist/services/playgroundService.d.ts +9 -8
  115. package/dist/services/playgroundService.js +23 -25
  116. package/dist/services/portConfigApi.js +3 -6
  117. package/dist/services/settingsService.d.ts +9 -4
  118. package/dist/services/settingsService.js +23 -12
  119. package/dist/skins/drafter.d.ts +30 -0
  120. package/dist/skins/drafter.js +185 -0
  121. package/dist/skins/index.d.ts +2 -1
  122. package/dist/skins/index.js +4 -2
  123. package/dist/stores/apiContext.d.ts +11 -0
  124. package/dist/stores/apiContext.js +15 -0
  125. package/dist/stores/categoriesStore.svelte.js +0 -1
  126. package/dist/stores/playgroundStore.svelte.js +0 -2
  127. package/dist/styles/base.css +38 -9
  128. package/dist/styles/tokens.css +54 -2
  129. package/dist/svelte-app.d.ts +6 -0
  130. package/dist/svelte-app.js +4 -2
  131. package/dist/themes/drafter.d.ts +2 -0
  132. package/dist/themes/drafter.js +15 -0
  133. package/dist/themes/index.d.ts +2 -1
  134. package/dist/themes/index.js +8 -2
  135. package/dist/types/auth.d.ts +9 -51
  136. package/dist/types/auth.js +4 -54
  137. package/dist/types/events.d.ts +18 -0
  138. package/dist/types/events.js +2 -1
  139. package/dist/types/index.d.ts +4 -2
  140. package/dist/types/index.js +0 -1
  141. package/dist/types/settings.d.ts +1 -1
  142. package/dist/types/settings.js +1 -1
  143. package/dist/types/skin.d.ts +1 -1
  144. package/dist/types/theme.d.ts +16 -2
  145. package/dist/utils/edgeStyling.js +9 -5
  146. package/dist/utils/fetchWithAuth.d.ts +36 -15
  147. package/dist/utils/fetchWithAuth.js +53 -23
  148. package/dist/utils/nodeTypes.js +1 -1
  149. package/package.json +2 -1
@@ -141,3 +141,31 @@ export function getEndpointHeaders(config, endpointKey) {
141
141
  }
142
142
  return baseHeaders;
143
143
  }
144
+ /**
145
+ * Build request headers for an endpoint, layering the auth provider's headers
146
+ * over the static endpoint headers.
147
+ *
148
+ * This is the single header-building path shared by the per-instance services
149
+ * (playground, chat, interrupt, settings, port config, categories). Routing all
150
+ * of them through this helper guarantees a configured {@link AuthProvider}
151
+ * authenticates every request consistently — matching the behaviour of
152
+ * {@link EnhancedFlowDropApiClient}, which owns the equivalent merge for the
153
+ * typed workflow/node API.
154
+ *
155
+ * `getAuthHeaders()` is awaited per call so providers can return freshly
156
+ * refreshed tokens. When no provider is supplied the result is identical to
157
+ * {@link getEndpointHeaders} (no auth) — keeping unauthenticated callers
158
+ * working unchanged.
159
+ *
160
+ * @param config - The endpoint configuration
161
+ * @param endpointKey - Key identifying the endpoint (for static header lookup)
162
+ * @param authProvider - Optional auth provider supplying `Authorization` etc.
163
+ * @returns Merged headers: static endpoint headers < auth headers
164
+ */
165
+ export async function getRequestHeaders(config, endpointKey, authProvider) {
166
+ const headers = getEndpointHeaders(config, endpointKey);
167
+ if (authProvider) {
168
+ Object.assign(headers, await authProvider.getAuthHeaders());
169
+ }
170
+ return headers;
171
+ }
@@ -68,7 +68,7 @@ export { computeAutoLayout } from '../adapters/agentspec/autoLayout.js';
68
68
  export type { AutoLayoutConfig } from '../adapters/agentspec/autoLayout.js';
69
69
  export type { AgentSpecEndpointConfig } from '../config/agentSpecEndpoints.js';
70
70
  export { defaultAgentSpecEndpoints, createAgentSpecEndpointConfig, buildAgentSpecUrl, getAgentSpecAuthHeaders } from '../config/agentSpecEndpoints.js';
71
- export { AgentSpecExecutionService, agentSpecExecutionService } from '../services/agentSpecExecutionService.js';
71
+ export { AgentSpecExecutionService } from '../services/agentSpecExecutionService.js';
72
72
  export type { AgentSpecExecutionHandle } from '../services/agentSpecExecutionService.js';
73
73
  export { workflowSchema, WORKFLOW_SCHEMA_VERSION } from '../schemas/index.js';
74
74
  export type { FlowDropTheme, FlowDropThemeName, FlowDropThemeConfig } from '../types/theme.js';
@@ -77,7 +77,6 @@ export type { FlowDropSkin, FlowDropSkinName, FlowDropSkinTokens } from '../type
77
77
  export { slateSkin, defaultSkin } from '../skins/index.js';
78
78
  export type { ThemePreference, ResolvedTheme } from '../stores/settingsStore.svelte.js';
79
79
  export { getTheme as theme, getResolvedTheme as resolvedTheme, setTheme, toggleTheme, cycleTheme, initializeTheme, isThemeInitialized } from '../stores/settingsStore.svelte.js';
80
- export { sanitizeHtml } from '../utils/sanitize.js';
81
80
  export { logger, setLogLevel, getLogLevel } from '../utils/logger.js';
82
81
  export type { LogLevel } from '../utils/logger.js';
83
82
  export { computeSwapPreview, computeSwapPreviewWithOptions, executeSwap, mapConfig, getVersionUpgrade, compareSemver, performSwap, validateSwapResult, SwapValidationError } from '../utils/nodeSwap.js';
@@ -80,8 +80,8 @@ export { validateForAgentSpecExport, validateAgentSpecFlow } from '../adapters/a
80
80
  // Agent Spec auto-layout
81
81
  export { computeAutoLayout } from '../adapters/agentspec/autoLayout.js';
82
82
  export { defaultAgentSpecEndpoints, createAgentSpecEndpointConfig, buildAgentSpecUrl, getAgentSpecAuthHeaders } from '../config/agentSpecEndpoints.js';
83
- // Agent Spec execution service
84
- export { AgentSpecExecutionService, agentSpecExecutionService } from '../services/agentSpecExecutionService.js';
83
+ // Agent Spec execution service (instantiate per instance — no global singleton)
84
+ export { AgentSpecExecutionService } from '../services/agentSpecExecutionService.js';
85
85
  // ============================================================================
86
86
  // Workflow JSON Schema
87
87
  // ============================================================================
@@ -90,10 +90,6 @@ 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';
92
92
  // ============================================================================
93
- // HTML Sanitization
94
- // ============================================================================
95
- export { sanitizeHtml } from '../utils/sanitize.js';
96
- // ============================================================================
97
93
  // Logger
98
94
  // ============================================================================
99
95
  export { logger, setLogLevel, getLogLevel } from '../utils/logger.js';
@@ -5,9 +5,13 @@
5
5
  *
6
6
  * @module display
7
7
  *
8
+ * This entry renders user/API-provided HTML, so it pulls in the HTML sanitizer
9
+ * (DOMPurify). `sanitizeHtml` is exposed here — rather than from
10
+ * `@flowdrop/flowdrop/core` — to keep `core` free of that heavier dependency.
11
+ *
8
12
  * @example
9
13
  * ```typescript
10
- * import { MarkdownDisplay } from "@flowdrop/flowdrop/display";
14
+ * import { MarkdownDisplay, sanitizeHtml } from "@flowdrop/flowdrop/display";
11
15
  * ```
12
16
  *
13
17
  * @example In Svelte:
@@ -25,3 +29,4 @@
25
29
  * ```
26
30
  */
27
31
  export { default as MarkdownDisplay } from '../components/MarkdownDisplay.svelte';
32
+ export { sanitizeHtml } from '../utils/sanitize.js';
@@ -5,9 +5,13 @@
5
5
  *
6
6
  * @module display
7
7
  *
8
+ * This entry renders user/API-provided HTML, so it pulls in the HTML sanitizer
9
+ * (DOMPurify). `sanitizeHtml` is exposed here — rather than from
10
+ * `@flowdrop/flowdrop/core` — to keep `core` free of that heavier dependency.
11
+ *
8
12
  * @example
9
13
  * ```typescript
10
- * import { MarkdownDisplay } from "@flowdrop/flowdrop/display";
14
+ * import { MarkdownDisplay, sanitizeHtml } from "@flowdrop/flowdrop/display";
11
15
  * ```
12
16
  *
13
17
  * @example In Svelte:
@@ -28,3 +32,7 @@
28
32
  // Display Components
29
33
  // ============================================================================
30
34
  export { default as MarkdownDisplay } from '../components/MarkdownDisplay.svelte';
35
+ // ============================================================================
36
+ // HTML Sanitization (DOMPurify-backed — lives here, not in core)
37
+ // ============================================================================
38
+ export { sanitizeHtml } from '../utils/sanitize.js';
@@ -74,7 +74,7 @@ export { PortCoordinateStore } from '../stores/portCoordinateStore.svelte.js';
74
74
  export { HistoryService } from '../services/historyService.js';
75
75
  export type { HistoryEntry, HistoryState, PushOptions } from '../stores/historyStore.svelte.js';
76
76
  export { showSuccess, showError, showWarning, showInfo, showLoading, dismissToast, dismissAllToasts, showPromise, showConfirmation, apiToasts, workflowToasts, pipelineToasts } from '../services/toastService.js';
77
- export { NodeExecutionService, nodeExecutionService } from '../services/nodeExecutionService.js';
77
+ export { NodeExecutionService } from '../services/nodeExecutionService.js';
78
78
  export { saveWorkflow, updateWorkflow, getWorkflow, getWorkflows, deleteWorkflow, getWorkflowCount, initializeSampleWorkflows } from '../services/workflowStorage.js';
79
79
  export { globalSaveWorkflow, globalExportWorkflow } from '../services/globalSave.js';
80
80
  export { fetchPortConfig, validatePortConfig } from '../services/portConfigApi.js';
@@ -109,7 +109,7 @@ export { HistoryService } from '../services/historyService.js';
109
109
  // Services
110
110
  // ============================================================================
111
111
  export { showSuccess, showError, showWarning, showInfo, showLoading, dismissToast, dismissAllToasts, showPromise, showConfirmation, apiToasts, workflowToasts, pipelineToasts } from '../services/toastService.js';
112
- export { NodeExecutionService, nodeExecutionService } from '../services/nodeExecutionService.js';
112
+ export { NodeExecutionService } from '../services/nodeExecutionService.js';
113
113
  export { saveWorkflow, updateWorkflow, getWorkflow, getWorkflows, deleteWorkflow, getWorkflowCount, initializeSampleWorkflows } from '../services/workflowStorage.js';
114
114
  export { globalSaveWorkflow, globalExportWorkflow } from '../services/globalSave.js';
115
115
  export { fetchPortConfig, validatePortConfig } from '../services/portConfigApi.js';
@@ -20,7 +20,8 @@
20
20
  * // Now all field types are available
21
21
  * ```
22
22
  */
23
- export { SchemaForm, FormField, FormFieldFull, FormFieldWrapper, FormTextField, FormTextarea, FormNumberField, FormRangeField, FormToggle, FormSelect, FormCheckboxGroup, FormArray, FormFieldset, FormUISchemaRenderer } from './index.js';
23
+ export { default as FormFieldFull } from '../components/form/FormField.svelte';
24
+ export { SchemaForm, FormField, FormFieldWrapper, FormTextField, FormTextarea, FormNumberField, FormRangeField, FormToggle, FormSelect, FormCheckboxGroup, FormArray, FormFieldset, FormUISchemaRenderer } from './index.js';
24
25
  export type { FieldSchema, FieldType, FieldFormat, FieldOption, OneOfItem, SchemaFormProps, BaseFieldProps, TextFieldProps, TextareaFieldProps, NumberFieldProps, ToggleFieldProps, RangeFieldProps, SelectFieldProps, CheckboxGroupFieldProps, ArrayFieldProps, FormFieldFactoryProps, FormFieldWrapperProps, FieldComponentProps, FieldMatcher, FieldMatcherRegistration, FieldComponent, FieldComponentRegistration } from './index.js';
25
26
  export { isFieldOptionArray, isOneOfArray, normalizeOptions, oneOfToOptions, getSchemaOptions } from './index.js';
26
27
  export { FieldComponentRegistry, hiddenFieldMatcher, checkboxGroupMatcher, enumSelectMatcher, textareaMatcher, rangeMatcher, textFieldMatcher, numberFieldMatcher, toggleMatcher, selectOptionsMatcher, arrayMatcher } from './index.js';
package/dist/form/full.js CHANGED
@@ -21,8 +21,11 @@
21
21
  * ```
22
22
  */
23
23
  // Re-export everything from the light form module
24
+ // The "everything statically bundled" FormField variant lives here (this is the
25
+ // heavy entry), not in the light `@flowdrop/flowdrop/form`.
26
+ export { default as FormFieldFull } from '../components/form/FormField.svelte';
24
27
  // Components
25
- export { SchemaForm, FormField, FormFieldFull, FormFieldWrapper, FormTextField, FormTextarea, FormNumberField, FormRangeField, FormToggle, FormSelect, FormCheckboxGroup, FormArray, FormFieldset, FormUISchemaRenderer } from './index.js';
28
+ export { SchemaForm, FormField, FormFieldWrapper, FormTextField, FormTextarea, FormNumberField, FormRangeField, FormToggle, FormSelect, FormCheckboxGroup, FormArray, FormFieldset, FormUISchemaRenderer } from './index.js';
26
29
  // Utility functions
27
30
  export { isFieldOptionArray, isOneOfArray, normalizeOptions, oneOfToOptions, getSchemaOptions } from './index.js';
28
31
  // Field Registry
@@ -59,7 +59,6 @@
59
59
  */
60
60
  export { default as SchemaForm } from '../components/SchemaForm.svelte';
61
61
  export { default as FormField } from '../components/form/FormFieldLight.svelte';
62
- export { default as FormFieldFull } from '../components/form/FormField.svelte';
63
62
  export { default as FormFieldWrapper } from '../components/form/FormFieldWrapper.svelte';
64
63
  export { default as FormTextField } from '../components/form/FormTextField.svelte';
65
64
  export { default as FormTextarea } from '../components/form/FormTextarea.svelte';
@@ -66,8 +66,9 @@ export { default as SchemaForm } from '../components/SchemaForm.svelte';
66
66
  // ============================================================================
67
67
  // Use the light version of FormField that uses the registry for heavy editors
68
68
  export { default as FormField } from '../components/form/FormFieldLight.svelte';
69
- // Also export the original (full) version for users who want everything
70
- export { default as FormFieldFull } from '../components/form/FormField.svelte';
69
+ // NOTE: `FormFieldFull` the variant that *statically* bundles every editor
70
+ // (including CodeMirror) is intentionally NOT exported here; it would pull
71
+ // CodeMirror into this light entry. Import it from `@flowdrop/flowdrop/form/full`.
71
72
  export { default as FormFieldWrapper } from '../components/form/FormFieldWrapper.svelte';
72
73
  export { default as FormTextField } from '../components/form/FormTextField.svelte';
73
74
  export { default as FormTextarea } from '../components/form/FormTextarea.svelte';
@@ -5,6 +5,7 @@
5
5
  import type { WorkflowNode as WorkflowNodeType, NodeMetadata, Workflow, WorkflowEdge, NodeExecutionInfo } from '../types/index.js';
6
6
  import { type FlowDropInstance } from '../stores/instanceContainer.svelte.js';
7
7
  import type { ApiContext } from '../stores/apiContext.js';
8
+ import type { AuthProvider } from '../types/auth.js';
8
9
  import type { EndpointConfig } from '../config/endpoints.js';
9
10
  export { generateNodeId, extractConfigDefaults } from '../utils/nodeIds.js';
10
11
  /**
@@ -134,7 +135,8 @@ export declare class WorkflowOperationsHelper {
134
135
  */
135
136
  export declare class ConfigurationHelper {
136
137
  /**
137
- * Configure API endpoints on the given instance's API context.
138
+ * Configure API endpoints (and optionally the auth provider) on the given
139
+ * instance's API context.
138
140
  */
139
- static configureEndpoints(api: ApiContext, config: EndpointConfig): void;
141
+ static configureEndpoints(api: ApiContext, config: EndpointConfig, authProvider?: AuthProvider): void;
140
142
  }
@@ -382,9 +382,10 @@ export class WorkflowOperationsHelper {
382
382
  */
383
383
  export class ConfigurationHelper {
384
384
  /**
385
- * Configure API endpoints on the given instance's API context.
385
+ * Configure API endpoints (and optionally the auth provider) on the given
386
+ * instance's API context.
386
387
  */
387
- static configureEndpoints(api, config) {
388
- api.configure(config);
388
+ static configureEndpoints(api, config, authProvider) {
389
+ api.configure(config, authProvider);
389
390
  }
390
391
  }
@@ -126,8 +126,8 @@ export { default as InputCollector } from '../components/playground/InputCollect
126
126
  export { default as ExecutionLogs } from '../components/playground/ExecutionLogs.svelte';
127
127
  export { default as MessageBubble } from '../components/playground/MessageBubble.svelte';
128
128
  export { InterruptBubble, ConfirmationPrompt, ChoicePrompt, TextInputPrompt, FormPrompt, ReviewPrompt } from '../components/interrupt/index.js';
129
- export { PlaygroundService, playgroundService } from '../services/playgroundService.js';
130
- export { InterruptService, interruptService } from '../services/interruptService.js';
129
+ export { PlaygroundService } from '../services/playgroundService.js';
130
+ export { InterruptService } from '../services/interruptService.js';
131
131
  export { PlaygroundStore } from '../stores/playgroundStore.svelte.js';
132
132
  export type { PlaygroundSession, PlaygroundMessage, PlaygroundInputField, PlaygroundMessageRequest, PlaygroundMessagesResult, PlaygroundConfig, PlaygroundMode, PlaygroundSessionStatus, PlaygroundMessageRole, PlaygroundMessageLevel, PlaygroundMessageMetadata, PlaygroundApiResponse, PlaygroundSessionsResponse, PlaygroundSessionResponse, PlaygroundMessageResponse, PlaygroundMessagesApiResponse, PlaygroundExecution } from '../types/playground.js';
133
133
  export { isChatInputNode, CHAT_INPUT_PATTERNS, defaultShouldStopPolling, defaultIsTerminalStatus, DEFAULT_STOP_POLLING_STATUSES, DEFAULT_TERMINAL_STATUSES } from '../types/playground.js';
@@ -135,11 +135,11 @@ export { InterruptBubble, ConfirmationPrompt, ChoicePrompt, TextInputPrompt, For
135
135
  // ============================================================================
136
136
  // Playground Service
137
137
  // ============================================================================
138
- export { PlaygroundService, playgroundService } from '../services/playgroundService.js';
138
+ export { PlaygroundService } from '../services/playgroundService.js';
139
139
  // ============================================================================
140
140
  // Interrupt Service (Human-in-the-Loop)
141
141
  // ============================================================================
142
- export { InterruptService, interruptService } from '../services/interruptService.js';
142
+ export { InterruptService } from '../services/interruptService.js';
143
143
  // ============================================================================
144
144
  // Playground Store
145
145
  // ============================================================================
@@ -45,6 +45,7 @@
45
45
  */
46
46
  import type { Workflow } from '../types/index.js';
47
47
  import type { EndpointConfig } from '../config/endpoints.js';
48
+ import type { AuthProvider } from '../types/auth.js';
48
49
  import type { PlaygroundMode, PlaygroundConfig, PlaygroundSession, PlaygroundMessagesApiResponse, PlaygroundSessionStatus } from '../types/playground.js';
49
50
  import type { PartialSettings, SettingsCategory } from '../types/settings.js';
50
51
  import type { NavbarAction } from '../types/navbar.js';
@@ -81,6 +82,15 @@ export interface PlaygroundMountOptions {
81
82
  * Use createEndpointConfig() to create this
82
83
  */
83
84
  endpointConfig?: EndpointConfig;
85
+ /**
86
+ * Authentication provider for API requests.
87
+ *
88
+ * Applied to this instance via `fd.api.configure()` so every request the
89
+ * playground makes (sessions, messages, polling, interrupts) carries the
90
+ * provider's headers — e.g. an `Authorization` bearer token or an
91
+ * `X-CSRF-Token`. Omit for unauthenticated backends.
92
+ */
93
+ authProvider?: AuthProvider;
84
94
  /**
85
95
  * Playground-specific configuration options
86
96
  */
@@ -242,7 +252,7 @@ export interface PlaygroundAppMountOptions extends Omit<PlaygroundStudioMountOpt
242
252
  * @default "standalone"
243
253
  */
244
254
  mode?: 'standalone' | 'embedded';
245
- /** Render the FlowDrop Navbar above the playground (default: true). */
255
+ /** Render the FlowDrop Navbar above the playground (default: false). */
246
256
  showNavbar?: boolean;
247
257
  /** Title shown in the navbar. Falls back to the workflow name, then "Playground". */
248
258
  navbarTitle?: string;
@@ -258,17 +268,21 @@ export interface PlaygroundAppMountOptions extends Omit<PlaygroundStudioMountOpt
258
268
  showSettingsResetButton?: boolean;
259
269
  }
260
270
  /**
261
- * Mount the full-page PlaygroundApp (Navbar + PlaygroundStudio) into a container.
271
+ * Mount the full-page PlaygroundApp (PlaygroundStudio, optionally wrapped in the
272
+ * FlowDrop Navbar) into a container.
262
273
  *
263
- * Use this when you want the same chrome as the FlowDrop editor logo,
264
- * branding, and settings modal wrapped around the playground. For an
265
- * embeddable split-pane without the navbar, use mountPlaygroundStudio().
274
+ * The navbar is opt-in (`showNavbar: true`) matching the editor mount, so
275
+ * embedding into a page that already has its own header never double-stacks a
276
+ * header. Pass `showNavbar: true` when FlowDrop owns the whole page and you want
277
+ * its chrome (logo, branding, settings modal). For a leaner embeddable
278
+ * split-pane, mountPlaygroundStudio() omits the navbar wrapper entirely.
266
279
  *
267
280
  * @example
268
281
  * ```typescript
269
282
  * const app = await mountPlaygroundApp(container, {
270
283
  * workflowId: 'wf-123',
271
284
  * endpointConfig: createEndpointConfig('/api/flowdrop'),
285
+ * showNavbar: true,
272
286
  * navbarTitle: 'My Workflow',
273
287
  * primaryActions: [
274
288
  * { label: 'Edit', href: '/workflows/wf-123/edit', icon: 'mdi:pencil-outline', variant: 'secondary' },
@@ -125,7 +125,7 @@ function buildMountedPlayground(svelteApp, workflowId, config, fd, ownsInstance,
125
125
  startPolling: () => {
126
126
  const session = fd.playground.currentSession;
127
127
  if (session) {
128
- playgroundService.startPolling(fd.api.config, session.id, (response) => fd.playground.applyServerResponse(response, session.id), pollingInterval, config.shouldStopPolling, playgroundService.getLastSequenceNumber());
128
+ playgroundService.startPolling(fd.api.config, session.id, (response) => fd.playground.applyServerResponse(response, session.id), pollingInterval, config.shouldStopPolling, playgroundService.getLastSequenceNumber(), fd.api.authProvider);
129
129
  }
130
130
  },
131
131
  pushMessages: (response) => fd.playground.applyServerResponse(response, null),
@@ -165,7 +165,7 @@ function buildMountedPlayground(svelteApp, workflowId, config, fd, ownsInstance,
165
165
  * ```
166
166
  */
167
167
  export async function mountPlayground(container, options) {
168
- const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, config = {}, height, width, settings: initialSettings, onClose, onSessionStatusChange, instanceId } = options;
168
+ const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, authProvider, config = {}, height, width, settings: initialSettings, onClose, onSessionStatusChange, instanceId } = options;
169
169
  // Validate required parameters
170
170
  if (!workflowId) {
171
171
  throw new Error('workflowId is required for mountPlayground()');
@@ -200,6 +200,7 @@ export async function mountPlayground(container, options) {
200
200
  workflow,
201
201
  initialSessionId,
202
202
  endpointConfig: finalEndpointConfig,
203
+ authProvider,
203
204
  config,
204
205
  onClose: () => {
205
206
  if (onClose) {
@@ -219,6 +220,7 @@ export async function mountPlayground(container, options) {
219
220
  mode,
220
221
  initialSessionId,
221
222
  endpointConfig: finalEndpointConfig,
223
+ authProvider,
222
224
  config,
223
225
  onClose
224
226
  }
@@ -247,7 +249,7 @@ export function unmountPlayground(app) {
247
249
  }
248
250
  }
249
251
  export async function mountPlaygroundStudio(container, options) {
250
- const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, config = {}, height, width, initialPipelineOpen, minChatWidth, initialPipelineWidth, settings: initialSettings, onClose, onSessionNavigate, onSessionStatusChange, pipelineViews, instanceId } = options;
252
+ const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, authProvider, config = {}, height, width, initialPipelineOpen, minChatWidth, initialPipelineWidth, settings: initialSettings, onClose, onSessionNavigate, onSessionStatusChange, pipelineViews, instanceId } = options;
251
253
  if (!workflowId) {
252
254
  throw new Error('workflowId is required for mountPlaygroundStudio()');
253
255
  }
@@ -272,6 +274,7 @@ export async function mountPlaygroundStudio(container, options) {
272
274
  mode,
273
275
  initialSessionId,
274
276
  endpointConfig: finalEndpointConfig,
277
+ authProvider,
275
278
  config,
276
279
  onClose,
277
280
  onSessionNavigate,
@@ -284,17 +287,21 @@ export async function mountPlaygroundStudio(container, options) {
284
287
  return buildMountedPlayground(svelteApp, workflowId, config, fd, ownsInstance, onSessionStatusChange);
285
288
  }
286
289
  /**
287
- * Mount the full-page PlaygroundApp (Navbar + PlaygroundStudio) into a container.
290
+ * Mount the full-page PlaygroundApp (PlaygroundStudio, optionally wrapped in the
291
+ * FlowDrop Navbar) into a container.
288
292
  *
289
- * Use this when you want the same chrome as the FlowDrop editor logo,
290
- * branding, and settings modal wrapped around the playground. For an
291
- * embeddable split-pane without the navbar, use mountPlaygroundStudio().
293
+ * The navbar is opt-in (`showNavbar: true`) matching the editor mount, so
294
+ * embedding into a page that already has its own header never double-stacks a
295
+ * header. Pass `showNavbar: true` when FlowDrop owns the whole page and you want
296
+ * its chrome (logo, branding, settings modal). For a leaner embeddable
297
+ * split-pane, mountPlaygroundStudio() omits the navbar wrapper entirely.
292
298
  *
293
299
  * @example
294
300
  * ```typescript
295
301
  * const app = await mountPlaygroundApp(container, {
296
302
  * workflowId: 'wf-123',
297
303
  * endpointConfig: createEndpointConfig('/api/flowdrop'),
304
+ * showNavbar: true,
298
305
  * navbarTitle: 'My Workflow',
299
306
  * primaryActions: [
300
307
  * { label: 'Edit', href: '/workflows/wf-123/edit', icon: 'mdi:pencil-outline', variant: 'secondary' },
@@ -304,7 +311,7 @@ export async function mountPlaygroundStudio(container, options) {
304
311
  * ```
305
312
  */
306
313
  export async function mountPlaygroundApp(container, options) {
307
- const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, config = {}, height, width, showNavbar = true, navbarTitle, primaryActions, showSettings = true, settingsCategories, showSettingsSyncButton, showSettingsResetButton, initialPipelineOpen, minChatWidth, initialPipelineWidth, settings: initialSettings, onClose, onSessionNavigate, onSessionStatusChange, instanceId } = options;
314
+ const { workflowId, workflow, mode = 'standalone', initialSessionId, endpointConfig, authProvider, config = {}, height, width, showNavbar = false, navbarTitle, primaryActions, showSettings = true, settingsCategories, showSettingsSyncButton, showSettingsResetButton, initialPipelineOpen, minChatWidth, initialPipelineWidth, settings: initialSettings, onClose, onSessionNavigate, onSessionStatusChange, instanceId } = options;
308
315
  if (!workflowId) {
309
316
  throw new Error('workflowId is required for mountPlaygroundApp()');
310
317
  }
@@ -332,6 +339,7 @@ export async function mountPlaygroundApp(container, options) {
332
339
  mode,
333
340
  initialSessionId,
334
341
  endpointConfig: finalEndpointConfig,
342
+ authProvider,
335
343
  config,
336
344
  showNavbar,
337
345
  navbarTitle,
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Built-in Node Type Metadata (pure — no component imports)
3
+ *
4
+ * The type identifiers, aliases, and resolution helpers for FlowDrop's built-in
5
+ * node types, with ZERO dependency on the Svelte node components. Utilities that
6
+ * only need to reason about type strings (e.g. `utils/nodeTypes.ts`, reachable
7
+ * from `@flowdrop/flowdrop/core`) import from here, so the lightweight `core`
8
+ * entry never statically pulls in node components, marked, or DOMPurify.
9
+ *
10
+ * The component registrations themselves live in `./builtinNodes.ts`, which
11
+ * re-exports everything here for backward compatibility.
12
+ *
13
+ * @module registry/builtinNodeTypes
14
+ */
15
+ /**
16
+ * Source identifier for built-in FlowDrop components.
17
+ */
18
+ export declare const FLOWDROP_SOURCE = "flowdrop";
19
+ /**
20
+ * Type for built-in node types.
21
+ * Use this when you specifically need a built-in type.
22
+ */
23
+ export type BuiltinNodeType = 'workflowNode' | 'simple' | 'square' | 'atom' | 'tool' | 'gateway' | 'note' | 'terminal' | 'idea';
24
+ /**
25
+ * Array of built-in type strings for runtime validation.
26
+ */
27
+ export declare const BUILTIN_NODE_TYPES: BuiltinNodeType[];
28
+ /**
29
+ * Alias mapping for type resolution.
30
+ * Maps alternative type names to their canonical registration.
31
+ */
32
+ export declare const BUILTIN_TYPE_ALIASES: Record<string, string>;
33
+ /**
34
+ * Get the canonical type for a given type string.
35
+ * Handles aliases like "default" -> "workflowNode".
36
+ *
37
+ * @param type - The type string to resolve
38
+ * @returns The canonical type string
39
+ */
40
+ export declare function resolveBuiltinAlias(type: string): string;
41
+ /**
42
+ * Check if a type is a built-in FlowDrop type.
43
+ *
44
+ * @param type - The type to check
45
+ * @returns true if this is a built-in type
46
+ */
47
+ export declare function isBuiltinType(type: string): boolean;
48
+ /**
49
+ * Get all built-in type identifiers.
50
+ *
51
+ * @returns Array of built-in type strings
52
+ */
53
+ export declare function getBuiltinTypes(): string[];
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Built-in Node Type Metadata (pure — no component imports)
3
+ *
4
+ * The type identifiers, aliases, and resolution helpers for FlowDrop's built-in
5
+ * node types, with ZERO dependency on the Svelte node components. Utilities that
6
+ * only need to reason about type strings (e.g. `utils/nodeTypes.ts`, reachable
7
+ * from `@flowdrop/flowdrop/core`) import from here, so the lightweight `core`
8
+ * entry never statically pulls in node components, marked, or DOMPurify.
9
+ *
10
+ * The component registrations themselves live in `./builtinNodes.ts`, which
11
+ * re-exports everything here for backward compatibility.
12
+ *
13
+ * @module registry/builtinNodeTypes
14
+ */
15
+ /**
16
+ * Source identifier for built-in FlowDrop components.
17
+ */
18
+ export const FLOWDROP_SOURCE = 'flowdrop';
19
+ /**
20
+ * Array of built-in type strings for runtime validation.
21
+ */
22
+ export const BUILTIN_NODE_TYPES = [
23
+ 'workflowNode',
24
+ 'simple',
25
+ 'square',
26
+ 'atom',
27
+ 'tool',
28
+ 'gateway',
29
+ 'note',
30
+ 'terminal',
31
+ 'idea'
32
+ ];
33
+ /**
34
+ * Alias mapping for type resolution.
35
+ * Maps alternative type names to their canonical registration.
36
+ */
37
+ export const BUILTIN_TYPE_ALIASES = {
38
+ default: 'workflowNode'
39
+ };
40
+ /**
41
+ * Get the canonical type for a given type string.
42
+ * Handles aliases like "default" -> "workflowNode".
43
+ *
44
+ * @param type - The type string to resolve
45
+ * @returns The canonical type string
46
+ */
47
+ export function resolveBuiltinAlias(type) {
48
+ return BUILTIN_TYPE_ALIASES[type] ?? type;
49
+ }
50
+ /**
51
+ * Check if a type is a built-in FlowDrop type.
52
+ *
53
+ * @param type - The type to check
54
+ * @returns true if this is a built-in type
55
+ */
56
+ export function isBuiltinType(type) {
57
+ const canonicalType = resolveBuiltinAlias(type);
58
+ return BUILTIN_NODE_TYPES.includes(canonicalType);
59
+ }
60
+ /**
61
+ * Get all built-in type identifiers.
62
+ *
63
+ * @returns Array of built-in type strings
64
+ */
65
+ export function getBuiltinTypes() {
66
+ return [...BUILTIN_NODE_TYPES];
67
+ }
@@ -6,47 +6,10 @@
6
6
  * ensuring all built-in node types are available without user action.
7
7
  */
8
8
  import { type NodeComponentRegistration } from './nodeComponentRegistry.js';
9
- /**
10
- * Source identifier for built-in FlowDrop components
11
- */
12
- export declare const FLOWDROP_SOURCE = "flowdrop";
9
+ export { FLOWDROP_SOURCE, BUILTIN_TYPE_ALIASES, BUILTIN_NODE_TYPES, resolveBuiltinAlias, isBuiltinType, getBuiltinTypes } from './builtinNodeTypes.js';
10
+ export type { BuiltinNodeType } from './builtinNodeTypes.js';
13
11
  /**
14
12
  * Built-in FlowDrop node component registrations.
15
13
  * These are the default node types that ship with FlowDrop.
16
14
  */
17
15
  export declare const BUILTIN_NODE_COMPONENTS: NodeComponentRegistration[];
18
- /**
19
- * Alias mapping for type resolution.
20
- * Maps alternative type names to their canonical registration.
21
- */
22
- export declare const BUILTIN_TYPE_ALIASES: Record<string, string>;
23
- /**
24
- * Get the canonical type for a given type string.
25
- * Handles aliases like "default" -> "workflowNode".
26
- *
27
- * @param type - The type string to resolve
28
- * @returns The canonical type string
29
- */
30
- export declare function resolveBuiltinAlias(type: string): string;
31
- /**
32
- * Check if a type is a built-in FlowDrop type.
33
- *
34
- * @param type - The type to check
35
- * @returns true if this is a built-in type
36
- */
37
- export declare function isBuiltinType(type: string): boolean;
38
- /**
39
- * Get all built-in type identifiers.
40
- *
41
- * @returns Array of built-in type strings
42
- */
43
- export declare function getBuiltinTypes(): string[];
44
- /**
45
- * Type for built-in node types.
46
- * Use this when you specifically need a built-in type.
47
- */
48
- export type BuiltinNodeType = 'workflowNode' | 'simple' | 'square' | 'atom' | 'tool' | 'gateway' | 'note' | 'terminal' | 'idea';
49
- /**
50
- * Array of built-in type strings for runtime validation.
51
- */
52
- export declare const BUILTIN_NODE_TYPES: BuiltinNodeType[];