griptape-nodes 0.41.0__py3-none-any.whl → 0.43.0__py3-none-any.whl

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 (133) hide show
  1. griptape_nodes/__init__.py +0 -0
  2. griptape_nodes/app/.python-version +0 -0
  3. griptape_nodes/app/__init__.py +1 -10
  4. griptape_nodes/app/api.py +199 -0
  5. griptape_nodes/app/app.py +140 -222
  6. griptape_nodes/app/watch.py +4 -2
  7. griptape_nodes/bootstrap/__init__.py +0 -0
  8. griptape_nodes/bootstrap/bootstrap_script.py +0 -0
  9. griptape_nodes/bootstrap/register_libraries_script.py +0 -0
  10. griptape_nodes/bootstrap/structure_config.yaml +0 -0
  11. griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  12. griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +0 -0
  13. griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -0
  14. griptape_nodes/bootstrap/workflow_runners/__init__.py +0 -0
  15. griptape_nodes/bootstrap/workflow_runners/bootstrap_workflow_runner.py +0 -0
  16. griptape_nodes/bootstrap/workflow_runners/local_workflow_runner.py +0 -0
  17. griptape_nodes/bootstrap/workflow_runners/subprocess_workflow_runner.py +6 -2
  18. griptape_nodes/bootstrap/workflow_runners/workflow_runner.py +0 -0
  19. griptape_nodes/drivers/__init__.py +0 -0
  20. griptape_nodes/drivers/storage/__init__.py +0 -0
  21. griptape_nodes/drivers/storage/base_storage_driver.py +0 -0
  22. griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +0 -0
  23. griptape_nodes/drivers/storage/local_storage_driver.py +5 -3
  24. griptape_nodes/drivers/storage/storage_backend.py +0 -0
  25. griptape_nodes/exe_types/__init__.py +0 -0
  26. griptape_nodes/exe_types/connections.py +0 -0
  27. griptape_nodes/exe_types/core_types.py +0 -0
  28. griptape_nodes/exe_types/flow.py +68 -368
  29. griptape_nodes/exe_types/node_types.py +17 -1
  30. griptape_nodes/exe_types/type_validator.py +0 -0
  31. griptape_nodes/machines/__init__.py +0 -0
  32. griptape_nodes/machines/control_flow.py +52 -20
  33. griptape_nodes/machines/fsm.py +16 -2
  34. griptape_nodes/machines/node_resolution.py +16 -14
  35. griptape_nodes/mcp_server/__init__.py +1 -0
  36. griptape_nodes/mcp_server/server.py +126 -0
  37. griptape_nodes/mcp_server/ws_request_manager.py +268 -0
  38. griptape_nodes/node_library/__init__.py +0 -0
  39. griptape_nodes/node_library/advanced_node_library.py +0 -0
  40. griptape_nodes/node_library/library_registry.py +0 -0
  41. griptape_nodes/node_library/workflow_registry.py +2 -2
  42. griptape_nodes/py.typed +0 -0
  43. griptape_nodes/retained_mode/__init__.py +0 -0
  44. griptape_nodes/retained_mode/events/__init__.py +0 -0
  45. griptape_nodes/retained_mode/events/agent_events.py +70 -8
  46. griptape_nodes/retained_mode/events/app_events.py +137 -12
  47. griptape_nodes/retained_mode/events/arbitrary_python_events.py +23 -0
  48. griptape_nodes/retained_mode/events/base_events.py +13 -31
  49. griptape_nodes/retained_mode/events/config_events.py +87 -11
  50. griptape_nodes/retained_mode/events/connection_events.py +56 -5
  51. griptape_nodes/retained_mode/events/context_events.py +27 -4
  52. griptape_nodes/retained_mode/events/execution_events.py +99 -14
  53. griptape_nodes/retained_mode/events/flow_events.py +165 -7
  54. griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  55. griptape_nodes/retained_mode/events/library_events.py +195 -17
  56. griptape_nodes/retained_mode/events/logger_events.py +11 -0
  57. griptape_nodes/retained_mode/events/node_events.py +242 -22
  58. griptape_nodes/retained_mode/events/object_events.py +40 -4
  59. griptape_nodes/retained_mode/events/os_events.py +116 -3
  60. griptape_nodes/retained_mode/events/parameter_events.py +212 -8
  61. griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  62. griptape_nodes/retained_mode/events/secrets_events.py +59 -7
  63. griptape_nodes/retained_mode/events/static_file_events.py +57 -4
  64. griptape_nodes/retained_mode/events/validation_events.py +39 -4
  65. griptape_nodes/retained_mode/events/workflow_events.py +188 -17
  66. griptape_nodes/retained_mode/griptape_nodes.py +89 -363
  67. griptape_nodes/retained_mode/managers/__init__.py +0 -0
  68. griptape_nodes/retained_mode/managers/agent_manager.py +49 -23
  69. griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -0
  70. griptape_nodes/retained_mode/managers/config_manager.py +0 -0
  71. griptape_nodes/retained_mode/managers/context_manager.py +0 -0
  72. griptape_nodes/retained_mode/managers/engine_identity_manager.py +146 -0
  73. griptape_nodes/retained_mode/managers/event_manager.py +14 -2
  74. griptape_nodes/retained_mode/managers/flow_manager.py +751 -64
  75. griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py +45 -0
  76. griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py +191 -0
  77. griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py +346 -0
  78. griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py +439 -0
  79. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py +17 -0
  80. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py +82 -0
  81. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py +116 -0
  82. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py +352 -0
  83. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py +104 -0
  84. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py +155 -0
  85. griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py +18 -0
  86. griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py +12 -0
  87. griptape_nodes/retained_mode/managers/library_manager.py +255 -40
  88. griptape_nodes/retained_mode/managers/node_manager.py +120 -103
  89. griptape_nodes/retained_mode/managers/object_manager.py +11 -3
  90. griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  91. griptape_nodes/retained_mode/managers/os_manager.py +582 -8
  92. griptape_nodes/retained_mode/managers/secrets_manager.py +4 -0
  93. griptape_nodes/retained_mode/managers/session_manager.py +328 -0
  94. griptape_nodes/retained_mode/managers/settings.py +7 -0
  95. griptape_nodes/retained_mode/managers/static_files_manager.py +0 -0
  96. griptape_nodes/retained_mode/managers/version_compatibility_manager.py +2 -2
  97. griptape_nodes/retained_mode/managers/workflow_manager.py +722 -456
  98. griptape_nodes/retained_mode/retained_mode.py +44 -0
  99. griptape_nodes/retained_mode/utils/__init__.py +0 -0
  100. griptape_nodes/retained_mode/utils/engine_identity.py +141 -27
  101. griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  102. griptape_nodes/traits/__init__.py +0 -0
  103. griptape_nodes/traits/add_param_button.py +0 -0
  104. griptape_nodes/traits/button.py +0 -0
  105. griptape_nodes/traits/clamp.py +0 -0
  106. griptape_nodes/traits/compare.py +0 -0
  107. griptape_nodes/traits/compare_images.py +0 -0
  108. griptape_nodes/traits/file_system_picker.py +127 -0
  109. griptape_nodes/traits/minmax.py +0 -0
  110. griptape_nodes/traits/options.py +0 -0
  111. griptape_nodes/traits/slider.py +0 -0
  112. griptape_nodes/traits/trait_registry.py +0 -0
  113. griptape_nodes/traits/traits.json +0 -0
  114. griptape_nodes/updater/__init__.py +2 -2
  115. griptape_nodes/updater/__main__.py +0 -0
  116. griptape_nodes/utils/__init__.py +0 -0
  117. griptape_nodes/utils/dict_utils.py +0 -0
  118. griptape_nodes/utils/image_preview.py +128 -0
  119. griptape_nodes/utils/metaclasses.py +0 -0
  120. griptape_nodes/version_compatibility/__init__.py +0 -0
  121. griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  122. griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
  123. griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +5 -5
  124. griptape_nodes-0.43.0.dist-info/METADATA +90 -0
  125. griptape_nodes-0.43.0.dist-info/RECORD +129 -0
  126. griptape_nodes-0.43.0.dist-info/WHEEL +4 -0
  127. {griptape_nodes-0.41.0.dist-info → griptape_nodes-0.43.0.dist-info}/entry_points.txt +1 -0
  128. griptape_nodes/app/app_sessions.py +0 -458
  129. griptape_nodes/retained_mode/utils/session_persistence.py +0 -105
  130. griptape_nodes-0.41.0.dist-info/METADATA +0 -78
  131. griptape_nodes-0.41.0.dist-info/RECORD +0 -112
  132. griptape_nodes-0.41.0.dist-info/WHEEL +0 -4
  133. griptape_nodes-0.41.0.dist-info/licenses/LICENSE +0 -201
@@ -14,42 +14,76 @@ from griptape_nodes.retained_mode.events.payload_registry import PayloadRegistry
14
14
  @dataclass
15
15
  @PayloadRegistry.register
16
16
  class RunWorkflowFromScratchRequest(RequestPayload):
17
+ """Run a workflow from file, starting with a clean state.
18
+
19
+ Use when: Loading and executing saved workflows, testing workflows from files,
20
+ running workflows in clean environments, batch processing workflows.
21
+
22
+ Args:
23
+ file_path: Path to the workflow file to load and execute
24
+
25
+ Results: RunWorkflowFromScratchResultSuccess | RunWorkflowFromScratchResultFailure (file not found, load error)
26
+ """
27
+
17
28
  file_path: str
18
29
 
19
30
 
20
31
  @dataclass
21
32
  @PayloadRegistry.register
22
33
  class RunWorkflowFromScratchResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
23
- pass
34
+ """Workflow loaded and started successfully from file."""
24
35
 
25
36
 
26
37
  @dataclass
27
38
  @PayloadRegistry.register
28
39
  class RunWorkflowFromScratchResultFailure(ResultPayloadFailure):
29
- pass
40
+ """Workflow execution from file failed. Common causes: file not found, invalid workflow format, load error."""
30
41
 
31
42
 
32
43
  @dataclass
33
44
  @PayloadRegistry.register
34
45
  class RunWorkflowWithCurrentStateRequest(RequestPayload):
46
+ """Run a workflow from file, preserving current state.
47
+
48
+ Use when: Loading workflows while keeping existing node values, updating workflow structure
49
+ without losing progress, iterative workflow development.
50
+
51
+ Args:
52
+ file_path: Path to the workflow file to load while preserving current state
53
+
54
+ Results: RunWorkflowWithCurrentStateResultSuccess | RunWorkflowWithCurrentStateResultFailure (file not found, merge error)
55
+ """
56
+
35
57
  file_path: str
36
58
 
37
59
 
38
60
  @dataclass
39
61
  @PayloadRegistry.register
40
62
  class RunWorkflowWithCurrentStateResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
41
- pass
63
+ """Workflow loaded successfully while preserving current state."""
42
64
 
43
65
 
44
66
  @dataclass
45
67
  @PayloadRegistry.register
46
68
  class RunWorkflowWithCurrentStateResultFailure(ResultPayloadFailure):
47
- pass
69
+ """Workflow execution with current state failed. Common causes: file not found, state merge conflict, load error."""
48
70
 
49
71
 
50
72
  @dataclass
51
73
  @PayloadRegistry.register
52
74
  class RunWorkflowFromRegistryRequest(RequestPayload):
75
+ """Run a workflow from the registry.
76
+
77
+ Use when: Executing registered workflows, running workflows by name,
78
+ using workflow templates, automated workflow execution.
79
+
80
+ Args:
81
+ workflow_name: Name of the workflow in the registry to execute
82
+ run_with_clean_slate: Whether to start with a clean state (default: True)
83
+
84
+ Results: RunWorkflowFromRegistryResultSuccess | RunWorkflowFromRegistryResultFailure (workflow not found, execution error)
85
+ """
86
+
53
87
  workflow_name: str
54
88
  run_with_clean_slate: bool = True
55
89
 
@@ -57,18 +91,30 @@ class RunWorkflowFromRegistryRequest(RequestPayload):
57
91
  @dataclass
58
92
  @PayloadRegistry.register
59
93
  class RunWorkflowFromRegistryResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
60
- pass
94
+ """Workflow from registry started successfully."""
61
95
 
62
96
 
63
97
  @dataclass
64
98
  @PayloadRegistry.register
65
99
  class RunWorkflowFromRegistryResultFailure(ResultPayloadFailure):
66
- pass
100
+ """Workflow execution from registry failed. Common causes: workflow not found, execution error, registry error."""
67
101
 
68
102
 
69
103
  @dataclass
70
104
  @PayloadRegistry.register
71
105
  class RegisterWorkflowRequest(RequestPayload):
106
+ """Register a workflow in the registry.
107
+
108
+ Use when: Publishing workflows for reuse, creating workflow templates,
109
+ managing workflow libraries, making workflows available by name.
110
+
111
+ Args:
112
+ metadata: Workflow metadata containing name, description, and other properties
113
+ file_name: Name of the workflow file to register
114
+
115
+ Results: RegisterWorkflowResultSuccess (with workflow name) | RegisterWorkflowResultFailure (registration error)
116
+ """
117
+
72
118
  metadata: WorkflowMetadata
73
119
  file_name: str
74
120
 
@@ -76,54 +122,95 @@ class RegisterWorkflowRequest(RequestPayload):
76
122
  @dataclass
77
123
  @PayloadRegistry.register
78
124
  class RegisterWorkflowResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
125
+ """Workflow registered successfully.
126
+
127
+ Args:
128
+ workflow_name: Name assigned to the registered workflow
129
+ """
130
+
79
131
  workflow_name: str
80
132
 
81
133
 
82
134
  @dataclass
83
135
  @PayloadRegistry.register
84
136
  class RegisterWorkflowResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
85
- pass
137
+ """Workflow registration failed. Common causes: invalid metadata, file not found, name conflict."""
86
138
 
87
139
 
88
140
  @dataclass
89
141
  @PayloadRegistry.register
90
142
  class ListAllWorkflowsRequest(RequestPayload):
91
- pass
143
+ """List all workflows in the registry.
144
+
145
+ Use when: Displaying workflow catalogs, browsing available workflows,
146
+ implementing workflow selection UIs, workflow management.
147
+
148
+ Results: ListAllWorkflowsResultSuccess (with workflows dict) | ListAllWorkflowsResultFailure (registry error)
149
+ """
92
150
 
93
151
 
94
152
  @dataclass
95
153
  @PayloadRegistry.register
96
154
  class ListAllWorkflowsResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
155
+ """Workflows listed successfully.
156
+
157
+ Args:
158
+ workflows: Dictionary of workflow names to metadata
159
+ """
160
+
97
161
  workflows: dict
98
162
 
99
163
 
100
164
  @dataclass
101
165
  @PayloadRegistry.register
102
166
  class ListAllWorkflowsResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
103
- pass
167
+ """Workflow listing failed. Common causes: registry not initialized, registry error."""
104
168
 
105
169
 
106
170
  @dataclass
107
171
  @PayloadRegistry.register
108
172
  class DeleteWorkflowRequest(RequestPayload):
173
+ """Delete a workflow from the registry.
174
+
175
+ Use when: Removing obsolete workflows, cleaning up workflow libraries,
176
+ unregistering workflows, workflow management.
177
+
178
+ Args:
179
+ name: Name of the workflow to delete from the registry
180
+
181
+ Results: DeleteWorkflowResultSuccess | DeleteWorkflowResultFailure (workflow not found, deletion error)
182
+ """
183
+
109
184
  name: str
110
185
 
111
186
 
112
187
  @dataclass
113
188
  @PayloadRegistry.register
114
189
  class DeleteWorkflowResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
115
- pass
190
+ """Workflow deleted successfully from registry."""
116
191
 
117
192
 
118
193
  @dataclass
119
194
  @PayloadRegistry.register
120
195
  class DeleteWorkflowResultFailure(ResultPayloadFailure):
121
- pass
196
+ """Workflow deletion failed. Common causes: workflow not found, deletion not allowed, registry error."""
122
197
 
123
198
 
124
199
  @dataclass
125
200
  @PayloadRegistry.register
126
201
  class RenameWorkflowRequest(RequestPayload):
202
+ """Rename a workflow in the registry.
203
+
204
+ Use when: Updating workflow names, organizing workflow libraries,
205
+ fixing naming conflicts, workflow management.
206
+
207
+ Args:
208
+ workflow_name: Current name of the workflow
209
+ requested_name: New name for the workflow
210
+
211
+ Results: RenameWorkflowResultSuccess | RenameWorkflowResultFailure (workflow not found, name conflict)
212
+ """
213
+
127
214
  workflow_name: str
128
215
  requested_name: str
129
216
 
@@ -131,65 +218,149 @@ class RenameWorkflowRequest(RequestPayload):
131
218
  @dataclass
132
219
  @PayloadRegistry.register
133
220
  class RenameWorkflowResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
134
- pass
221
+ """Workflow renamed successfully."""
135
222
 
136
223
 
137
224
  @dataclass
138
225
  @PayloadRegistry.register
139
226
  class RenameWorkflowResultFailure(ResultPayloadFailure):
140
- pass
227
+ """Workflow rename failed. Common causes: workflow not found, name already exists, invalid name."""
141
228
 
142
229
 
143
230
  @dataclass
144
231
  @PayloadRegistry.register
145
232
  class SaveWorkflowRequest(RequestPayload):
233
+ """Save the current workflow to a file.
234
+
235
+ Use when: Persisting workflow changes, creating workflow backups,
236
+ exporting workflows, saving before major changes.
237
+
238
+ Args:
239
+ file_name: Name of the file to save the workflow to (None for auto-generated)
240
+ image_path: Path to save workflow image/thumbnail (None for no image)
241
+
242
+ Results: SaveWorkflowResultSuccess (with file path) | SaveWorkflowResultFailure (save error)
243
+ """
244
+
146
245
  file_name: str | None = None
147
246
  image_path: str | None = None
148
247
 
149
248
 
249
+ @dataclass
250
+ @PayloadRegistry.register
251
+ class ImportWorkflowAsReferencedSubFlowRequest(RequestPayload):
252
+ """Import a workflow as a referenced sub-flow.
253
+
254
+ Use when: Reusing workflows as components, creating modular workflows,
255
+ importing workflow templates, building composite workflows.
256
+
257
+ Results: ImportWorkflowAsReferencedSubFlowResultSuccess (with flow name) | ImportWorkflowAsReferencedSubFlowResultFailure (import error)
258
+ """
259
+
260
+ workflow_name: str
261
+ flow_name: str | None = None # If None, import into current context flow
262
+ imported_flow_metadata: dict | None = None # Metadata to apply to the imported flow
263
+
264
+
265
+ @dataclass
266
+ @PayloadRegistry.register
267
+ class ImportWorkflowAsReferencedSubFlowResultSuccess(WorkflowAlteredMixin, ResultPayloadSuccess):
268
+ """Workflow imported successfully as referenced sub-flow.
269
+
270
+ Args:
271
+ created_flow_name: Name of the created sub-flow
272
+ """
273
+
274
+ created_flow_name: str
275
+
276
+
277
+ @dataclass
278
+ @PayloadRegistry.register
279
+ class ImportWorkflowAsReferencedSubFlowResultFailure(ResultPayloadFailure):
280
+ """Workflow import as sub-flow failed. Common causes: workflow not found, import error, name conflict."""
281
+
282
+
150
283
  @dataclass
151
284
  @PayloadRegistry.register
152
285
  class SaveWorkflowResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
286
+ """Workflow saved successfully.
287
+
288
+ Args:
289
+ file_path: Path where the workflow was saved
290
+ """
291
+
153
292
  file_path: str
154
293
 
155
294
 
156
295
  @dataclass
157
296
  @PayloadRegistry.register
158
297
  class SaveWorkflowResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
159
- pass
298
+ """Workflow save failed. Common causes: file system error, permission denied, invalid path."""
160
299
 
161
300
 
162
301
  @dataclass
163
302
  @PayloadRegistry.register
164
303
  class LoadWorkflowMetadata(RequestPayload):
304
+ """Load workflow metadata from a file.
305
+
306
+ Use when: Inspecting workflow properties, validating workflow files,
307
+ displaying workflow information, workflow management.
308
+
309
+ Args:
310
+ file_name: Name of the workflow file to load metadata from
311
+
312
+ Results: LoadWorkflowMetadataResultSuccess (with metadata) | LoadWorkflowMetadataResultFailure (load error)
313
+ """
314
+
165
315
  file_name: str
166
316
 
167
317
 
168
318
  @dataclass
169
319
  @PayloadRegistry.register
170
320
  class LoadWorkflowMetadataResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
321
+ """Workflow metadata loaded successfully.
322
+
323
+ Args:
324
+ metadata: Workflow metadata object
325
+ """
326
+
171
327
  metadata: WorkflowMetadata
172
328
 
173
329
 
174
330
  @dataclass
175
331
  @PayloadRegistry.register
176
332
  class LoadWorkflowMetadataResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure):
177
- pass
333
+ """Workflow metadata load failed. Common causes: file not found, invalid format, parse error."""
178
334
 
179
335
 
180
336
  @dataclass
181
337
  @PayloadRegistry.register
182
338
  class PublishWorkflowRequest(RequestPayload):
339
+ """Publish a workflow for distribution.
340
+
341
+ Use when: Sharing workflows with others, creating workflow packages,
342
+ distributing workflow templates, workflow publishing.
343
+
344
+ Results: PublishWorkflowResultSuccess (with file path) | PublishWorkflowResultFailure (publish error)
345
+ """
346
+
183
347
  workflow_name: str
348
+ publisher_name: str
184
349
 
185
350
 
186
351
  @dataclass
187
352
  @PayloadRegistry.register
188
353
  class PublishWorkflowResultSuccess(ResultPayloadSuccess):
189
- workflow_id: str
354
+ """Workflow published successfully.
355
+
356
+ Args:
357
+ published_workflow_file_path: Path to the published workflow file
358
+ """
359
+
360
+ published_workflow_file_path: str
190
361
 
191
362
 
192
363
  @dataclass
193
364
  @PayloadRegistry.register
194
365
  class PublishWorkflowResultFailure(ResultPayloadFailure):
195
- pass
366
+ """Workflow publish failed. Common causes: workflow not found, publish error, file system error."""