griptape-nodes 0.58.1__py3-none-any.whl → 0.59.1__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 (30) hide show
  1. griptape_nodes/bootstrap/utils/python_subprocess_executor.py +2 -2
  2. griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +0 -5
  3. griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +9 -5
  4. griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +0 -1
  5. griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +1 -3
  6. griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +1 -1
  7. griptape_nodes/cli/commands/init.py +53 -7
  8. griptape_nodes/cli/shared.py +1 -0
  9. griptape_nodes/common/node_executor.py +218 -42
  10. griptape_nodes/exe_types/core_types.py +46 -0
  11. griptape_nodes/exe_types/node_types.py +272 -0
  12. griptape_nodes/machines/control_flow.py +222 -16
  13. griptape_nodes/machines/dag_builder.py +212 -1
  14. griptape_nodes/machines/parallel_resolution.py +237 -4
  15. griptape_nodes/node_library/workflow_registry.py +1 -1
  16. griptape_nodes/retained_mode/events/execution_events.py +5 -4
  17. griptape_nodes/retained_mode/events/flow_events.py +17 -67
  18. griptape_nodes/retained_mode/events/parameter_events.py +122 -1
  19. griptape_nodes/retained_mode/managers/event_manager.py +17 -13
  20. griptape_nodes/retained_mode/managers/flow_manager.py +316 -573
  21. griptape_nodes/retained_mode/managers/library_manager.py +32 -20
  22. griptape_nodes/retained_mode/managers/model_manager.py +19 -8
  23. griptape_nodes/retained_mode/managers/node_manager.py +463 -3
  24. griptape_nodes/retained_mode/managers/object_manager.py +2 -2
  25. griptape_nodes/retained_mode/managers/workflow_manager.py +37 -46
  26. griptape_nodes/retained_mode/retained_mode.py +297 -3
  27. {griptape_nodes-0.58.1.dist-info → griptape_nodes-0.59.1.dist-info}/METADATA +3 -2
  28. {griptape_nodes-0.58.1.dist-info → griptape_nodes-0.59.1.dist-info}/RECORD +30 -30
  29. {griptape_nodes-0.58.1.dist-info → griptape_nodes-0.59.1.dist-info}/WHEEL +1 -1
  30. {griptape_nodes-0.58.1.dist-info → griptape_nodes-0.59.1.dist-info}/entry_points.txt +0 -0
@@ -15,9 +15,9 @@ from griptape_nodes.retained_mode.events.base_events import (
15
15
  EventResultFailure,
16
16
  EventResultSuccess,
17
17
  FlushParameterChangesRequest,
18
+ FlushParameterChangesResultSuccess,
18
19
  RequestPayload,
19
20
  ResultPayload,
20
- WorkflowAlteredMixin,
21
21
  )
22
22
  from griptape_nodes.utils.async_utils import call_function
23
23
 
@@ -28,6 +28,18 @@ if TYPE_CHECKING:
28
28
  RP = TypeVar("RP", bound=RequestPayload, default=RequestPayload)
29
29
  AP = TypeVar("AP", bound=AppPayload, default=AppPayload)
30
30
 
31
+ # Result types that should NOT trigger a flush request.
32
+ #
33
+ # After most requests complete, we queue a FlushParameterChangesRequest to flush any tracked
34
+ # parameter changes to the UI. However, when the FlushParameterChangesRequest itself completes,
35
+ # it returns a FlushParameterChangesResultSuccess. If we don't exclude this result type, it would
36
+ # trigger another FlushParameterChangesRequest, which would return another FlushParameterChangesResultSuccess,
37
+ # creating an infinite loop of flush requests.
38
+ #
39
+ # Add result types to this set if they should never trigger a flush (typically because they ARE
40
+ # the flush operation itself, or other internal operations that don't modify workflow state).
41
+ RESULT_TYPES_THAT_SKIP_FLUSH = {FlushParameterChangesResultSuccess}
42
+
31
43
 
32
44
  class ResultContext(TypedDict, total=False):
33
45
  response_topic: str | None
@@ -223,13 +235,9 @@ class EventManager:
223
235
  # Actually make the handler callback (support both sync and async):
224
236
  result_payload: ResultPayload = await call_function(callback, request)
225
237
 
226
- # Handle workflow alteration events for async context
238
+ # Queue flush request for async context (unless result type should skip flush)
227
239
  with operation_depth_mgr:
228
- if (
229
- result_payload.succeeded()
230
- and isinstance(result_payload, WorkflowAlteredMixin)
231
- and not self._flush_in_queue
232
- ):
240
+ if not self._flush_in_queue and type(result_payload) not in RESULT_TYPES_THAT_SKIP_FLUSH:
233
241
  await self.aput_event(EventRequest(request=FlushParameterChangesRequest()))
234
242
  self._flush_in_queue = True
235
243
 
@@ -276,13 +284,9 @@ class EventManager:
276
284
  else:
277
285
  result_payload: ResultPayload = callback(request)
278
286
 
279
- # Handle workflow alteration events for sync context
287
+ # Queue flush request for sync context (unless result type should skip flush)
280
288
  with operation_depth_mgr:
281
- if (
282
- result_payload.succeeded()
283
- and isinstance(result_payload, WorkflowAlteredMixin)
284
- and not self._flush_in_queue
285
- ):
289
+ if not self._flush_in_queue and type(result_payload) not in RESULT_TYPES_THAT_SKIP_FLUSH:
286
290
  self.put_event(EventRequest(request=FlushParameterChangesRequest()))
287
291
  self._flush_in_queue = True
288
292