- The
<App>component takes them as flaton*props —onBeforeSave,onAfterSave,onSaveError,onApiError,onWorkflowLoad,onBeforeSwap,onAfterSwap. - The mount options bag (
mountFlowDropApp,mountWorkflowEditor) takes the groupedeventHandlersobject, which additionally wiresonWorkflowChange,onDirtyStateChange, andonBeforeUnmount.
Workflow lifecycle
| Handler | Signature | When it fires |
|---|---|---|
onWorkflowChange | (workflow: Workflow, changeType: WorkflowChangeType) => void | Any modification to nodes, edges, config, or metadata |
onWorkflowLoad | (workflow: Workflow) => void | After a workflow is loaded and initialized |
onDirtyStateChange | (isDirty: boolean) => void | When the workflow transitions between saved and unsaved states |
WorkflowChangeType values
| Value | Trigger |
|---|---|
node_add | Node added to canvas |
node_remove | Node deleted |
node_move | Node dragged to new position |
node_config | Node configuration values changed |
edge_add | Connection drawn between nodes |
edge_remove | Connection deleted |
metadata | Workflow metadata changed |
name | Workflow name edited |
description | Workflow description edited |
Save lifecycle
| Handler | Signature | When it fires |
|---|---|---|
onBeforeSave | (workflow: Workflow) => Promise<boolean | void> | Before save. Return false to cancel. |
onAfterSave | (workflow: Workflow) => Promise<void> | After successful save |
onSaveError | (error: Error, workflow: Workflow) => Promise<void> | When save fails |
Node swap
| Handler | Signature | When it fires |
|---|---|---|
onBeforeSwap | (context: SwapEventContext) => boolean | void | Promise<boolean | void> | Before a node swap. Return false to cancel. |
onAfterSwap | (result: SwapResult, oldNode: WorkflowNode, newNodeId: string) => void | After a node swap is applied |
Error & cleanup
| Handler | Signature | When it fires |
|---|---|---|
onApiError | (error: Error, operation: string) => boolean | void | Any API request failure. Return true to suppress default toast. operation values: "save", "load", "fetchNodes", "fetchCategories", etc. |
onBeforeUnmount | (workflow: Workflow, isDirty: boolean) => void | Before FlowDrop is destroyed/unmounted |
Agent Spec execution
| Handler | Signature | When it fires |
|---|---|---|
onAgentSpecExecutionStarted | (executionId: string) => void | Execution begins |
onAgentSpecExecutionCompleted | (executionId: string, results: Record<string, unknown>) => void | Execution succeeds |
onAgentSpecExecutionFailed | (executionId: string, error: Error) => void | Execution fails |
onAgentSpecNodeStatusUpdate | (nodeId: string, status: NodeExecutionInfo) => void | Node status changes during execution |