griptape-nodes 0.56.0__tar.gz → 0.57.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 (176) hide show
  1. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/PKG-INFO +2 -2
  2. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/pyproject.toml +4 -3
  3. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/app/app.py +10 -15
  4. griptape_nodes-0.57.0/src/griptape_nodes/app/watch.py +54 -0
  5. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/utils/__init__.py +1 -0
  6. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/utils/python_subprocess_executor.py +122 -0
  7. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +418 -0
  8. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +37 -8
  9. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +326 -0
  10. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +1 -0
  11. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +51 -0
  12. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_publishers/__init__.py +1 -0
  13. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +43 -0
  14. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +84 -0
  15. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +1 -0
  16. griptape_nodes-0.57.0/src/griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +54 -0
  17. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/engine.py +4 -15
  18. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/main.py +6 -1
  19. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/core_types.py +26 -0
  20. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/node_types.py +116 -1
  21. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/agent_events.py +2 -0
  22. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/base_events.py +18 -17
  23. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/execution_events.py +3 -1
  24. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/flow_events.py +5 -7
  25. griptape_nodes-0.57.0/src/griptape_nodes/retained_mode/events/mcp_events.py +363 -0
  26. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/node_events.py +3 -4
  27. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/griptape_nodes.py +8 -0
  28. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/agent_manager.py +67 -4
  29. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/event_manager.py +31 -13
  30. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/flow_manager.py +76 -44
  31. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_manager.py +7 -9
  32. griptape_nodes-0.57.0/src/griptape_nodes/retained_mode/managers/mcp_manager.py +364 -0
  33. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/node_manager.py +12 -1
  34. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/settings.py +40 -0
  35. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/workflow_manager.py +94 -8
  36. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/multi_options.py +5 -1
  37. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/options.py +10 -2
  38. griptape_nodes-0.56.0/src/griptape_nodes/app/watch.py +0 -86
  39. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/README.md +0 -0
  40. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/__init__.py +0 -0
  41. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/__main__.py +0 -0
  42. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/app/.python-version +0 -0
  43. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/app/__init__.py +0 -0
  44. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/bootstrap/__init__.py +0 -0
  45. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  46. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -0
  47. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/__init__.py +0 -0
  48. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/__init__.py +0 -0
  49. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/config.py +0 -0
  50. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/init.py +0 -0
  51. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/libraries.py +0 -0
  52. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/models.py +0 -0
  53. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/commands/self.py +0 -0
  54. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/cli/shared.py +0 -0
  55. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/common/__init__.py +0 -0
  56. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/common/directed_graph.py +0 -0
  57. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/__init__.py +0 -0
  58. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/storage/__init__.py +0 -0
  59. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/storage/base_storage_driver.py +0 -0
  60. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +0 -0
  61. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/storage/local_storage_driver.py +0 -0
  62. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/drivers/storage/storage_backend.py +0 -0
  63. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/__init__.py +0 -0
  64. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/connections.py +0 -0
  65. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/flow.py +0 -0
  66. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/param_components/__init__.py +0 -0
  67. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/param_components/execution_status_component.py +0 -0
  68. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/exe_types/type_validator.py +0 -0
  69. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/__init__.py +0 -0
  70. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/control_flow.py +0 -0
  71. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/dag_builder.py +0 -0
  72. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/fsm.py +0 -0
  73. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/parallel_resolution.py +0 -0
  74. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/machines/sequential_resolution.py +0 -0
  75. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/mcp_server/__init__.py +0 -0
  76. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/node_library/__init__.py +0 -0
  77. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/node_library/advanced_node_library.py +0 -0
  78. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/node_library/library_registry.py +0 -0
  79. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/node_library/workflow_registry.py +0 -0
  80. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/py.typed +0 -0
  81. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/__init__.py +0 -0
  82. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/__init__.py +0 -0
  83. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/app_events.py +0 -0
  84. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/arbitrary_python_events.py +0 -0
  85. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/config_events.py +0 -0
  86. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/connection_events.py +0 -0
  87. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/context_events.py +0 -0
  88. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  89. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/library_events.py +0 -0
  90. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/logger_events.py +0 -0
  91. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/model_events.py +0 -0
  92. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/object_events.py +0 -0
  93. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/os_events.py +0 -0
  94. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/parameter_events.py +0 -0
  95. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  96. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/resource_events.py +0 -0
  97. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/secrets_events.py +0 -0
  98. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/static_file_events.py +0 -0
  99. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/sync_events.py +0 -0
  100. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/validation_events.py +0 -0
  101. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/variable_events.py +0 -0
  102. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/events/workflow_events.py +0 -0
  103. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/__init__.py +0 -0
  104. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -0
  105. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/config_manager.py +0 -0
  106. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/context_manager.py +0 -0
  107. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +0 -0
  108. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py +0 -0
  109. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py +0 -0
  110. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py +0 -0
  111. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py +0 -0
  112. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py +0 -0
  113. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py +0 -0
  114. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py +0 -0
  115. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py +0 -0
  116. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py +0 -0
  117. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py +0 -0
  118. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py +0 -0
  119. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py +0 -0
  120. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/model_manager.py +0 -0
  121. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/object_manager.py +0 -0
  122. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  123. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/os_manager.py +0 -0
  124. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_components/__init__.py +0 -0
  125. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_components/capability_field.py +0 -0
  126. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_components/comparator.py +0 -0
  127. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +0 -0
  128. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_type.py +0 -0
  129. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_manager.py +0 -0
  130. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_types/__init__.py +0 -0
  131. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +0 -0
  132. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/resource_types/os_resource.py +0 -0
  133. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/secrets_manager.py +0 -0
  134. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/session_manager.py +0 -0
  135. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/static_files_manager.py +0 -0
  136. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/sync_manager.py +0 -0
  137. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/variable_manager.py +0 -0
  138. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +0 -0
  139. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/retained_mode.py +0 -0
  140. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/utils/__init__.py +0 -0
  141. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/utils/engine_identity.py +0 -0
  142. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  143. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/retained_mode/variable_types.py +0 -0
  144. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/servers/__init__.py +0 -0
  145. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/servers/mcp.py +0 -0
  146. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/servers/static.py +0 -0
  147. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/servers/ws_request_manager.py +0 -0
  148. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/__init__.py +0 -0
  149. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/add_param_button.py +0 -0
  150. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/button.py +0 -0
  151. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/clamp.py +0 -0
  152. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/color_picker.py +0 -0
  153. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/compare.py +0 -0
  154. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/compare_images.py +0 -0
  155. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/file_system_picker.py +0 -0
  156. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/minmax.py +0 -0
  157. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/numbers_selector.py +0 -0
  158. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/slider.py +0 -0
  159. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/trait_registry.py +0 -0
  160. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/traits/traits.json +0 -0
  161. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/updater/__init__.py +0 -0
  162. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/updater/__main__.py +0 -0
  163. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/__init__.py +0 -0
  164. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/async_utils.py +0 -0
  165. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/dict_utils.py +0 -0
  166. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/image_preview.py +0 -0
  167. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/metaclasses.py +0 -0
  168. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/uv_utils.py +0 -0
  169. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/utils/version_utils.py +0 -0
  170. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/__init__.py +0 -0
  171. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  172. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
  173. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +0 -0
  174. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/workflow_versions/__init__.py +0 -0
  175. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py +0 -0
  176. {griptape_nodes-0.56.0 → griptape_nodes-0.57.0}/src/griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.56.0
3
+ Version: 0.57.0
4
4
  Summary: Add your description here
5
- Requires-Dist: griptape>=1.8.2
5
+ Requires-Dist: griptape>=1.8.3
6
6
  Requires-Dist: pydantic>=2.10.6
7
7
  Requires-Dist: python-dotenv>=1.0.1
8
8
  Requires-Dist: xdg-base-dirs>=6.0.2
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "griptape-nodes"
3
- version = "0.56.0"
3
+ version = "0.57.0"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12.0, <3.13"
7
7
  dependencies = [
8
- "griptape>=1.8.2",
8
+ "griptape>=1.8.3",
9
9
  "pydantic>=2.10.6",
10
10
  "python-dotenv>=1.0.1",
11
11
  "xdg-base-dirs>=6.0.2",
@@ -41,7 +41,6 @@ dev = [
41
41
  "pyright>=1.1.396",
42
42
  "ruff>=0.11.0",
43
43
  "typos>=1.30.2",
44
- "watchdog>=6.0.0",
45
44
  ]
46
45
  docs = [
47
46
  "mkdocs-material>=9.6.9",
@@ -99,6 +98,8 @@ ignore = [
99
98
 
100
99
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
101
100
  "nodes.griptape_nodes_library".msg = "Import from griptape_nodes_library instead of nodes.griptape_nodes_library"
101
+ "libraries.griptape_nodes_library".msg = "Import from griptape_nodes_library instead of libraries.griptape_nodes_library"
102
+ "libraries.griptape_nodes_advanced_media_library".msg = "Import from griptape_nodes_advanced_media_library instead of libraries.griptape_nodes_advanced_media_library"
102
103
 
103
104
  [tool.ruff.lint.per-file-ignores]
104
105
  "tests/*" = ["S101", "D104"]
@@ -125,13 +125,10 @@ async def astart_app() -> None:
125
125
  # Initialize event queue in main thread
126
126
  griptape_nodes.EventManager().initialize_queue()
127
127
 
128
- # Get main loop reference
129
- main_loop = asyncio.get_running_loop()
130
-
131
128
  try:
132
129
  # Start WebSocket tasks in daemon thread
133
130
  threading.Thread(
134
- target=_start_websocket_connection, args=(api_key, main_loop), daemon=True, name="websocket-tasks"
131
+ target=_start_websocket_connection, args=(api_key,), daemon=True, name="websocket-tasks"
135
132
  ).start()
136
133
 
137
134
  # Run event processing on main thread
@@ -142,7 +139,7 @@ async def astart_app() -> None:
142
139
  raise
143
140
 
144
141
 
145
- def _start_websocket_connection(api_key: str, main_loop: asyncio.AbstractEventLoop) -> None:
142
+ def _start_websocket_connection(api_key: str) -> None:
146
143
  """Run WebSocket tasks in a separate thread with its own async loop."""
147
144
  global websocket_event_loop # noqa: PLW0603
148
145
  try:
@@ -155,7 +152,7 @@ def _start_websocket_connection(api_key: str, main_loop: asyncio.AbstractEventLo
155
152
  websocket_event_loop_ready.set()
156
153
 
157
154
  # Run the async WebSocket tasks
158
- loop.run_until_complete(_run_websocket_tasks(api_key, main_loop))
155
+ loop.run_until_complete(_run_websocket_tasks(api_key))
159
156
  except Exception as e:
160
157
  logger.error("WebSocket thread error: %s", e)
161
158
  raise
@@ -164,7 +161,7 @@ def _start_websocket_connection(api_key: str, main_loop: asyncio.AbstractEventLo
164
161
  websocket_event_loop_ready.clear()
165
162
 
166
163
 
167
- async def _run_websocket_tasks(api_key: str, main_loop: asyncio.AbstractEventLoop) -> None:
164
+ async def _run_websocket_tasks(api_key: str) -> None:
168
165
  """Run WebSocket tasks - async version."""
169
166
  # Create WebSocket connection for this thread
170
167
  connection_stream = _create_websocket_connection(api_key)
@@ -181,12 +178,10 @@ async def _run_websocket_tasks(api_key: str, main_loop: asyncio.AbstractEventLoo
181
178
  initialized = True
182
179
 
183
180
  # Emit connection established event for every connection
184
- griptape_nodes.EventManager().put_event_threadsafe(
185
- main_loop, AppEvent(payload=app_events.AppConnectionEstablished())
186
- )
181
+ griptape_nodes.EventManager().put_event(AppEvent(payload=app_events.AppConnectionEstablished()))
187
182
 
188
183
  async with asyncio.TaskGroup() as tg:
189
- tg.create_task(_process_incoming_messages(ws_connection, main_loop))
184
+ tg.create_task(_process_incoming_messages(ws_connection))
190
185
  tg.create_task(_send_outgoing_messages(ws_connection))
191
186
  except (ExceptionGroup, ConnectionClosed, ConnectionClosedError):
192
187
  logger.info("WebSocket connection closed, reconnecting...")
@@ -217,14 +212,14 @@ def _ensure_api_key() -> str:
217
212
  return api_key
218
213
 
219
214
 
220
- async def _process_incoming_messages(ws_connection: Any, main_loop: asyncio.AbstractEventLoop) -> None:
215
+ async def _process_incoming_messages(ws_connection: Any) -> None:
221
216
  """Process incoming WebSocket requests from Nodes API."""
222
217
  logger.debug("Processing incoming WebSocket requests from WebSocket connection")
223
218
 
224
219
  async for message in ws_connection:
225
220
  try:
226
221
  data = json.loads(message)
227
- await _process_api_event(data, main_loop)
222
+ await _process_api_event(data)
228
223
  except Exception:
229
224
  logger.exception("Error processing event, skipping.")
230
225
 
@@ -242,7 +237,7 @@ def _create_websocket_connection(api_key: str) -> Any:
242
237
  )
243
238
 
244
239
 
245
- async def _process_api_event(event: dict, main_loop: asyncio.AbstractEventLoop) -> None:
240
+ async def _process_api_event(event: dict) -> None:
246
241
  """Process API events and add to async queue."""
247
242
  payload = event.get("payload", {})
248
243
 
@@ -278,7 +273,7 @@ async def _process_api_event(event: dict, main_loop: asyncio.AbstractEventLoop)
278
273
  await _process_event_request(request_event)
279
274
  else:
280
275
  # Add the event to the main thread event queue for processing
281
- griptape_nodes.EventManager().put_event_threadsafe(main_loop, request_event)
276
+ griptape_nodes.EventManager().put_event(request_event)
282
277
 
283
278
 
284
279
  async def _send_outgoing_messages(ws_connection: Any) -> None:
@@ -0,0 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ import subprocess
4
+ import sys
5
+
6
+ from watchfiles import DefaultFilter, watch
7
+
8
+ from griptape_nodes.utils.uv_utils import find_uv_bin
9
+
10
+
11
+ def start_process() -> subprocess.Popen:
12
+ """Start the gtn process."""
13
+ uv_path = find_uv_bin()
14
+ return subprocess.Popen( # noqa: S603
15
+ [uv_path, "run", "gtn"],
16
+ stdout=sys.stdout,
17
+ stderr=sys.stderr,
18
+ )
19
+
20
+
21
+ def terminate_process(process: subprocess.Popen) -> None:
22
+ """Gracefully terminate a process with timeout."""
23
+ if process.poll() is not None:
24
+ return # Process already terminated
25
+
26
+ # First try graceful termination
27
+ process.terminate()
28
+ try:
29
+ # Wait up to 5 seconds for graceful shutdown
30
+ process.wait(timeout=5)
31
+ except subprocess.TimeoutExpired:
32
+ # Force kill if it doesn't shut down gracefully
33
+ process.kill()
34
+ process.wait()
35
+
36
+
37
+ if __name__ == "__main__":
38
+ # Configure filter to ignore .venv, __pycache__, and compiled Python files
39
+ watch_filter = DefaultFilter(
40
+ ignore_dirs=(".venv",),
41
+ ignore_entity_patterns=(r"\.pyc$", r"\.pyo$"),
42
+ )
43
+
44
+ process = start_process()
45
+
46
+ try:
47
+ # Watch for changes in src, libraries, and tests directories
48
+ for changes in watch("src", "libraries", "tests", watch_filter=watch_filter):
49
+ # Only restart on .py file changes
50
+ if any(str(path).endswith(".py") for _, path in changes):
51
+ terminate_process(process)
52
+ process = start_process()
53
+ except KeyboardInterrupt:
54
+ terminate_process(process)
@@ -0,0 +1 @@
1
+ """Bootstrap utils package."""
@@ -0,0 +1,122 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ import sys
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ if TYPE_CHECKING:
9
+ from pathlib import Path
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class PythonSubprocessExecutorError(Exception):
15
+ """Exception raised during Python subprocess execution."""
16
+
17
+
18
+ class PythonSubprocessExecutor:
19
+ def __init__(self) -> None:
20
+ self._process: asyncio.subprocess.Process | None = None
21
+ self._is_running = False
22
+
23
+ async def execute_python_script(
24
+ self, script_path: Path, args: list[str] | None = None, cwd: Path | None = None
25
+ ) -> None:
26
+ """Execute a Python script in a subprocess and wait for completion.
27
+
28
+ Args:
29
+ script_path: Path to the Python script to execute
30
+ args: Additional command line arguments
31
+ cwd: Working directory for the subprocess
32
+ """
33
+ if self.is_running():
34
+ logger.warning("Another subprocess is already running. Terminating it first.")
35
+ await self.terminate()
36
+
37
+ args = args or []
38
+ command = [sys.executable, str(script_path), *args]
39
+
40
+ try:
41
+ logger.info("Starting subprocess: %s", " ".join(command))
42
+ logger.info("Working directory: %s", cwd)
43
+
44
+ self._process = await asyncio.create_subprocess_exec(
45
+ *command,
46
+ cwd=cwd,
47
+ stdout=asyncio.subprocess.PIPE,
48
+ stderr=asyncio.subprocess.PIPE,
49
+ )
50
+ self._is_running = True
51
+ logger.info("Subprocess started with PID: %s", self._process.pid)
52
+
53
+ stdout_bytes, stderr_bytes = await self._process.communicate()
54
+ returncode = self._process.returncode
55
+ stdout = stdout_bytes.decode() if stdout_bytes else ""
56
+ stderr = stderr_bytes.decode() if stderr_bytes else ""
57
+
58
+ # Log all output regardless of return code
59
+ if stdout:
60
+ logger.info("Subprocess stdout: %s", stdout)
61
+ if stderr:
62
+ logger.info("Subprocess stderr: %s", stderr)
63
+
64
+ if returncode == 0:
65
+ logger.info("Subprocess completed successfully with return code: %d", returncode)
66
+ else:
67
+ logger.error("Subprocess failed with return code: %d", returncode)
68
+ msg = f"Subprocess failed with return code: {returncode}"
69
+ raise RuntimeError(msg) # noqa: TRY301
70
+
71
+ except Exception as e:
72
+ msg = "Error running subprocess"
73
+ logger.exception(msg)
74
+ raise PythonSubprocessExecutorError(msg) from e
75
+ finally:
76
+ self._is_running = False
77
+ self._process = None
78
+
79
+ def is_running(self) -> bool:
80
+ """Check if a subprocess is currently running."""
81
+ return self._is_running
82
+
83
+ async def terminate(self) -> bool:
84
+ """Terminate the running subprocess.
85
+
86
+ Returns:
87
+ True if successfully terminated, False otherwise
88
+ """
89
+ if not self.is_running() or not self._process:
90
+ return True
91
+
92
+ try:
93
+ logger.info("Terminating subprocess...")
94
+ self._process.terminate()
95
+
96
+ # Wait for graceful termination with timeout using context manager
97
+ try:
98
+ async with asyncio.timeout(5.0):
99
+ await self._process.wait()
100
+ logger.info("Subprocess terminated gracefully")
101
+ return True # noqa: TRY300
102
+ except TimeoutError:
103
+ logger.warning("Subprocess did not terminate gracefully, force killing...")
104
+ self._process.kill()
105
+ await self._process.wait()
106
+ logger.info("Subprocess force killed")
107
+ return True
108
+
109
+ except Exception as e:
110
+ logger.error("Error terminating subprocess: %s", e)
111
+ return False
112
+ finally:
113
+ self._is_running = False
114
+ self._process = None
115
+
116
+ def get_status(self) -> dict[str, Any]:
117
+ """Get current status information."""
118
+ return {
119
+ "is_running": self.is_running(),
120
+ "has_process": self._process is not None,
121
+ "process_pid": self._process.pid if self._process else None,
122
+ }