MCPcopy Index your code
hub / github.com/simstudioai/sim / persistWorkflowStateToServer

Function persistWorkflowStateToServer

apps/sim/stores/workflow-diff/utils.ts:114–170  ·  view source on GitHub ↗
(
  workflowId: string,
  workflowState: WorkflowState
)

Source from the content-addressed store, hash-verified

112}
113
114export async function persistWorkflowStateToServer(
115 workflowId: string,
116 workflowState: WorkflowState
117): Promise<boolean> {
118 try {
119 const cleanState = stripWorkflowDiffMarkers(cloneWorkflowState(workflowState))
120 const { dragStartPosition: _dropDragStart, ...stateToSave } = cleanState
121
122 type ContractEdgeInput = WorkflowStateContractInput['edges'][number]
123
124 // Mirror auto-layout-utils sanitization: schema rejects nullable
125 // sourceHandle/targetHandle (input type is `string | undefined`), but the
126 // store's Edge type carries `string | null | undefined`. Drop nulls before
127 // sending so the contract input parses cleanly.
128 const sanitizedEdges: ContractEdgeInput[] = (stateToSave.edges || []).map((edge: Edge) => {
129 const { sourceHandle, targetHandle, ...rest } = edge
130 const sanitized: ContractEdgeInput = { ...rest } as ContractEdgeInput
131 if (typeof sourceHandle === 'string' && sourceHandle.length > 0) {
132 sanitized.sourceHandle = sourceHandle
133 }
134 if (typeof targetHandle === 'string' && targetHandle.length > 0) {
135 sanitized.targetHandle = targetHandle
136 }
137 return sanitized
138 })
139
140 const cleanedWorkflowState: WorkflowStateContractInput = {
141 ...stateToSave,
142 loops: stateToSave.loops || {},
143 parallels: stateToSave.parallels || {},
144 edges: sanitizedEdges,
145 lastSaved: Date.now(),
146 }
147
148 await requestJson(putWorkflowNormalizedStateContract, {
149 params: { id: workflowId },
150 body: cleanedWorkflowState,
151 })
152
153 const activeWorkflowId = useWorkflowRegistry.getState().activeWorkflowId
154 if (activeWorkflowId === workflowId) {
155 useWorkflowStore.setState({ lastSaved: Date.now() })
156 }
157
158 return true
159 } catch (error) {
160 if (error instanceof ApiClientError) {
161 logger.error('Failed to persist workflow state after copilot edit', {
162 status: error.status,
163 message: error.message,
164 })
165 } else {
166 logger.error('Failed to persist workflow state after copilot edit', error)
167 }
168 return false
169 }
170}
171

Callers 1

store.tsFile · 0.90

Calls 4

stripWorkflowDiffMarkersFunction · 0.90
requestJsonFunction · 0.90
cloneWorkflowStateFunction · 0.85
errorMethod · 0.80

Tested by

no test coverage detected