griptape-nodes 0.63.9__tar.gz → 0.64.0__tar.gz

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 (271) hide show
  1. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/PKG-INFO +3 -1
  2. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/README.md +1 -0
  3. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/pyproject.toml +2 -1
  4. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/node_executor.py +95 -171
  5. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/connections.py +51 -2
  6. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/flow.py +3 -3
  7. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/node_types.py +330 -202
  8. griptape_nodes-0.64.0/src/griptape_nodes/exe_types/param_components/artifact_url/__init__.py +1 -0
  9. griptape_nodes-0.64.0/src/griptape_nodes/exe_types/param_components/artifact_url/public_artifact_url_parameter.py +155 -0
  10. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/progress_bar_component.py +1 -1
  11. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_string.py +27 -0
  12. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/machines/control_flow.py +64 -203
  13. griptape_nodes-0.64.0/src/griptape_nodes/machines/dag_builder.py +284 -0
  14. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/machines/parallel_resolution.py +9 -236
  15. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/machines/sequential_resolution.py +133 -11
  16. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/agent_events.py +2 -0
  17. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/flow_events.py +5 -6
  18. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/node_events.py +151 -1
  19. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/workflow_events.py +10 -0
  20. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/agent_manager.py +33 -1
  21. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/flow_manager.py +213 -290
  22. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_manager.py +24 -7
  23. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/node_manager.py +391 -77
  24. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/workflow_manager.py +45 -10
  25. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/servers/mcp.py +32 -0
  26. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/updater/__init__.py +1 -1
  27. griptape_nodes-0.63.9/src/griptape_nodes/machines/dag_builder.py +0 -437
  28. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/__init__.py +0 -0
  29. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/__main__.py +0 -0
  30. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/api_client/__init__.py +0 -0
  31. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/api_client/client.py +0 -0
  32. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/api_client/request_client.py +0 -0
  33. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/app/.python-version +0 -0
  34. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/app/__init__.py +0 -0
  35. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/app/app.py +0 -0
  36. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/app/watch.py +0 -0
  37. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/__init__.py +0 -0
  38. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/utils/__init__.py +0 -0
  39. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/utils/python_subprocess_executor.py +0 -0
  40. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  41. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +0 -0
  42. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +0 -0
  43. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +0 -0
  44. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +0 -0
  45. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +0 -0
  46. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -0
  47. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_publishers/__init__.py +0 -0
  48. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +0 -0
  49. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +0 -0
  50. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +0 -0
  51. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +0 -0
  52. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/__init__.py +0 -0
  53. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/__init__.py +0 -0
  54. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/config.py +0 -0
  55. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/engine.py +0 -0
  56. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/init.py +0 -0
  57. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/libraries.py +0 -0
  58. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/models.py +0 -0
  59. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/commands/self.py +0 -0
  60. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/main.py +0 -0
  61. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/cli/shared.py +0 -0
  62. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/__init__.py +0 -0
  63. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/directed_graph.py +0 -0
  64. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/__init__.py +0 -0
  65. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/core.py +0 -0
  66. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/exceptions.py +0 -0
  67. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/formats.py +0 -0
  68. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/matching.py +0 -0
  69. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/parsing.py +0 -0
  70. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/resolution.py +0 -0
  71. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/macro_parser/segments.py +0 -0
  72. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/__init__.py +0 -0
  73. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/default_project_template.py +0 -0
  74. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/defaults/README.md +0 -0
  75. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/directory.py +0 -0
  76. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/loader.py +0 -0
  77. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/project.py +0 -0
  78. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/situation.py +0 -0
  79. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/common/project_templates/validation.py +0 -0
  80. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/__init__.py +0 -0
  81. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/storage/__init__.py +0 -0
  82. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/storage/base_storage_driver.py +0 -0
  83. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +0 -0
  84. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/storage/local_storage_driver.py +0 -0
  85. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/storage/storage_backend.py +0 -0
  86. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/thread_storage/__init__.py +0 -0
  87. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py +0 -0
  88. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py +0 -0
  89. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py +0 -0
  90. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/drivers/thread_storage/thread_storage_backend.py +0 -0
  91. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/__init__.py +0 -0
  92. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/core_types.py +0 -0
  93. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/__init__.py +0 -0
  94. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/execution_status_component.py +0 -0
  95. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/huggingface/__init__.py +0 -0
  96. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_model_parameter.py +0 -0
  97. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_parameter.py +0 -0
  98. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py +0 -0
  99. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py +0 -0
  100. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/log_parameter.py +0 -0
  101. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_components/seed_parameter.py +0 -0
  102. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/__init__.py +0 -0
  103. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_audio.py +0 -0
  104. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_bool.py +0 -0
  105. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_float.py +0 -0
  106. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_image.py +0 -0
  107. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_int.py +0 -0
  108. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_number.py +0 -0
  109. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_three_d.py +0 -0
  110. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/param_types/parameter_video.py +0 -0
  111. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/exe_types/type_validator.py +0 -0
  112. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/machines/__init__.py +0 -0
  113. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/machines/fsm.py +0 -0
  114. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/mcp_server/__init__.py +0 -0
  115. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/node_library/__init__.py +0 -0
  116. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/node_library/advanced_node_library.py +0 -0
  117. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/node_library/library_registry.py +0 -0
  118. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/node_library/workflow_registry.py +0 -0
  119. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/py.typed +0 -0
  120. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/__init__.py +0 -0
  121. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/__init__.py +0 -0
  122. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/app_events.py +0 -0
  123. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/arbitrary_python_events.py +0 -0
  124. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/base_events.py +0 -0
  125. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/config_events.py +0 -0
  126. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/connection_events.py +0 -0
  127. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/context_events.py +0 -0
  128. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/execution_events.py +0 -0
  129. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  130. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/library_events.py +0 -0
  131. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/logger_events.py +0 -0
  132. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/mcp_events.py +0 -0
  133. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/model_events.py +0 -0
  134. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/object_events.py +0 -0
  135. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/os_events.py +0 -0
  136. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/parameter_events.py +0 -0
  137. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  138. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/project_events.py +0 -0
  139. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/resource_events.py +0 -0
  140. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/secrets_events.py +0 -0
  141. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/static_file_events.py +0 -0
  142. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/sync_events.py +0 -0
  143. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/validation_events.py +0 -0
  144. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/events/variable_events.py +0 -0
  145. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/griptape_nodes.py +0 -0
  146. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/__init__.py +0 -0
  147. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -0
  148. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/config_manager.py +0 -0
  149. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/context_manager.py +0 -0
  150. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +0 -0
  151. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/event_manager.py +0 -0
  152. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/__init__.py +0 -0
  153. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py +0 -0
  154. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py +0 -0
  155. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/after_library_callback_problem.py +0 -0
  156. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/before_library_callback_problem.py +0 -0
  157. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/create_config_category_problem.py +0 -0
  158. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/dependency_installation_failed_problem.py +0 -0
  159. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/deprecated_node_warning_problem.py +0 -0
  160. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_library_problem.py +0 -0
  161. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_node_registration_problem.py +0 -0
  162. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/engine_version_error_problem.py +0 -0
  163. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/insufficient_disk_space_problem.py +0 -0
  164. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/invalid_version_string_problem.py +0 -0
  165. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_json_decode_problem.py +0 -0
  166. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_load_exception_problem.py +0 -0
  167. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_not_found_problem.py +0 -0
  168. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_problem.py +0 -0
  169. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_exception_problem.py +0 -0
  170. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_validation_problem.py +0 -0
  171. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_deprecation_warning_problem.py +0 -0
  172. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_removed_problem.py +0 -0
  173. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_base_node_problem.py +0 -0
  174. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_found_problem.py +0 -0
  175. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_module_import_problem.py +0 -0
  176. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/sandbox_directory_missing_problem.py +0 -0
  177. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_incompatible_problem.py +0 -0
  178. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_warning_problem.py +0 -0
  179. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/update_config_category_problem.py +0 -0
  180. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/venv_creation_failed_problem.py +0 -0
  181. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/__init__.py +0 -0
  182. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/deprecated_node_in_workflow_problem.py +0 -0
  183. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_dependency_version_string_problem.py +0 -0
  184. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_library_version_string_problem.py +0 -0
  185. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_schema_problem.py +0 -0
  186. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_section_count_problem.py +0 -0
  187. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_toml_format_problem.py +0 -0
  188. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_not_registered_problem.py +0 -0
  189. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_below_required_problem.py +0 -0
  190. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_large_difference_problem.py +0 -0
  191. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_major_mismatch_problem.py +0 -0
  192. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_minor_difference_problem.py +0 -0
  193. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_creation_date_problem.py +0 -0
  194. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_last_modified_date_problem.py +0 -0
  195. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_toml_section_problem.py +0 -0
  196. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/node_type_not_found_problem.py +0 -0
  197. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_found_problem.py +0 -0
  198. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py +0 -0
  199. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py +0 -0
  200. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py +0 -0
  201. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py +0 -0
  202. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py +0 -0
  203. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py +0 -0
  204. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py +0 -0
  205. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py +0 -0
  206. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py +0 -0
  207. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py +0 -0
  208. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py +0 -0
  209. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py +0 -0
  210. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py +0 -0
  211. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py +0 -0
  212. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/mcp_manager.py +0 -0
  213. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/model_manager.py +0 -0
  214. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/object_manager.py +0 -0
  215. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  216. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/os_manager.py +0 -0
  217. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/project_manager.py +0 -0
  218. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_components/__init__.py +0 -0
  219. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_components/capability_field.py +0 -0
  220. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_components/comparator.py +0 -0
  221. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +0 -0
  222. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_type.py +0 -0
  223. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_manager.py +0 -0
  224. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_types/__init__.py +0 -0
  225. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +0 -0
  226. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/resource_types/os_resource.py +0 -0
  227. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/secrets_manager.py +0 -0
  228. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/session_manager.py +0 -0
  229. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/settings.py +0 -0
  230. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/static_files_manager.py +0 -0
  231. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/sync_manager.py +0 -0
  232. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/user_manager.py +0 -0
  233. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/variable_manager.py +0 -0
  234. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +0 -0
  235. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/retained_mode.py +0 -0
  236. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/utils/__init__.py +0 -0
  237. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  238. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/retained_mode/variable_types.py +0 -0
  239. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/servers/__init__.py +0 -0
  240. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/servers/static.py +0 -0
  241. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/__init__.py +0 -0
  242. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/add_param_button.py +0 -0
  243. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/button.py +0 -0
  244. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/clamp.py +0 -0
  245. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/color_picker.py +0 -0
  246. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/compare.py +0 -0
  247. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/compare_images.py +0 -0
  248. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/file_system_picker.py +0 -0
  249. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/minmax.py +0 -0
  250. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/multi_options.py +0 -0
  251. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/numbers_selector.py +0 -0
  252. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/options.py +0 -0
  253. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/slider.py +0 -0
  254. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/trait_registry.py +0 -0
  255. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/traits/traits.json +0 -0
  256. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/updater/__main__.py +0 -0
  257. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/__init__.py +0 -0
  258. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/async_utils.py +0 -0
  259. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/dict_utils.py +0 -0
  260. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/huggingface_utils.py +0 -0
  261. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/image_preview.py +0 -0
  262. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/metaclasses.py +0 -0
  263. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/uv_utils.py +0 -0
  264. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/utils/version_utils.py +0 -0
  265. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/__init__.py +0 -0
  266. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  267. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
  268. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +0 -0
  269. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/workflow_versions/__init__.py +0 -0
  270. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py +0 -0
  271. {griptape_nodes-0.63.9 → griptape_nodes-0.64.0}/src/griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.63.9
3
+ Version: 0.64.0
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -27,6 +27,7 @@ Requires-Dist: aiofiles>=25.1.0
27
27
  Requires-Dist: aioshutil>=1.5
28
28
  Requires-Dist: ruamel-yaml>=0.18.15
29
29
  Requires-Dist: asyncio-thread-runner>=1.0
30
+ Requires-Dist: portalocker>=2.10.0
30
31
  Requires-Dist: austin-dist>=3.7.0 ; extra == 'profiling'
31
32
  Requires-Python: >=3.12.0, <3.13
32
33
  Provides-Extra: profiling
@@ -55,6 +56,7 @@ This repository contains the Griptape Nodes Engine - the local component that ru
55
56
  - **📚 Full Documentation:** [docs.griptapenodes.com](https://docs.griptapenodes.com)
56
57
  - **⚙️ Installation:** [docs.griptapenodes.com/en/stable/installation/](https://docs.griptapenodes.com/en/latest/installation/)
57
58
  - **🔧 Engine Configuration:** [docs.griptapenodes.com/en/stable/configuration/](https://docs.griptapenodes.com/en/latest/configuration/)
59
+ - **📋 Migration Guide:** [MIGRATION.md](MIGRATION.md) - Guide for migrating from deprecated nodes
58
60
 
59
61
  **🧩 Extending Griptape Nodes:**
60
62
 
@@ -21,6 +21,7 @@ This repository contains the Griptape Nodes Engine - the local component that ru
21
21
  - **📚 Full Documentation:** [docs.griptapenodes.com](https://docs.griptapenodes.com)
22
22
  - **⚙️ Installation:** [docs.griptapenodes.com/en/stable/installation/](https://docs.griptapenodes.com/en/latest/installation/)
23
23
  - **🔧 Engine Configuration:** [docs.griptapenodes.com/en/stable/configuration/](https://docs.griptapenodes.com/en/latest/configuration/)
24
+ - **📋 Migration Guide:** [MIGRATION.md](MIGRATION.md) - Guide for migrating from deprecated nodes
24
25
 
25
26
  **🧩 Extending Griptape Nodes:**
26
27
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "griptape-nodes"
3
- version = "0.63.9"
3
+ version = "0.64.0"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12.0, <3.13"
@@ -31,6 +31,7 @@ dependencies = [
31
31
  "aioshutil>=1.5",
32
32
  "ruamel.yaml>=0.18.15",
33
33
  "asyncio-thread-runner>=1.0",
34
+ "portalocker>=2.10.0",
34
35
  ]
35
36
 
36
37
  [project.optional-dependencies]
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import ast
4
4
  import logging
5
5
  import pickle
6
+ from dataclasses import dataclass
6
7
  from pathlib import Path
7
8
  from typing import TYPE_CHECKING, Any, NamedTuple
8
9
 
@@ -15,8 +16,7 @@ from griptape_nodes.exe_types.node_types import (
15
16
  PRIVATE_EXECUTION,
16
17
  BaseNode,
17
18
  EndNode,
18
- NodeGroup,
19
- NodeGroupProxyNode,
19
+ NodeGroupNode,
20
20
  StartNode,
21
21
  )
22
22
  from griptape_nodes.node_library.library_registry import Library, LibraryRegistry
@@ -30,6 +30,7 @@ from griptape_nodes.retained_mode.events.workflow_events import (
30
30
  DeleteWorkflowResultFailure,
31
31
  LoadWorkflowMetadata,
32
32
  LoadWorkflowMetadataResultSuccess,
33
+ PublishWorkflowRegisteredEventData,
33
34
  PublishWorkflowRequest,
34
35
  SaveWorkflowFileFromSerializedFlowRequest,
35
36
  SaveWorkflowFileFromSerializedFlowResultSuccess,
@@ -37,13 +38,20 @@ from griptape_nodes.retained_mode.events.workflow_events import (
37
38
  from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
38
39
 
39
40
  if TYPE_CHECKING:
40
- from griptape_nodes.exe_types.connections import Connections
41
41
  from griptape_nodes.retained_mode.events.node_events import SerializedNodeCommands
42
42
  from griptape_nodes.retained_mode.managers.library_manager import LibraryManager
43
43
 
44
44
  logger = logging.getLogger("griptape_nodes")
45
45
 
46
46
 
47
+ @dataclass
48
+ class PublishWorkflowStartEndNodes:
49
+ start_flow_node_type: str
50
+ start_flow_node_library_name: str
51
+ end_flow_node_type: str
52
+ end_flow_node_library_name: str
53
+
54
+
47
55
  class PublishLocalWorkflowResult(NamedTuple):
48
56
  """Result from publishing a local workflow."""
49
57
 
@@ -72,14 +80,21 @@ class NodeExecutor:
72
80
  node: The BaseNode to execute
73
81
  library_name: The library that the execute method should come from.
74
82
  """
75
- execution_type = node.get_parameter_value(node.execution_environment.name)
76
-
77
- if execution_type == LOCAL_EXECUTION:
78
- await node.aprocess()
79
- elif execution_type == PRIVATE_EXECUTION:
80
- await self._execute_private_workflow(node)
81
- else:
83
+ if isinstance(node, NodeGroupNode):
84
+ execution_type = node.get_parameter_value(node.execution_environment.name)
85
+ if execution_type == LOCAL_EXECUTION:
86
+ # Just execute the node normally! This means we aren't doing any special packaging.
87
+ await node.aprocess()
88
+ return
89
+ if execution_type == PRIVATE_EXECUTION:
90
+ # Package the flow and run it in a subprocess.
91
+ await self._execute_private_workflow(node)
92
+ return
93
+ # If it isn't Local or Private, it must be a library name. We'll try to execute it, and if the library name doesn't exist, it'll raise an error.
82
94
  await self._execute_library_workflow(node, execution_type)
95
+ return
96
+ # We default to local execution if it is not a NodeGroupNode!
97
+ await node.aprocess()
83
98
 
84
99
  async def _execute_and_apply_workflow(
85
100
  self,
@@ -109,6 +124,9 @@ class NodeExecutor:
109
124
  workflow_result = None
110
125
  try:
111
126
  result = await self._publish_local_workflow(node)
127
+ if result is None:
128
+ # Length of list is 0, no node names in group.
129
+ return
112
130
  workflow_result = result.workflow_result
113
131
  except Exception as e:
114
132
  logger.exception(
@@ -169,6 +187,9 @@ class NodeExecutor:
169
187
 
170
188
  try:
171
189
  result = await self._publish_local_workflow(node, library=library)
190
+ if result is None:
191
+ # Length of list is 0, no node names in group.
192
+ return
172
193
  workflow_result = result.workflow_result
173
194
  except Exception as e:
174
195
  logger.exception(
@@ -221,47 +242,74 @@ class NodeExecutor:
221
242
  published_filename = published_workflow_filename.stem
222
243
  await self._delete_workflow(workflow_name=published_filename, workflow_path=published_workflow_filename)
223
244
 
224
- async def _publish_local_workflow(
225
- self, node: BaseNode, library: Library | None = None
226
- ) -> PublishLocalWorkflowResult:
227
- """Package and publish a workflow for subprocess execution.
228
-
229
- Returns:
230
- PublishLocalWorkflowResult containing workflow_result, file_name, and output_parameter_prefix
231
- """
232
- sanitized_node_name = node.name.replace(" ", "_")
233
- output_parameter_prefix = f"{sanitized_node_name}_packaged_node_"
234
- # We have to make our defaults strings because the PackageNodesAsSerializedFlowRequest doesn't accept None types.
245
+ async def _get_workflow_start_end_nodes(self, library: Library | None) -> PublishWorkflowStartEndNodes:
235
246
  library_name = "Griptape Nodes Library"
236
247
  start_node_type = "StartFlow"
237
248
  end_node_type = "EndFlow"
249
+
238
250
  if library is not None:
251
+ # Attempt to get start and end nodes from the registered handler
252
+ library_name = library.get_library_data().name
253
+ registered_event_handler = self.get_workflow_handler(library_name)
254
+ registered_event_data = registered_event_handler.event_data
255
+ if registered_event_data is not None and isinstance(
256
+ registered_event_data, PublishWorkflowRegisteredEventData
257
+ ):
258
+ return PublishWorkflowStartEndNodes(
259
+ start_flow_node_type=registered_event_data.start_flow_node_type,
260
+ start_flow_node_library_name=registered_event_data.start_flow_node_library_name,
261
+ end_flow_node_type=registered_event_data.end_flow_node_type,
262
+ end_flow_node_library_name=registered_event_data.end_flow_node_library_name,
263
+ )
264
+
239
265
  start_nodes = library.get_nodes_by_base_type(StartNode)
240
266
  end_nodes = library.get_nodes_by_base_type(EndNode)
241
267
  if len(start_nodes) > 0 and len(end_nodes) > 0:
242
268
  start_node_type = start_nodes[0]
243
269
  end_node_type = end_nodes[0]
244
270
  library_name = library.get_library_data().name
271
+
272
+ return PublishWorkflowStartEndNodes(
273
+ start_flow_node_type=start_node_type,
274
+ start_flow_node_library_name=library_name,
275
+ end_flow_node_type=end_node_type,
276
+ end_flow_node_library_name=library_name,
277
+ )
278
+
279
+ async def _publish_local_workflow(
280
+ self, node: BaseNode, library: Library | None = None
281
+ ) -> PublishLocalWorkflowResult | None:
282
+ """Package and publish a workflow for subprocess execution.
283
+
284
+ Returns:
285
+ PublishLocalWorkflowResult containing workflow_result, file_name, and output_parameter_prefix
286
+ """
287
+ sanitized_node_name = node.name.replace(" ", "_")
288
+ output_parameter_prefix = f"{sanitized_node_name}_packaged_node_"
289
+ # We have to make our defaults strings because the PackageNodesAsSerializedFlowRequest doesn't accept None types.
290
+ library_name = library.get_library_data().name if library is not None else "Griptape Nodes Library"
291
+ workflow_start_end_nodes = await self._get_workflow_start_end_nodes(library)
292
+
245
293
  sanitized_library_name = library_name.replace(" ", "_")
246
- # If we are packaging a NodeGroupProxyNode, that means that we are packaging multiple nodes together, so we have to get the list of nodes from the proxy node.
247
- if isinstance(node, NodeGroupProxyNode):
248
- node_names = list(node.node_group_data.nodes.keys())
294
+ # If we are packaging a NodeGroupNode, that means that we are packaging multiple nodes together, so we have to get the list of nodes from the group node.
295
+ if isinstance(node, NodeGroupNode):
296
+ node_names = list(node.get_all_nodes().keys())
249
297
  else:
250
298
  # Otherwise, it's a list of one node!
251
299
  node_names = [node.name]
252
300
 
253
- # Pass the proxy node if this is a NodeGroupProxyNode so serialization can use stored connections
254
- proxy_node_for_packaging = node if isinstance(node, NodeGroupProxyNode) else None
301
+ if len(node_names) == 0:
302
+ return None
255
303
 
256
304
  request = PackageNodesAsSerializedFlowRequest(
257
305
  node_names=node_names,
258
- start_node_type=start_node_type,
259
- end_node_type=end_node_type,
260
- start_end_specific_library_name=library_name,
306
+ start_node_type=workflow_start_end_nodes.start_flow_node_type,
307
+ end_node_type=workflow_start_end_nodes.end_flow_node_type,
308
+ start_node_library_name=workflow_start_end_nodes.start_flow_node_library_name,
309
+ end_node_library_name=workflow_start_end_nodes.end_flow_node_library_name,
261
310
  output_parameter_prefix=output_parameter_prefix,
262
311
  entry_control_node_name=None,
263
312
  entry_control_parameter_name=None,
264
- proxy_node=proxy_node_for_packaging,
265
313
  )
266
314
  package_result = GriptapeNodes.handle_request(request)
267
315
  if not isinstance(package_result, PackageNodesAsSerializedFlowResultSuccess):
@@ -420,7 +468,7 @@ class NodeExecutor:
420
468
  return stored_value
421
469
  return stored_value
422
470
 
423
- def _apply_parameter_values_to_node( # noqa: C901
471
+ def _apply_parameter_values_to_node(
424
472
  self,
425
473
  node: BaseNode,
426
474
  parameter_output_values: dict[str, Any],
@@ -430,7 +478,7 @@ class NodeExecutor:
430
478
 
431
479
  Sets parameter values on the node and updates parameter_output_values dictionary.
432
480
  Uses parameter_name_mappings from package_result to map packaged parameters back to original nodes.
433
- Works for both single-node and multi-node packages.
481
+ Works for both single-node and multi-node packages (NodeGroupNode).
434
482
  """
435
483
  # If the packaged flow fails, the End Flow Node in the library published workflow will have entered from 'failed'
436
484
  if "failed" in parameter_output_values and parameter_output_values["failed"] == CONTROL_INPUT_PARAMETER:
@@ -448,26 +496,26 @@ class NodeExecutor:
448
496
  target_node_name = original_node_param.node_name
449
497
  target_param_name = original_node_param.parameter_name
450
498
 
451
- # For multi-node packages, get the target node from the group
452
- # For single-node packages, use the node itself
453
- if isinstance(node, NodeGroupProxyNode):
454
- if target_node_name not in node.node_group_data.nodes:
455
- msg = f"Target node '{target_node_name}' not found in node group for proxy node '{node.name}'. Available nodes: {list(node.node_group_data.nodes.keys())}"
456
- raise RuntimeError(msg)
457
- target_node = node.node_group_data.nodes[target_node_name]
499
+ # Determine the target node - if this is a NodeGroupNode, look up the child node
500
+ if isinstance(node, NodeGroupNode):
501
+ if target_node_name not in node.nodes:
502
+ logger.warning(
503
+ "Node '%s' not found in NodeGroupNode '%s', skipping value application",
504
+ target_node_name,
505
+ node.name,
506
+ )
507
+ continue
508
+ target_node = node.nodes[target_node_name]
458
509
  else:
459
510
  target_node = node
460
511
 
461
512
  # Get the parameter from the target node
462
513
  target_param = target_node.get_parameter_by_name(target_param_name)
463
-
464
- # Skip if parameter not found or is special parameter (execution_environment, node_group)
465
- if target_param is None or target_param in (
466
- target_node.execution_environment,
467
- target_node.node_group,
468
- ):
469
- logger.debug(
470
- "Skipping special or missing parameter '%s' on node '%s'", target_param_name, target_node_name
514
+ if target_param is None:
515
+ logger.warning(
516
+ "Parameter '%s' not found on node '%s', skipping value application",
517
+ target_param_name,
518
+ target_node_name,
471
519
  )
472
520
  continue
473
521
 
@@ -476,16 +524,6 @@ class NodeExecutor:
476
524
  target_node.set_parameter_value(target_param_name, param_value)
477
525
  target_node.parameter_output_values[target_param_name] = param_value
478
526
 
479
- # For multi-node packages, also set the value on the proxy node's corresponding output parameter
480
- if isinstance(node, NodeGroupProxyNode):
481
- sanitized_node_name = target_node_name.replace(" ", "_")
482
- proxy_param_name = f"{sanitized_node_name}__{target_param_name}"
483
- proxy_param = node.get_parameter_by_name(proxy_param_name)
484
- if proxy_param is not None:
485
- if target_param.type != ParameterTypeBuiltin.CONTROL_TYPE:
486
- node.set_parameter_value(proxy_param_name, param_value)
487
- node.parameter_output_values[proxy_param_name] = param_value
488
-
489
527
  logger.debug(
490
528
  "Set parameter '%s' on node '%s' to value: %s",
491
529
  target_param_name,
@@ -526,117 +564,3 @@ class NodeExecutor:
526
564
  except ValueError:
527
565
  storage_backend = StorageBackend.LOCAL
528
566
  return storage_backend
529
-
530
- def _toggle_directional_control_connections(
531
- self,
532
- proxy_node: BaseNode,
533
- node_group: NodeGroup,
534
- connections: Connections,
535
- *,
536
- restore_to_original: bool,
537
- is_incoming: bool,
538
- ) -> None:
539
- """Toggle control connections between proxy and original nodes for a specific direction.
540
-
541
- When a NodeGroupProxyNode is created, control connections from/to the original nodes are
542
- redirected to/from the proxy node. Before packaging the flow for execution, we need to
543
- temporarily restore these connections back to the original nodes so the packaged flow
544
- has the correct control flow structure. After packaging, we toggle them back to the proxy.
545
-
546
- Args:
547
- proxy_node: The proxy node containing the node group
548
- node_group: The node group data containing original nodes and connection mappings
549
- connections: The connections manager that tracks all connections via indexes
550
- restore_to_original: If True, restore connections to original nodes (for packaging);
551
- if False, remap connections to proxy (after packaging)
552
- is_incoming: If True, handle incoming connections (target_node/target_parameter);
553
- if False, handle outgoing connections (source_node/source_parameter)
554
- """
555
- # Select the appropriate connection list, mapping, and index based on direction
556
- if is_incoming:
557
- # Incoming: connections pointing TO nodes in this group
558
- connection_list = node_group.external_incoming_connections
559
- original_nodes_map = node_group.original_incoming_targets
560
- index = connections.incoming_index
561
- else:
562
- # Outgoing: connections originating FROM nodes in this group
563
- connection_list = node_group.external_outgoing_connections
564
- original_nodes_map = node_group.original_outgoing_sources
565
- index = connections.outgoing_index
566
-
567
- for conn in connection_list:
568
- # Get the parameter based on connection direction (target for incoming, source for outgoing)
569
- parameter = conn.target_parameter if is_incoming else conn.source_parameter
570
-
571
- # Only toggle control flow connections, skip data connections
572
- if parameter.type != ParameterTypeBuiltin.CONTROL_TYPE:
573
- continue
574
-
575
- conn_id = id(conn)
576
- original_node = original_nodes_map.get(conn_id)
577
-
578
- # Validate we have the original node mapping
579
- # Incoming connections must have originals (error if missing)
580
- # Outgoing connections may not have originals in some cases (skip if missing)
581
- if original_node is None:
582
- if is_incoming:
583
- msg = f"No original target found for connection {conn_id} in node group '{node_group.group_id}'"
584
- raise RuntimeError(msg)
585
- continue
586
-
587
- # Build the proxy parameter name: {sanitized_node_name}__{parameter_name}
588
- # Example: "My Node" with param "enter" -> "My_Node__enter"
589
- sanitized_node_name = original_node.name.replace(" ", "_")
590
- proxy_param_name = f"{sanitized_node_name}__{parameter.name}"
591
-
592
- # Determine the direction of the toggle
593
- if restore_to_original:
594
- # Restore: proxy -> original (for packaging)
595
- # Before: External -> Proxy -> (internal nodes)
596
- # After: External -> Original node in group
597
- from_node = proxy_node
598
- from_param = proxy_param_name
599
- to_node = original_node
600
- to_param = parameter.name
601
- else:
602
- # Remap: original -> proxy (after packaging)
603
- # Before: External -> Original node in group
604
- # After: External -> Proxy -> (internal nodes)
605
- from_node = original_node
606
- from_param = parameter.name
607
- to_node = proxy_node
608
- to_param = proxy_param_name
609
-
610
- # Step 1: Remove connection reference from the old node's index
611
- if from_node.name in index and from_param in index[from_node.name]:
612
- index[from_node.name][from_param].remove(conn_id)
613
-
614
- # Step 2: Update the connection object to point to the new node
615
- if is_incoming:
616
- conn.target_node = to_node
617
- else:
618
- conn.source_node = to_node
619
-
620
- # Step 3: Add connection reference to the new node's index
621
- index.setdefault(to_node.name, {}).setdefault(to_param, []).append(conn_id)
622
-
623
- def _toggle_control_connections(self, proxy_node: BaseNode, *, restore_to_original: bool) -> None:
624
- """Toggle control connections between proxy node and original nodes.
625
-
626
- Args:
627
- proxy_node: The proxy node containing the node group
628
- restore_to_original: If True, restore connections from proxy to original nodes.
629
- If False, remap connections from original nodes back to proxy.
630
- """
631
- if not isinstance(proxy_node, NodeGroupProxyNode):
632
- return
633
- node_group = proxy_node.node_group_data
634
- connections = GriptapeNodes.FlowManager().get_connections()
635
-
636
- # Toggle both incoming and outgoing connections
637
- self._toggle_directional_control_connections(
638
- proxy_node, node_group, connections, restore_to_original=restore_to_original, is_incoming=True
639
- )
640
- self._toggle_directional_control_connections(
641
- proxy_node, node_group, connections, restore_to_original=restore_to_original, is_incoming=False
642
- )
@@ -33,7 +33,7 @@ class Connections:
33
33
  source_parameter: Parameter,
34
34
  target_node: BaseNode,
35
35
  target_parameter: Parameter,
36
- ) -> bool:
36
+ ) -> Connection:
37
37
  if ParameterMode.OUTPUT not in source_parameter.get_mode():
38
38
  errormsg = f"Output Connection not allowed on Parameter '{source_parameter.name}'."
39
39
  raise ValueError(errormsg)
@@ -57,7 +57,7 @@ class Connections:
57
57
  self.incoming_index.setdefault(target_node.name, {}).setdefault(target_parameter.name, []).append(
58
58
  connection_id
59
59
  )
60
- return True
60
+ return connection
61
61
  msg = "Connection not allowed because of multiple connections on the same parameter input or control output parameter"
62
62
  raise ValueError(msg)
63
63
 
@@ -183,6 +183,29 @@ class Connections:
183
183
  return connection.source_node, connection.source_parameter
184
184
  return None
185
185
 
186
+ def remove_connection_by_object(self, conn: Connection) -> bool:
187
+ """Remove a connection from the manager by Connection object.
188
+
189
+ Args:
190
+ conn: The Connection object to remove
191
+
192
+ Returns:
193
+ True if connection was removed, False if not found
194
+ """
195
+ conn_id = id(conn)
196
+
197
+ if conn_id not in self.connections:
198
+ return False
199
+
200
+ self._remove_connection(
201
+ conn_id,
202
+ conn.source_node.name,
203
+ conn.source_parameter.name,
204
+ conn.target_node.name,
205
+ conn.target_parameter.name,
206
+ )
207
+ return True
208
+
186
209
  def remove_connection(
187
210
  self, source_node: str, source_parameter: str, target_node: str, target_parameter: str
188
211
  ) -> bool:
@@ -228,6 +251,32 @@ class Connections:
228
251
  # delete from the connections dictionary
229
252
  del self.connections[connection_id]
230
253
 
254
+ def get_connections_between_nodes(self, node_names: set[str]) -> list[Connection]:
255
+ """Get all connections where both source and target are in the provided set.
256
+
257
+ Args:
258
+ node_names: Set of node names to check for internal connections
259
+
260
+ Returns:
261
+ List of connections that have both endpoints in the node_names set
262
+ """
263
+ internal_connections = []
264
+
265
+ for node_name in node_names:
266
+ if node_name not in self.outgoing_index:
267
+ continue
268
+
269
+ for connection_ids in self.outgoing_index[node_name].values():
270
+ for conn_id in connection_ids:
271
+ if conn_id not in self.connections:
272
+ continue
273
+ conn = self.connections[conn_id]
274
+
275
+ if conn.target_node.name in node_names:
276
+ internal_connections.append(conn)
277
+
278
+ return internal_connections
279
+
231
280
  # Used to check data connections for all future nodes to be BAD!
232
281
  def unresolve_future_nodes(self, node: BaseNode) -> None:
233
282
  # Recursive loop
@@ -7,7 +7,7 @@ if TYPE_CHECKING:
7
7
  from queue import Queue
8
8
 
9
9
  from griptape_nodes.exe_types.core_types import Parameter
10
- from griptape_nodes.exe_types.node_types import BaseNode
10
+ from griptape_nodes.exe_types.node_types import BaseNode, Connection
11
11
 
12
12
 
13
13
  logger = logging.getLogger("griptape_nodes")
@@ -43,7 +43,7 @@ class ControlFlow:
43
43
  source_parameter: Parameter,
44
44
  target_node: BaseNode,
45
45
  target_parameter: Parameter,
46
- ) -> bool:
46
+ ) -> Connection | None:
47
47
  if source_node.name in self.nodes and target_node.name in self.nodes:
48
48
  from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
49
49
 
@@ -52,7 +52,7 @@ class ControlFlow:
52
52
  .get_connections()
53
53
  .add_connection(source_node, source_parameter, target_node, target_parameter)
54
54
  )
55
- return False
55
+ return None
56
56
 
57
57
  def remove_connection(
58
58
  self, source_node: BaseNode, source_parameter: Parameter, target_node: BaseNode, target_parameter: Parameter