@d34dman/flowdrop 0.0.61 → 0.0.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/adapters/WorkflowAdapter.d.ts +1 -1
- package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -1
- package/dist/api/client.d.ts +4 -0
- package/dist/api/client.js +6 -1
- package/dist/api/enhanced-client.js +7 -6
- package/dist/components/App.svelte +143 -219
- package/dist/components/CanvasBanner.stories.svelte +25 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +2 -2
- package/dist/components/ConfigForm.svelte +37 -36
- package/dist/components/ConfigPanel.stories.svelte +38 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +2 -2
- package/dist/components/ConnectionLine.svelte +2 -2
- package/dist/components/FlowDropZone.svelte +18 -2
- package/dist/components/FlowDropZone.svelte.d.ts +2 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +33 -13
- package/dist/components/Logo.svelte.d.ts +1 -1
- package/dist/components/MarkdownDisplay.stories.svelte +21 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +4 -3
- package/dist/components/Navbar.stories.svelte +41 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +4 -4
- package/dist/components/NodeSidebar.svelte +12 -12
- package/dist/components/NodeStatusOverlay.stories.svelte +74 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/PipelineStatus.svelte +11 -4
- package/dist/components/PortCoordinateTracker.svelte +1 -1
- package/dist/components/SchemaForm.stories.svelte +101 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +17 -12
- package/dist/components/SettingsModal.svelte +3 -3
- package/dist/components/SettingsPanel.svelte +23 -22
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +7 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +8 -8
- package/dist/components/UniversalNode.svelte +1 -1
- package/dist/components/WorkflowEditor.svelte +298 -294
- package/dist/components/form/FormAutocomplete.svelte +20 -19
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormField.svelte +3 -3
- package/dist/components/form/FormFieldLight.svelte +2 -2
- package/dist/components/form/FormFieldWrapper.stories.svelte +31 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldset.svelte +7 -7
- package/dist/components/form/FormNumberField.stories.svelte +33 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormRangeField.stories.svelte +31 -0
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTemplateEditor.svelte +2 -1
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.stories.svelte +31 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormToggle.stories.svelte +30 -0
- package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormUISchemaRenderer.svelte +1 -1
- package/dist/components/form/types.d.ts +15 -47
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +43 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +24 -24
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +49 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +19 -19
- package/dist/components/interrupt/FormPrompt.svelte +15 -15
- package/dist/components/interrupt/InterruptBubble.svelte +202 -236
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +1 -1
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +46 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +842 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +34 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +21 -21
- package/dist/components/nodes/GatewayNode.stories.svelte +76 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +19 -17
- package/dist/components/nodes/IdeaNode.stories.svelte +48 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +10 -26
- package/dist/components/nodes/NotesNode.stories.svelte +69 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +8 -8
- package/dist/components/nodes/SimpleNode.stories.svelte +101 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +16 -24
- package/dist/components/nodes/SquareNode.stories.svelte +56 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +13 -21
- package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/TerminalNode.svelte +6 -6
- package/dist/components/nodes/ToolNode.stories.svelte +71 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +7 -15
- package/dist/components/nodes/WorkflowNode.stories.svelte +50 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +13 -13
- package/dist/components/playground/ChatPanel.svelte +48 -48
- package/dist/components/playground/ExecutionLogs.svelte +23 -23
- package/dist/components/playground/InputCollector.svelte +24 -24
- package/dist/components/playground/MessageBubble.stories.svelte +49 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +49 -46
- package/dist/components/playground/Playground.svelte +194 -129
- package/dist/components/playground/PlaygroundModal.svelte +5 -5
- package/dist/components/playground/SessionManager.svelte +26 -26
- package/dist/config/constants.d.ts +22 -0
- package/dist/config/constants.js +22 -0
- package/dist/config/endpoints.d.ts +19 -0
- package/dist/config/runtimeConfig.js +2 -1
- package/dist/core/index.d.ts +5 -2
- package/dist/core/index.js +9 -1
- package/dist/editor/index.d.ts +13 -9
- package/dist/editor/index.js +15 -11
- package/dist/form/code.d.ts +2 -1
- package/dist/form/code.js +1 -3
- package/dist/form/markdown.d.ts +2 -1
- package/dist/form/markdown.js +1 -3
- package/dist/helpers/workflowEditorHelper.js +13 -9
- package/dist/mocks/app-forms.js +1 -0
- package/dist/mocks/app-navigation.js +3 -1
- package/dist/mocks/app-stores.d.ts +4 -4
- package/dist/playground/index.d.ts +4 -3
- package/dist/playground/index.js +12 -10
- package/dist/playground/mount.js +6 -13
- package/dist/services/agentSpecExecutionService.js +2 -1
- package/dist/services/api.js +10 -18
- package/dist/services/apiVariableService.js +2 -1
- package/dist/services/autoSaveService.d.ts +3 -3
- package/dist/services/autoSaveService.js +21 -17
- package/dist/services/categoriesApi.js +13 -5
- package/dist/services/draftStorage.js +5 -4
- package/dist/services/dynamicSchemaService.js +4 -4
- package/dist/services/globalSave.d.ts +60 -11
- package/dist/services/globalSave.js +160 -83
- package/dist/services/historyService.d.ts +2 -1
- package/dist/services/historyService.js +7 -3
- package/dist/services/interruptService.js +9 -8
- package/dist/services/nodeExecutionService.js +14 -6
- package/dist/services/playgroundService.js +2 -1
- package/dist/services/portConfigApi.js +11 -7
- package/dist/services/toastService.d.ts +1 -1
- package/dist/services/toastService.js +6 -5
- package/dist/services/variableService.js +3 -2
- package/dist/settings/index.d.ts +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/stores/{categoriesStore.d.ts → categoriesStore.svelte.d.ts} +3 -3
- package/dist/stores/{categoriesStore.js → categoriesStore.svelte.js} +15 -18
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/{historyStore.d.ts → historyStore.svelte.d.ts} +18 -15
- package/dist/stores/{historyStore.js → historyStore.svelte.js} +40 -21
- package/dist/stores/{interruptStore.d.ts → interruptStore.svelte.d.ts} +16 -15
- package/dist/stores/{interruptStore.js → interruptStore.svelte.js} +85 -94
- package/dist/stores/{playgroundStore.d.ts → playgroundStore.svelte.d.ts} +41 -33
- package/dist/stores/{playgroundStore.js → playgroundStore.svelte.js} +164 -84
- package/dist/stores/{portCoordinateStore.d.ts → portCoordinateStore.svelte.d.ts} +10 -4
- package/dist/stores/{portCoordinateStore.js → portCoordinateStore.svelte.js} +38 -35
- package/dist/stores/{settingsStore.d.ts → settingsStore.svelte.d.ts} +45 -28
- package/dist/stores/{settingsStore.js → settingsStore.svelte.js} +169 -128
- package/dist/stores/{workflowStore.d.ts → workflowStore.svelte.d.ts} +101 -65
- package/dist/stores/{workflowStore.js → workflowStore.svelte.js} +285 -239
- package/dist/stories/CanvasDecorator.svelte +50 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +74 -0
- package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
- package/dist/stories/utils.d.ts +93 -0
- package/dist/stories/utils.js +122 -0
- package/dist/styles/base.css +114 -61
- package/dist/styles/toast.css +2 -2
- package/dist/styles/tokens.css +250 -185
- package/dist/svelte-app.d.ts +0 -6
- package/dist/svelte-app.js +13 -31
- package/dist/types/index.d.ts +2 -0
- package/dist/types/interrupt.d.ts +89 -5
- package/dist/types/interrupt.js +13 -1
- package/dist/types/playground.d.ts +5 -0
- package/dist/types/settings.js +1 -1
- package/dist/utils/colors.js +4 -4
- package/dist/utils/connections.js +33 -8
- package/dist/utils/icons.js +1 -1
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeWrapper.js +1 -1
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +243 -232
|
@@ -13,13 +13,16 @@
|
|
|
13
13
|
import ChoicePrompt from './ChoicePrompt.svelte';
|
|
14
14
|
import TextInputPrompt from './TextInputPrompt.svelte';
|
|
15
15
|
import FormPrompt from './FormPrompt.svelte';
|
|
16
|
+
import ReviewPrompt from './ReviewPrompt.svelte';
|
|
16
17
|
import type {
|
|
17
18
|
Interrupt,
|
|
18
19
|
InterruptType,
|
|
19
20
|
ConfirmationConfig,
|
|
20
21
|
ChoiceConfig,
|
|
21
22
|
TextConfig,
|
|
22
|
-
FormConfig
|
|
23
|
+
FormConfig,
|
|
24
|
+
ReviewConfig,
|
|
25
|
+
ReviewResolution
|
|
23
26
|
} from '../../types/interrupt.js';
|
|
24
27
|
import {
|
|
25
28
|
isTerminalState,
|
|
@@ -28,11 +31,12 @@
|
|
|
28
31
|
getResolvedValue
|
|
29
32
|
} from '../../types/interruptState.js';
|
|
30
33
|
import {
|
|
31
|
-
|
|
34
|
+
getInterruptsMap,
|
|
32
35
|
interruptActions,
|
|
33
36
|
type InterruptWithState
|
|
34
|
-
} from '../../stores/interruptStore.js';
|
|
37
|
+
} from '../../stores/interruptStore.svelte.js';
|
|
35
38
|
import { interruptService } from '../../services/interruptService.js';
|
|
39
|
+
import { logger } from '../../utils/logger.js';
|
|
36
40
|
|
|
37
41
|
/**
|
|
38
42
|
* Component props
|
|
@@ -53,7 +57,7 @@
|
|
|
53
57
|
* This ensures we react to store updates (like status changes).
|
|
54
58
|
*/
|
|
55
59
|
const currentInterrupt = $derived(
|
|
56
|
-
|
|
60
|
+
getInterruptsMap().get(initialInterrupt.id) ?? addMachineState(initialInterrupt)
|
|
57
61
|
);
|
|
58
62
|
|
|
59
63
|
/**
|
|
@@ -94,6 +98,8 @@
|
|
|
94
98
|
return 'mdi:text-box';
|
|
95
99
|
case 'form':
|
|
96
100
|
return 'mdi:form-select';
|
|
101
|
+
case 'review':
|
|
102
|
+
return 'mdi:file-compare';
|
|
97
103
|
default:
|
|
98
104
|
return 'mdi:bell';
|
|
99
105
|
}
|
|
@@ -112,6 +118,8 @@
|
|
|
112
118
|
return 'Input Required';
|
|
113
119
|
case 'form':
|
|
114
120
|
return 'Form Required';
|
|
121
|
+
case 'review':
|
|
122
|
+
return 'Review Required';
|
|
115
123
|
default:
|
|
116
124
|
return 'Action Required';
|
|
117
125
|
}
|
|
@@ -128,6 +136,8 @@
|
|
|
128
136
|
return 'Input Submitted';
|
|
129
137
|
case 'form':
|
|
130
138
|
return 'Form Submitted';
|
|
139
|
+
case 'review':
|
|
140
|
+
return 'Review Submitted';
|
|
131
141
|
default:
|
|
132
142
|
return 'Response Submitted';
|
|
133
143
|
}
|
|
@@ -153,7 +163,7 @@
|
|
|
153
163
|
// Start the submission - state machine validates this transition
|
|
154
164
|
const startResult = interruptActions.startSubmit(currentInterrupt.id, value);
|
|
155
165
|
if (!startResult.valid) {
|
|
156
|
-
|
|
166
|
+
logger.warn('[InterruptBubble] Cannot submit:', startResult.error);
|
|
157
167
|
return;
|
|
158
168
|
}
|
|
159
169
|
|
|
@@ -172,7 +182,7 @@
|
|
|
172
182
|
// Mark as failed - transitions to error state (can retry)
|
|
173
183
|
const errorMessage = err instanceof Error ? err.message : 'Failed to submit response';
|
|
174
184
|
interruptActions.submitFailure(currentInterrupt.id, errorMessage);
|
|
175
|
-
|
|
185
|
+
logger.error('[InterruptBubble] Resolve error:', err);
|
|
176
186
|
}
|
|
177
187
|
}
|
|
178
188
|
|
|
@@ -183,7 +193,7 @@
|
|
|
183
193
|
// Start the cancel - state machine validates this transition
|
|
184
194
|
const startResult = interruptActions.startCancel(currentInterrupt.id);
|
|
185
195
|
if (!startResult.valid) {
|
|
186
|
-
|
|
196
|
+
logger.warn('[InterruptBubble] Cannot cancel:', startResult.error);
|
|
187
197
|
return;
|
|
188
198
|
}
|
|
189
199
|
|
|
@@ -202,7 +212,7 @@
|
|
|
202
212
|
// Mark as failed - transitions to error state (can retry)
|
|
203
213
|
const errorMessage = err instanceof Error ? err.message : 'Failed to cancel';
|
|
204
214
|
interruptActions.submitFailure(currentInterrupt.id, errorMessage);
|
|
205
|
-
|
|
215
|
+
logger.error('[InterruptBubble] Cancel error:', err);
|
|
206
216
|
}
|
|
207
217
|
}
|
|
208
218
|
|
|
@@ -218,6 +228,7 @@
|
|
|
218
228
|
const choiceConfig = $derived(currentInterrupt.config as ChoiceConfig);
|
|
219
229
|
const textConfig = $derived(currentInterrupt.config as TextConfig);
|
|
220
230
|
const formConfig = $derived(currentInterrupt.config as FormConfig);
|
|
231
|
+
const reviewConfig = $derived(currentInterrupt.config as ReviewConfig);
|
|
221
232
|
|
|
222
233
|
// Determine the actual resolved value to pass to prompt components
|
|
223
234
|
const displayResolvedValue = $derived(resolvedValue ?? currentInterrupt.responseValue);
|
|
@@ -240,103 +251,105 @@
|
|
|
240
251
|
class:interrupt-bubble--submitting={isSubmitting}
|
|
241
252
|
class:interrupt-bubble--error={currentInterrupt.machineState.status === 'error'}
|
|
242
253
|
>
|
|
243
|
-
<!--
|
|
244
|
-
<div class="interrupt-
|
|
245
|
-
|
|
246
|
-
<Icon icon=
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
254
|
+
<!-- Header -->
|
|
255
|
+
<div class="interrupt-bubble__header">
|
|
256
|
+
<span class="interrupt-bubble__type">
|
|
257
|
+
<Icon icon={getTypeIcon(currentInterrupt.type)} />
|
|
258
|
+
{#if isResolved}
|
|
259
|
+
{currentInterrupt.machineState.status === 'cancelled'
|
|
260
|
+
? 'Cancelled'
|
|
261
|
+
: getResolvedLabel(currentInterrupt.type)}
|
|
262
|
+
{:else if currentInterrupt.machineState.status === 'error'}
|
|
263
|
+
Error - Click to Retry
|
|
264
|
+
{:else}
|
|
265
|
+
{getTypeLabel(currentInterrupt.type)}
|
|
266
|
+
{/if}
|
|
267
|
+
</span>
|
|
268
|
+
{#if showTimestamp}
|
|
269
|
+
<span class="interrupt-bubble__timestamp">
|
|
270
|
+
{formatTimestamp(currentInterrupt.resolvedAt ?? currentInterrupt.createdAt)}
|
|
271
|
+
</span>
|
|
253
272
|
{/if}
|
|
254
273
|
</div>
|
|
255
274
|
|
|
256
|
-
<!--
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
<span
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
: getResolvedLabel(currentInterrupt.type)}
|
|
266
|
-
{:else if currentInterrupt.machineState.status === 'error'}
|
|
267
|
-
Error - Click to Retry
|
|
268
|
-
{:else}
|
|
269
|
-
{getTypeLabel(currentInterrupt.type)}
|
|
270
|
-
{/if}
|
|
271
|
-
</span>
|
|
272
|
-
{#if showTimestamp}
|
|
273
|
-
<span class="interrupt-bubble__timestamp">
|
|
274
|
-
{formatTimestamp(currentInterrupt.resolvedAt ?? currentInterrupt.createdAt)}
|
|
275
|
-
</span>
|
|
276
|
-
{/if}
|
|
275
|
+
<!-- Error message with retry button -->
|
|
276
|
+
{#if currentInterrupt.machineState.status === 'error'}
|
|
277
|
+
<div class="interrupt-bubble__error">
|
|
278
|
+
<Icon icon="mdi:alert-circle" />
|
|
279
|
+
<span>{error}</span>
|
|
280
|
+
<button type="button" class="interrupt-bubble__retry-btn" onclick={handleRetry}>
|
|
281
|
+
<Icon icon="mdi:refresh" />
|
|
282
|
+
Retry
|
|
283
|
+
</button>
|
|
277
284
|
</div>
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
285
|
+
{/if}
|
|
286
|
+
|
|
287
|
+
<!-- Prompt content based on type -->
|
|
288
|
+
<div class="interrupt-bubble__body">
|
|
289
|
+
{#if currentInterrupt.type === 'confirmation'}
|
|
290
|
+
<ConfirmationPrompt
|
|
291
|
+
config={confirmationConfig}
|
|
292
|
+
{isResolved}
|
|
293
|
+
resolvedValue={displayResolvedValue as boolean | undefined}
|
|
294
|
+
{isSubmitting}
|
|
295
|
+
{error}
|
|
296
|
+
{resolvedByUserName}
|
|
297
|
+
onConfirm={() => handleResolve(true)}
|
|
298
|
+
onDecline={() => handleResolve(false)}
|
|
299
|
+
/>
|
|
300
|
+
{:else if currentInterrupt.type === 'choice'}
|
|
301
|
+
<ChoicePrompt
|
|
302
|
+
config={choiceConfig}
|
|
303
|
+
{isResolved}
|
|
304
|
+
resolvedValue={displayResolvedValue as string | string[] | undefined}
|
|
305
|
+
{isSubmitting}
|
|
306
|
+
{error}
|
|
307
|
+
{resolvedByUserName}
|
|
308
|
+
onSubmit={(value) => handleResolve(value)}
|
|
309
|
+
/>
|
|
310
|
+
{:else if currentInterrupt.type === 'text'}
|
|
311
|
+
<TextInputPrompt
|
|
312
|
+
config={textConfig}
|
|
313
|
+
{isResolved}
|
|
314
|
+
resolvedValue={displayResolvedValue as string | undefined}
|
|
315
|
+
{isSubmitting}
|
|
316
|
+
{error}
|
|
317
|
+
{resolvedByUserName}
|
|
318
|
+
onSubmit={(value) => handleResolve(value)}
|
|
319
|
+
/>
|
|
320
|
+
{:else if currentInterrupt.type === 'form'}
|
|
321
|
+
<FormPrompt
|
|
322
|
+
config={formConfig}
|
|
323
|
+
{isResolved}
|
|
324
|
+
resolvedValue={displayResolvedValue as Record<string, unknown> | undefined}
|
|
325
|
+
{isSubmitting}
|
|
326
|
+
{error}
|
|
327
|
+
{resolvedByUserName}
|
|
328
|
+
onSubmit={(value) => handleResolve(value)}
|
|
329
|
+
/>
|
|
330
|
+
{:else if currentInterrupt.type === 'review'}
|
|
331
|
+
<ReviewPrompt
|
|
332
|
+
config={reviewConfig}
|
|
333
|
+
{isResolved}
|
|
334
|
+
resolvedValue={displayResolvedValue as ReviewResolution | undefined}
|
|
335
|
+
{isSubmitting}
|
|
336
|
+
{error}
|
|
337
|
+
{resolvedByUserName}
|
|
338
|
+
onSubmit={(value) => handleResolve(value)}
|
|
339
|
+
/>
|
|
289
340
|
{/if}
|
|
341
|
+
</div>
|
|
290
342
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
{error}
|
|
300
|
-
{resolvedByUserName}
|
|
301
|
-
onConfirm={() => handleResolve(true)}
|
|
302
|
-
onDecline={() => handleResolve(false)}
|
|
303
|
-
/>
|
|
304
|
-
{:else if currentInterrupt.type === 'choice'}
|
|
305
|
-
<ChoicePrompt
|
|
306
|
-
config={choiceConfig}
|
|
307
|
-
{isResolved}
|
|
308
|
-
resolvedValue={displayResolvedValue as string | string[] | undefined}
|
|
309
|
-
{isSubmitting}
|
|
310
|
-
{error}
|
|
311
|
-
{resolvedByUserName}
|
|
312
|
-
onSubmit={(value) => handleResolve(value)}
|
|
313
|
-
/>
|
|
314
|
-
{:else if currentInterrupt.type === 'text'}
|
|
315
|
-
<TextInputPrompt
|
|
316
|
-
config={textConfig}
|
|
317
|
-
{isResolved}
|
|
318
|
-
resolvedValue={displayResolvedValue as string | undefined}
|
|
319
|
-
{isSubmitting}
|
|
320
|
-
{error}
|
|
321
|
-
{resolvedByUserName}
|
|
322
|
-
onSubmit={(value) => handleResolve(value)}
|
|
323
|
-
/>
|
|
324
|
-
{:else if currentInterrupt.type === 'form'}
|
|
325
|
-
<FormPrompt
|
|
326
|
-
config={formConfig}
|
|
327
|
-
{isResolved}
|
|
328
|
-
resolvedValue={displayResolvedValue as Record<string, unknown> | undefined}
|
|
329
|
-
{isSubmitting}
|
|
330
|
-
{error}
|
|
331
|
-
{resolvedByUserName}
|
|
332
|
-
onSubmit={(value) => handleResolve(value)}
|
|
333
|
-
/>
|
|
343
|
+
<!-- Footer -->
|
|
344
|
+
{#if currentInterrupt.nodeId || (currentInterrupt.allowCancel && !isResolved && currentInterrupt.type !== 'confirmation')}
|
|
345
|
+
<div class="interrupt-bubble__footer">
|
|
346
|
+
{#if currentInterrupt.nodeId}
|
|
347
|
+
<span class="interrupt-bubble__node" title="Node ID: {currentInterrupt.nodeId}">
|
|
348
|
+
<Icon icon="mdi:graph" />
|
|
349
|
+
<span>From workflow node</span>
|
|
350
|
+
</span>
|
|
334
351
|
{/if}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
<!-- Cancel button (if allowed and not in terminal state) -->
|
|
338
|
-
{#if currentInterrupt.allowCancel && !isResolved && currentInterrupt.type !== 'confirmation'}
|
|
339
|
-
<div class="interrupt-bubble__cancel-wrapper">
|
|
352
|
+
{#if currentInterrupt.allowCancel && !isResolved && currentInterrupt.type !== 'confirmation'}
|
|
340
353
|
<button
|
|
341
354
|
type="button"
|
|
342
355
|
class="interrupt-bubble__cancel-btn"
|
|
@@ -346,33 +359,23 @@
|
|
|
346
359
|
<Icon icon="mdi:close" />
|
|
347
360
|
<span>Cancel</span>
|
|
348
361
|
</button>
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
<!-- Node info footer -->
|
|
353
|
-
{#if currentInterrupt.nodeId}
|
|
354
|
-
<div class="interrupt-bubble__footer">
|
|
355
|
-
<span class="interrupt-bubble__node" title="Node ID: {currentInterrupt.nodeId}">
|
|
356
|
-
<Icon icon="mdi:graph" />
|
|
357
|
-
<span>From workflow node</span>
|
|
358
|
-
</span>
|
|
359
|
-
</div>
|
|
360
|
-
{/if}
|
|
361
|
-
</div>
|
|
362
|
+
{/if}
|
|
363
|
+
</div>
|
|
364
|
+
{/if}
|
|
362
365
|
</div>
|
|
363
366
|
|
|
364
367
|
<style>
|
|
365
368
|
/* Uses design tokens from base.css: --fd-interrupt-* */
|
|
366
369
|
.interrupt-bubble {
|
|
367
370
|
display: flex;
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
border: 1px solid var(--fd-interrupt-pending-border);
|
|
371
|
+
flex-direction: column;
|
|
372
|
+
margin: var(--fd-space-md) var(--fd-space-xl);
|
|
373
|
+
border-radius: var(--fd-radius-xl);
|
|
374
|
+
background-color: var(--fd-interrupt-prompt-bg);
|
|
375
|
+
border: 1px solid var(--fd-interrupt-prompt-border-pending);
|
|
374
376
|
box-shadow: 0 2px 8px var(--fd-interrupt-pending-shadow);
|
|
375
377
|
animation: interruptSlideIn 0.3s ease-out;
|
|
378
|
+
overflow: hidden;
|
|
376
379
|
}
|
|
377
380
|
|
|
378
381
|
@keyframes interruptSlideIn {
|
|
@@ -386,22 +389,19 @@
|
|
|
386
389
|
}
|
|
387
390
|
}
|
|
388
391
|
|
|
389
|
-
/*
|
|
392
|
+
/* State border colors */
|
|
390
393
|
.interrupt-bubble--completed {
|
|
391
|
-
|
|
392
|
-
border-color: var(--fd-interrupt-completed-border);
|
|
394
|
+
border-color: var(--fd-interrupt-prompt-border-completed);
|
|
393
395
|
box-shadow: 0 2px 8px var(--fd-interrupt-completed-shadow);
|
|
394
396
|
}
|
|
395
397
|
|
|
396
398
|
.interrupt-bubble--cancelled {
|
|
397
|
-
|
|
398
|
-
border-color: var(--fd-interrupt-cancelled-border);
|
|
399
|
+
border-color: var(--fd-interrupt-prompt-border-cancelled);
|
|
399
400
|
box-shadow: 0 2px 8px var(--fd-interrupt-cancelled-shadow);
|
|
400
401
|
}
|
|
401
402
|
|
|
402
403
|
.interrupt-bubble--error {
|
|
403
|
-
|
|
404
|
-
border-color: var(--fd-interrupt-error-border);
|
|
404
|
+
border-color: var(--fd-interrupt-prompt-border-error);
|
|
405
405
|
box-shadow: 0 2px 8px var(--fd-interrupt-error-shadow);
|
|
406
406
|
}
|
|
407
407
|
|
|
@@ -409,55 +409,38 @@
|
|
|
409
409
|
opacity: 0.9;
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
-
/*
|
|
413
|
-
.interrupt-
|
|
414
|
-
flex-shrink: 0;
|
|
415
|
-
width: 2.25rem;
|
|
416
|
-
height: 2.25rem;
|
|
412
|
+
/* Header */
|
|
413
|
+
.interrupt-bubble__header {
|
|
417
414
|
display: flex;
|
|
418
415
|
align-items: center;
|
|
419
|
-
justify-content:
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.interrupt-bubble--completed .interrupt-bubble__avatar {
|
|
427
|
-
background-color: var(--fd-interrupt-completed-avatar);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
.interrupt-bubble--cancelled .interrupt-bubble__avatar {
|
|
431
|
-
background-color: var(--fd-interrupt-cancelled-avatar);
|
|
416
|
+
justify-content: space-between;
|
|
417
|
+
gap: var(--fd-space-xs);
|
|
418
|
+
padding: var(--fd-space-md) var(--fd-space-xl);
|
|
419
|
+
background: var(--fd-interrupt-pending-bg);
|
|
420
|
+
border-bottom: 1px solid var(--fd-interrupt-prompt-border-pending);
|
|
432
421
|
}
|
|
433
422
|
|
|
434
|
-
.interrupt-bubble--
|
|
435
|
-
background
|
|
423
|
+
.interrupt-bubble--completed .interrupt-bubble__header {
|
|
424
|
+
background: var(--fd-interrupt-completed-bg);
|
|
425
|
+
border-bottom-color: var(--fd-interrupt-prompt-border-completed);
|
|
436
426
|
}
|
|
437
427
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
min-width: 0;
|
|
442
|
-
display: flex;
|
|
443
|
-
flex-direction: column;
|
|
444
|
-
gap: 0.75rem;
|
|
428
|
+
.interrupt-bubble--cancelled .interrupt-bubble__header {
|
|
429
|
+
background: var(--fd-interrupt-cancelled-bg);
|
|
430
|
+
border-bottom-color: var(--fd-interrupt-prompt-border-cancelled);
|
|
445
431
|
}
|
|
446
432
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
align-items: center;
|
|
451
|
-
justify-content: space-between;
|
|
452
|
-
gap: 0.5rem;
|
|
433
|
+
.interrupt-bubble--error .interrupt-bubble__header {
|
|
434
|
+
background: var(--fd-interrupt-error-bg);
|
|
435
|
+
border-bottom-color: var(--fd-interrupt-prompt-border-error);
|
|
453
436
|
}
|
|
454
437
|
|
|
455
438
|
.interrupt-bubble__type {
|
|
456
439
|
display: flex;
|
|
457
440
|
align-items: center;
|
|
458
|
-
gap:
|
|
441
|
+
gap: var(--fd-space-2xs);
|
|
459
442
|
font-weight: 600;
|
|
460
|
-
font-size:
|
|
443
|
+
font-size: var(--fd-text-sm);
|
|
461
444
|
color: var(--fd-interrupt-pending-text);
|
|
462
445
|
}
|
|
463
446
|
|
|
@@ -474,9 +457,9 @@
|
|
|
474
457
|
}
|
|
475
458
|
|
|
476
459
|
.interrupt-bubble__timestamp {
|
|
477
|
-
font-size:
|
|
460
|
+
font-size: var(--fd-text-2xs);
|
|
478
461
|
color: var(--fd-interrupt-pending-text-light);
|
|
479
|
-
font-family:
|
|
462
|
+
font-family: var(--fd-font-mono);
|
|
480
463
|
}
|
|
481
464
|
|
|
482
465
|
.interrupt-bubble--completed .interrupt-bubble__timestamp {
|
|
@@ -495,68 +478,92 @@
|
|
|
495
478
|
.interrupt-bubble__error {
|
|
496
479
|
display: flex;
|
|
497
480
|
align-items: center;
|
|
498
|
-
gap:
|
|
499
|
-
|
|
481
|
+
gap: var(--fd-space-xs);
|
|
482
|
+
margin: var(--fd-space-md) var(--fd-space-xl) 0;
|
|
483
|
+
padding: var(--fd-space-xs) var(--fd-space-md);
|
|
500
484
|
background-color: var(--fd-error-muted);
|
|
501
485
|
border-radius: var(--fd-radius-md);
|
|
502
486
|
color: var(--fd-interrupt-error-text);
|
|
503
|
-
font-size:
|
|
487
|
+
font-size: var(--fd-interrupt-font-error);
|
|
504
488
|
}
|
|
505
489
|
|
|
506
490
|
.interrupt-bubble__retry-btn {
|
|
507
491
|
display: inline-flex;
|
|
508
492
|
align-items: center;
|
|
509
|
-
gap:
|
|
493
|
+
gap: var(--fd-space-3xs);
|
|
510
494
|
margin-left: auto;
|
|
511
|
-
padding:
|
|
512
|
-
font-size:
|
|
495
|
+
padding: var(--fd-space-3xs) var(--fd-space-xs);
|
|
496
|
+
font-size: var(--fd-text-xs);
|
|
513
497
|
font-weight: 500;
|
|
514
498
|
font-family: inherit;
|
|
515
|
-
color:
|
|
499
|
+
color: var(--fd-error-foreground);
|
|
516
500
|
background-color: var(--fd-interrupt-error-avatar);
|
|
517
501
|
border: none;
|
|
518
|
-
border-radius:
|
|
502
|
+
border-radius: var(--fd-radius-sm);
|
|
519
503
|
cursor: pointer;
|
|
520
|
-
transition: background-color
|
|
504
|
+
transition: background-color var(--fd-transition-fast);
|
|
521
505
|
}
|
|
522
506
|
|
|
523
507
|
.interrupt-bubble__retry-btn:hover {
|
|
524
508
|
background-color: var(--fd-error-hover);
|
|
525
509
|
}
|
|
526
510
|
|
|
527
|
-
/*
|
|
528
|
-
.interrupt-
|
|
529
|
-
|
|
530
|
-
border-radius: 0.5rem;
|
|
531
|
-
padding: 1rem;
|
|
532
|
-
border: 1px solid var(--fd-interrupt-prompt-border-pending);
|
|
511
|
+
/* Body - prompt content area, full width */
|
|
512
|
+
.interrupt-bubble__body {
|
|
513
|
+
padding: var(--fd-space-xl);
|
|
533
514
|
}
|
|
534
515
|
|
|
535
|
-
.interrupt-bubble--
|
|
536
|
-
|
|
516
|
+
.interrupt-bubble--cancelled .interrupt-bubble__body {
|
|
517
|
+
opacity: 0.75;
|
|
537
518
|
}
|
|
538
519
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
520
|
+
/* Desaturate body content in error state to reduce visual noise from green/red colors */
|
|
521
|
+
.interrupt-bubble--error .interrupt-bubble__body {
|
|
522
|
+
filter: saturate(0.2);
|
|
523
|
+
opacity: 0.7;
|
|
542
524
|
}
|
|
543
525
|
|
|
544
|
-
|
|
545
|
-
|
|
526
|
+
/* Footer */
|
|
527
|
+
.interrupt-bubble__footer {
|
|
528
|
+
display: flex;
|
|
529
|
+
align-items: center;
|
|
530
|
+
justify-content: space-between;
|
|
531
|
+
gap: var(--fd-space-xs);
|
|
532
|
+
padding: var(--fd-space-md) var(--fd-space-xl);
|
|
533
|
+
background: var(--fd-interrupt-pending-bg);
|
|
534
|
+
border-top: 1px solid var(--fd-interrupt-prompt-border-pending);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.interrupt-bubble--completed .interrupt-bubble__footer {
|
|
538
|
+
background: var(--fd-interrupt-completed-bg);
|
|
539
|
+
border-top-color: var(--fd-interrupt-prompt-border-completed);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.interrupt-bubble--cancelled .interrupt-bubble__footer {
|
|
543
|
+
background: var(--fd-interrupt-cancelled-bg);
|
|
544
|
+
border-top-color: var(--fd-interrupt-prompt-border-cancelled);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
.interrupt-bubble--error .interrupt-bubble__footer {
|
|
548
|
+
background: var(--fd-interrupt-error-bg);
|
|
549
|
+
border-top-color: var(--fd-interrupt-prompt-border-error);
|
|
546
550
|
}
|
|
547
551
|
|
|
548
|
-
|
|
549
|
-
.interrupt-bubble__cancel-wrapper {
|
|
552
|
+
.interrupt-bubble__node {
|
|
550
553
|
display: flex;
|
|
551
|
-
|
|
554
|
+
align-items: center;
|
|
555
|
+
gap: var(--fd-space-3xs);
|
|
556
|
+
font-size: var(--fd-text-2xs);
|
|
557
|
+
color: var(--fd-muted-foreground);
|
|
552
558
|
}
|
|
553
559
|
|
|
554
560
|
.interrupt-bubble__cancel-btn {
|
|
555
561
|
display: inline-flex;
|
|
556
562
|
align-items: center;
|
|
557
|
-
gap:
|
|
558
|
-
|
|
559
|
-
|
|
563
|
+
gap: var(--fd-space-2xs);
|
|
564
|
+
margin-left: auto;
|
|
565
|
+
padding: var(--fd-space-2xs) var(--fd-space-md);
|
|
566
|
+
font-size: var(--fd-text-xs);
|
|
560
567
|
font-weight: 500;
|
|
561
568
|
font-family: inherit;
|
|
562
569
|
color: var(--fd-muted-foreground);
|
|
@@ -578,58 +585,17 @@
|
|
|
578
585
|
cursor: not-allowed;
|
|
579
586
|
}
|
|
580
587
|
|
|
581
|
-
/* Footer */
|
|
582
|
-
.interrupt-bubble__footer {
|
|
583
|
-
display: flex;
|
|
584
|
-
align-items: center;
|
|
585
|
-
gap: 0.5rem;
|
|
586
|
-
padding-top: 0.5rem;
|
|
587
|
-
border-top: 1px solid var(--fd-interrupt-prompt-border-pending);
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
.interrupt-bubble--completed .interrupt-bubble__footer {
|
|
591
|
-
border-color: var(--fd-interrupt-prompt-border-completed);
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
.interrupt-bubble--cancelled .interrupt-bubble__footer {
|
|
595
|
-
border-color: var(--fd-interrupt-prompt-border-cancelled);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
.interrupt-bubble--error .interrupt-bubble__footer {
|
|
599
|
-
border-color: var(--fd-interrupt-prompt-border-error);
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
.interrupt-bubble__node {
|
|
603
|
-
display: flex;
|
|
604
|
-
align-items: center;
|
|
605
|
-
gap: 0.25rem;
|
|
606
|
-
font-size: 0.6875rem;
|
|
607
|
-
color: var(--fd-interrupt-pending-text);
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
.interrupt-bubble--completed .interrupt-bubble__node {
|
|
611
|
-
color: var(--fd-interrupt-completed-text);
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
.interrupt-bubble--cancelled .interrupt-bubble__node {
|
|
615
|
-
color: var(--fd-interrupt-cancelled-text);
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
.interrupt-bubble--error .interrupt-bubble__node {
|
|
619
|
-
color: var(--fd-interrupt-error-text);
|
|
620
|
-
}
|
|
621
|
-
|
|
622
588
|
/* Responsive */
|
|
623
589
|
@media (max-width: 640px) {
|
|
624
590
|
.interrupt-bubble {
|
|
625
|
-
margin:
|
|
626
|
-
padding: 0.875rem 1rem;
|
|
591
|
+
margin: var(--fd-space-xs);
|
|
627
592
|
}
|
|
628
593
|
|
|
629
|
-
.interrupt-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
594
|
+
.interrupt-bubble__header,
|
|
595
|
+
.interrupt-bubble__body,
|
|
596
|
+
.interrupt-bubble__footer {
|
|
597
|
+
padding-left: var(--fd-space-lg);
|
|
598
|
+
padding-right: var(--fd-space-lg);
|
|
633
599
|
}
|
|
634
600
|
}
|
|
635
601
|
</style>
|