griptape-nodes 0.65.2__tar.gz → 0.65.4__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 (282) hide show
  1. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/PKG-INFO +1 -1
  2. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/pyproject.toml +1 -1
  3. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/utils/python_subprocess_executor.py +4 -1
  4. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +3 -0
  5. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +3 -0
  6. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/node_groups/subflow_node_group.py +218 -37
  7. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/config_manager.py +31 -0
  8. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_manager.py +13 -3
  9. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/sync_manager.py +3 -1
  10. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/README.md +0 -0
  11. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/__init__.py +0 -0
  12. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/__main__.py +0 -0
  13. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/api_client/__init__.py +0 -0
  14. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/api_client/client.py +0 -0
  15. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/api_client/request_client.py +0 -0
  16. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/app/.python-version +0 -0
  17. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/app/__init__.py +0 -0
  18. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/app/app.py +0 -0
  19. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/app/watch.py +0 -0
  20. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/__init__.py +0 -0
  21. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/utils/__init__.py +0 -0
  22. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  23. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +0 -0
  24. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +0 -0
  25. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +0 -0
  26. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +0 -0
  27. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -0
  28. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_publishers/__init__.py +0 -0
  29. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +0 -0
  30. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +0 -0
  31. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +0 -0
  32. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/__init__.py +0 -0
  33. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/__init__.py +0 -0
  34. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/config.py +0 -0
  35. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/engine.py +0 -0
  36. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/init.py +0 -0
  37. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/libraries.py +0 -0
  38. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/models.py +0 -0
  39. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/commands/self.py +0 -0
  40. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/main.py +0 -0
  41. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/cli/shared.py +0 -0
  42. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/__init__.py +0 -0
  43. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/directed_graph.py +0 -0
  44. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/__init__.py +0 -0
  45. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/core.py +0 -0
  46. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/exceptions.py +0 -0
  47. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/formats.py +0 -0
  48. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/matching.py +0 -0
  49. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/parsing.py +0 -0
  50. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/resolution.py +0 -0
  51. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/macro_parser/segments.py +0 -0
  52. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/node_executor.py +0 -0
  53. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/__init__.py +0 -0
  54. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/default_project_template.py +0 -0
  55. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/defaults/README.md +0 -0
  56. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/directory.py +0 -0
  57. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/loader.py +0 -0
  58. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/project.py +0 -0
  59. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/situation.py +0 -0
  60. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/common/project_templates/validation.py +0 -0
  61. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/__init__.py +0 -0
  62. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/storage/__init__.py +0 -0
  63. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/storage/base_storage_driver.py +0 -0
  64. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +0 -0
  65. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/storage/local_storage_driver.py +0 -0
  66. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/storage/storage_backend.py +0 -0
  67. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/thread_storage/__init__.py +0 -0
  68. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py +0 -0
  69. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py +0 -0
  70. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py +0 -0
  71. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/drivers/thread_storage/thread_storage_backend.py +0 -0
  72. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/__init__.py +0 -0
  73. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/base_iterative_nodes.py +0 -0
  74. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/connections.py +0 -0
  75. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/core_types.py +0 -0
  76. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/flow.py +0 -0
  77. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/node_groups/__init__.py +0 -0
  78. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/node_groups/base_node_group.py +0 -0
  79. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/node_types.py +0 -0
  80. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/README.md +0 -0
  81. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/__init__.py +0 -0
  82. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/api_key_provider_parameter.py +0 -0
  83. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/artifact_url/__init__.py +0 -0
  84. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/artifact_url/public_artifact_url_parameter.py +0 -0
  85. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/execution_status_component.py +0 -0
  86. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/huggingface/__init__.py +0 -0
  87. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_model_parameter.py +0 -0
  88. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_parameter.py +0 -0
  89. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py +0 -0
  90. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py +0 -0
  91. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/log_parameter.py +0 -0
  92. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/progress_bar_component.py +0 -0
  93. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_components/seed_parameter.py +0 -0
  94. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/__init__.py +0 -0
  95. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_audio.py +0 -0
  96. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_bool.py +0 -0
  97. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_button.py +0 -0
  98. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_float.py +0 -0
  99. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_image.py +0 -0
  100. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_int.py +0 -0
  101. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_number.py +0 -0
  102. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_string.py +0 -0
  103. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_three_d.py +0 -0
  104. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/param_types/parameter_video.py +0 -0
  105. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/exe_types/type_validator.py +0 -0
  106. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/__init__.py +0 -0
  107. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/control_flow.py +0 -0
  108. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/dag_builder.py +0 -0
  109. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/fsm.py +0 -0
  110. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/parallel_resolution.py +0 -0
  111. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/machines/sequential_resolution.py +0 -0
  112. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/mcp_server/__init__.py +0 -0
  113. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/node_library/__init__.py +0 -0
  114. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/node_library/advanced_node_library.py +0 -0
  115. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/node_library/library_registry.py +0 -0
  116. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/node_library/workflow_registry.py +0 -0
  117. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/py.typed +0 -0
  118. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/__init__.py +0 -0
  119. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/__init__.py +0 -0
  120. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/agent_events.py +0 -0
  121. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/app_events.py +0 -0
  122. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/arbitrary_python_events.py +0 -0
  123. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/base_events.py +0 -0
  124. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/config_events.py +0 -0
  125. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/connection_events.py +0 -0
  126. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/context_events.py +0 -0
  127. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/execution_events.py +0 -0
  128. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/flow_events.py +0 -0
  129. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  130. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/library_events.py +0 -0
  131. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/logger_events.py +0 -0
  132. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/mcp_events.py +0 -0
  133. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/model_events.py +0 -0
  134. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/node_events.py +0 -0
  135. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/object_events.py +0 -0
  136. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/os_events.py +0 -0
  137. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/parameter_events.py +0 -0
  138. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  139. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/project_events.py +0 -0
  140. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/resource_events.py +0 -0
  141. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/secrets_events.py +0 -0
  142. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/static_file_events.py +0 -0
  143. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/sync_events.py +0 -0
  144. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/validation_events.py +0 -0
  145. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/variable_events.py +0 -0
  146. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/events/workflow_events.py +0 -0
  147. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/griptape_nodes.py +0 -0
  148. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/__init__.py +0 -0
  149. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/agent_manager.py +0 -0
  150. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -0
  151. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/context_manager.py +0 -0
  152. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +0 -0
  153. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/event_manager.py +0 -0
  154. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/__init__.py +0 -0
  155. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py +0 -0
  156. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py +0 -0
  157. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/after_library_callback_problem.py +0 -0
  158. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/before_library_callback_problem.py +0 -0
  159. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/create_config_category_problem.py +0 -0
  160. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/dependency_installation_failed_problem.py +0 -0
  161. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/deprecated_node_warning_problem.py +0 -0
  162. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_library_problem.py +0 -0
  163. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_node_registration_problem.py +0 -0
  164. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/engine_version_error_problem.py +0 -0
  165. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/insufficient_disk_space_problem.py +0 -0
  166. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/invalid_version_string_problem.py +0 -0
  167. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_json_decode_problem.py +0 -0
  168. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_load_exception_problem.py +0 -0
  169. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_not_found_problem.py +0 -0
  170. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_problem.py +0 -0
  171. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_exception_problem.py +0 -0
  172. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_validation_problem.py +0 -0
  173. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_deprecation_warning_problem.py +0 -0
  174. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_removed_problem.py +0 -0
  175. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_base_node_problem.py +0 -0
  176. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_found_problem.py +0 -0
  177. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_module_import_problem.py +0 -0
  178. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/old_xdg_location_warning_problem.py +0 -0
  179. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/sandbox_directory_missing_problem.py +0 -0
  180. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_incompatible_problem.py +0 -0
  181. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_warning_problem.py +0 -0
  182. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/update_config_category_problem.py +0 -0
  183. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/venv_creation_failed_problem.py +0 -0
  184. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/__init__.py +0 -0
  185. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/deprecated_node_in_workflow_problem.py +0 -0
  186. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_dependency_version_string_problem.py +0 -0
  187. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_library_version_string_problem.py +0 -0
  188. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_schema_problem.py +0 -0
  189. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_section_count_problem.py +0 -0
  190. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_toml_format_problem.py +0 -0
  191. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_not_registered_problem.py +0 -0
  192. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_below_required_problem.py +0 -0
  193. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_large_difference_problem.py +0 -0
  194. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_major_mismatch_problem.py +0 -0
  195. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_minor_difference_problem.py +0 -0
  196. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_creation_date_problem.py +0 -0
  197. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_last_modified_date_problem.py +0 -0
  198. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_toml_section_problem.py +0 -0
  199. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/node_type_not_found_problem.py +0 -0
  200. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_found_problem.py +0 -0
  201. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py +0 -0
  202. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py +0 -0
  203. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/flow_manager.py +0 -0
  204. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py +0 -0
  205. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py +0 -0
  206. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py +0 -0
  207. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py +0 -0
  208. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py +0 -0
  209. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py +0 -0
  210. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py +0 -0
  211. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py +0 -0
  212. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py +0 -0
  213. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py +0 -0
  214. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py +0 -0
  215. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py +0 -0
  216. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/mcp_manager.py +0 -0
  217. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/model_manager.py +0 -0
  218. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/node_manager.py +0 -0
  219. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/object_manager.py +0 -0
  220. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  221. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/os_manager.py +0 -0
  222. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/project_manager.py +0 -0
  223. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_components/__init__.py +0 -0
  224. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_components/capability_field.py +0 -0
  225. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_components/comparator.py +0 -0
  226. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +0 -0
  227. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_components/resource_type.py +0 -0
  228. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_manager.py +0 -0
  229. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_types/__init__.py +0 -0
  230. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +0 -0
  231. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/resource_types/os_resource.py +0 -0
  232. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/secrets_manager.py +0 -0
  233. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/session_manager.py +0 -0
  234. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/settings.py +0 -0
  235. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/static_files_manager.py +0 -0
  236. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/user_manager.py +0 -0
  237. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/variable_manager.py +0 -0
  238. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +0 -0
  239. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/managers/workflow_manager.py +0 -0
  240. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/retained_mode.py +0 -0
  241. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/utils/__init__.py +0 -0
  242. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  243. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/retained_mode/variable_types.py +0 -0
  244. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/servers/__init__.py +0 -0
  245. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/servers/mcp.py +0 -0
  246. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/servers/static.py +0 -0
  247. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/__init__.py +0 -0
  248. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/add_param_button.py +0 -0
  249. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/button.py +0 -0
  250. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/clamp.py +0 -0
  251. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/color_picker.py +0 -0
  252. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/compare.py +0 -0
  253. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/compare_images.py +0 -0
  254. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/file_system_picker.py +0 -0
  255. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/minmax.py +0 -0
  256. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/multi_options.py +0 -0
  257. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/numbers_selector.py +0 -0
  258. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/options.py +0 -0
  259. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/slider.py +0 -0
  260. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/trait_registry.py +0 -0
  261. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/traits/traits.json +0 -0
  262. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/updater/__init__.py +0 -0
  263. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/updater/__main__.py +0 -0
  264. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/__init__.py +0 -0
  265. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/async_utils.py +0 -0
  266. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/dict_utils.py +0 -0
  267. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/file_utils.py +0 -0
  268. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/git_utils.py +0 -0
  269. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/huggingface_utils.py +0 -0
  270. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/image_preview.py +0 -0
  271. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/library_utils.py +0 -0
  272. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/metaclasses.py +0 -0
  273. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/uv_utils.py +0 -0
  274. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/utils/version_utils.py +0 -0
  275. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/__init__.py +0 -0
  276. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  277. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
  278. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +0 -0
  279. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/v0_63_8/__init__.py +0 -0
  280. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/v0_63_8/deprecated_nodegroup_parameters.py +0 -0
  281. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py +0 -0
  282. {griptape_nodes-0.65.2 → griptape_nodes-0.65.4}/src/griptape_nodes/version_compatibility/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.65.2
3
+ Version: 0.65.4
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "griptape-nodes"
3
- version = "0.65.2"
3
+ version = "0.65.4"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12.0, <3.13"
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from pathlib import Path
10
+ from subprocess import _ENV
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
@@ -21,7 +22,7 @@ class PythonSubprocessExecutor:
21
22
  self._is_running = False
22
23
 
23
24
  async def execute_python_script(
24
- self, script_path: Path, args: list[str] | None = None, cwd: Path | None = None
25
+ self, script_path: Path, args: list[str] | None = None, cwd: Path | None = None, env: _ENV | None = None
25
26
  ) -> None:
26
27
  """Execute a Python script in a subprocess and wait for completion.
27
28
 
@@ -29,6 +30,7 @@ class PythonSubprocessExecutor:
29
30
  script_path: Path to the Python script to execute
30
31
  args: Additional command line arguments
31
32
  cwd: Working directory for the subprocess
33
+ env: Environment variables for the subprocess
32
34
  """
33
35
  if self.is_running():
34
36
  logger.warning("Another subprocess is already running. Terminating it first.")
@@ -44,6 +46,7 @@ class PythonSubprocessExecutor:
44
46
  self._process = await asyncio.create_subprocess_exec(
45
47
  *command,
46
48
  cwd=cwd,
49
+ env=env,
47
50
  stdout=asyncio.subprocess.PIPE,
48
51
  stderr=asyncio.subprocess.PIPE,
49
52
  )
@@ -125,6 +125,9 @@ class SubprocessWorkflowExecutor(LocalSessionWorkflowExecutor, PythonSubprocessE
125
125
  script_path=tmp_script_path,
126
126
  args=args,
127
127
  cwd=Path(tmpdir),
128
+ env={
129
+ "GTN_CONFIG_ENABLE_WORKSPACE_FILE_WATCHING": "false",
130
+ },
128
131
  )
129
132
  except Exception as e:
130
133
  msg = f"Failed to execute subprocess script: {e}"
@@ -83,4 +83,7 @@ class SubprocessWorkflowPublisher(LocalWorkflowPublisher, PythonSubprocessExecut
83
83
  script_path=tmp_script_path,
84
84
  args=args,
85
85
  cwd=Path(tmpdir),
86
+ env={
87
+ "GTN_CONFIG_ENABLE_WORKSPACE_FILE_WATCHING": "false",
88
+ },
86
89
  )
@@ -497,6 +497,16 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
497
497
  for outgoing_connection in outgoing_connection_list:
498
498
  proxy_parameter = outgoing_connection.target_parameter
499
499
  remap_connections = connections.get_outgoing_connections_from_parameter(self, proxy_parameter)
500
+
501
+ # Check if proxy has other incoming connections besides this one
502
+ # If so, we should keep the proxy and its outgoing connections
503
+ incoming_to_proxy = connections.get_incoming_connections_to_parameter(self, proxy_parameter)
504
+ other_incoming_exists = any(
505
+ conn.source_node.name != node.name or conn.source_parameter.name != parameter_name
506
+ for conn in incoming_to_proxy
507
+ )
508
+
509
+ # Delete the connection from this node to proxy
500
510
  delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
501
511
  DeleteConnectionRequest(
502
512
  source_parameter_name=parameter_name,
@@ -509,19 +519,8 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
509
519
  msg = f"{self.name}: Failed to delete internal outgoing connection from {node.name}.{parameter_name} to proxy {proxy_parameter.name}: {delete_result.result_details}"
510
520
  raise RuntimeError(msg)
511
521
 
522
+ # Create direct connections from this node to target nodes
512
523
  for connection in remap_connections:
513
- delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
514
- DeleteConnectionRequest(
515
- source_parameter_name=connection.source_parameter.name,
516
- target_parameter_name=connection.target_parameter.name,
517
- source_node_name=connection.source_node.name,
518
- target_node_name=connection.target_node.name,
519
- )
520
- )
521
- if delete_result.failed():
522
- msg = f"{self.name}: Failed to delete external connection from proxy {proxy_parameter.name} to {connection.target_node.name}.{connection.target_parameter.name}: {delete_result.result_details}"
523
- raise RuntimeError(msg)
524
-
525
524
  create_result = GriptapeNodes.FlowManager().on_create_connection_request(
526
525
  CreateConnectionRequest(
527
526
  source_parameter_name=parameter_name,
@@ -534,7 +533,22 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
534
533
  msg = f"{self.name}: Failed to create direct outgoing connection from {node.name}.{parameter_name} to {connection.target_node.name}.{connection.target_parameter.name}: {create_result.result_details}"
535
534
  raise RuntimeError(msg)
536
535
 
537
- self._cleanup_proxy_parameter(proxy_parameter, "right_parameters")
536
+ # Only delete outgoing connections from proxy and clean up if no other incoming connections exist
537
+ if not other_incoming_exists:
538
+ for connection in remap_connections:
539
+ delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
540
+ DeleteConnectionRequest(
541
+ source_parameter_name=connection.source_parameter.name,
542
+ target_parameter_name=connection.target_parameter.name,
543
+ source_node_name=connection.source_node.name,
544
+ target_node_name=connection.target_node.name,
545
+ )
546
+ )
547
+ if delete_result.failed():
548
+ msg = f"{self.name}: Failed to delete external connection from proxy {proxy_parameter.name} to {connection.target_node.name}.{connection.target_parameter.name}: {delete_result.result_details}"
549
+ raise RuntimeError(msg)
550
+
551
+ self._cleanup_proxy_parameter(proxy_parameter, "right_parameters")
538
552
 
539
553
  def _remap_incoming_connections(self, node: BaseNode, connections: Connections) -> None:
540
554
  """Remap incoming connections that go through proxy parameters.
@@ -550,6 +564,16 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
550
564
  for incoming_connection in incoming_connection_list:
551
565
  proxy_parameter = incoming_connection.source_parameter
552
566
  remap_connections = connections.get_incoming_connections_to_parameter(self, proxy_parameter)
567
+
568
+ # Check if proxy has other outgoing connections besides this one
569
+ # If so, we should keep the proxy and its incoming connections
570
+ outgoing_from_proxy = connections.get_outgoing_connections_from_parameter(self, proxy_parameter)
571
+ other_outgoing_exists = any(
572
+ conn.target_node.name != node.name or conn.target_parameter.name != parameter_name
573
+ for conn in outgoing_from_proxy
574
+ )
575
+
576
+ # Delete the connection from proxy to this node
553
577
  delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
554
578
  DeleteConnectionRequest(
555
579
  source_parameter_name=proxy_parameter.name,
@@ -562,19 +586,8 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
562
586
  msg = f"{self.name}: Failed to delete internal incoming connection from proxy {proxy_parameter.name} to {node.name}.{parameter_name}: {delete_result.result_details}"
563
587
  raise RuntimeError(msg)
564
588
 
589
+ # Create direct connections from source nodes to this node
565
590
  for connection in remap_connections:
566
- delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
567
- DeleteConnectionRequest(
568
- source_parameter_name=connection.source_parameter.name,
569
- target_parameter_name=proxy_parameter.name,
570
- source_node_name=connection.source_node.name,
571
- target_node_name=self.name,
572
- )
573
- )
574
- if delete_result.failed():
575
- msg = f"{self.name}: Failed to delete external connection from {connection.source_node.name}.{connection.source_parameter.name} to proxy {proxy_parameter.name}: {delete_result.result_details}"
576
- raise RuntimeError(msg)
577
-
578
591
  create_result = GriptapeNodes.FlowManager().on_create_connection_request(
579
592
  CreateConnectionRequest(
580
593
  source_parameter_name=connection.source_parameter.name,
@@ -587,7 +600,22 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
587
600
  msg = f"{self.name}: Failed to create direct incoming connection from {connection.source_node.name}.{connection.source_parameter.name} to {node.name}.{parameter_name}: {create_result.result_details}"
588
601
  raise RuntimeError(msg)
589
602
 
590
- self._cleanup_proxy_parameter(proxy_parameter, "left_parameters")
603
+ # Only delete incoming connections to proxy and clean up if no other outgoing connections exist
604
+ if not other_outgoing_exists:
605
+ for connection in remap_connections:
606
+ delete_result = GriptapeNodes.FlowManager().on_delete_connection_request(
607
+ DeleteConnectionRequest(
608
+ source_parameter_name=connection.source_parameter.name,
609
+ target_parameter_name=proxy_parameter.name,
610
+ source_node_name=connection.source_node.name,
611
+ target_node_name=self.name,
612
+ )
613
+ )
614
+ if delete_result.failed():
615
+ msg = f"{self.name}: Failed to delete external connection from {connection.source_node.name}.{connection.source_parameter.name} to proxy {proxy_parameter.name}: {delete_result.result_details}"
616
+ raise RuntimeError(msg)
617
+
618
+ self._cleanup_proxy_parameter(proxy_parameter, "left_parameters")
591
619
 
592
620
  def remap_to_internal(self, nodes: list[BaseNode], connections: Connections) -> None:
593
621
  """Remap connections that are now internal after adding nodes to the group.
@@ -672,22 +700,175 @@ class SubflowNodeGroup(BaseNodeGroup, ABC):
672
700
  connections: Connections object from FlowManager
673
701
  node_names_in_group: Set of all node names currently in the group
674
702
  """
703
+ # Group outgoing connections by (source_node, source_parameter) to reuse proxy parameters
704
+ # Skip connections that already go to the NodeGroup itself (existing proxy parameters)
705
+ outgoing_by_source: dict[tuple[str, str], list[Connection]] = {}
675
706
  for node in nodes:
676
707
  outgoing_connections = connections.get_all_outgoing_connections(node)
677
708
  for conn in outgoing_connections:
678
- if conn.target_node.name not in node_names_in_group:
679
- self.map_external_connection(
680
- conn=conn,
681
- is_incoming=False,
682
- )
683
-
709
+ if conn.target_node.name not in node_names_in_group and conn.target_node.name != self.name:
710
+ key = (conn.source_node.name, conn.source_parameter.name)
711
+ outgoing_by_source.setdefault(key, []).append(conn)
712
+
713
+ # Group incoming connections by (source_node, source_parameter) to reuse proxy parameters
714
+ # This ensures that when an external node connects to multiple internal nodes,
715
+ # they share a single proxy parameter
716
+ # Skip connections that already come from the NodeGroup itself (existing proxy parameters)
717
+ incoming_by_source: dict[tuple[str, str], list[Connection]] = {}
718
+ for node in nodes:
684
719
  incoming_connections = connections.get_all_incoming_connections(node)
685
720
  for conn in incoming_connections:
686
- if conn.source_node.name not in node_names_in_group:
687
- self.map_external_connection(
688
- conn=conn,
689
- is_incoming=True,
690
- )
721
+ if conn.source_node.name not in node_names_in_group and conn.source_node.name != self.name:
722
+ key = (conn.source_node.name, conn.source_parameter.name)
723
+ incoming_by_source.setdefault(key, []).append(conn)
724
+
725
+ # Map outgoing connections - one proxy parameter per source parameter
726
+ for conn_list in outgoing_by_source.values():
727
+ self._map_external_connections_group(conn_list, is_incoming=False)
728
+
729
+ # Map incoming connections - one proxy parameter per source parameter
730
+ for conn_list in incoming_by_source.values():
731
+ self._map_external_connections_group(conn_list, is_incoming=True)
732
+
733
+ def _map_external_connections_group(self, conn_list: list[Connection], *, is_incoming: bool) -> None:
734
+ """Map a group of external connections that share the same external parameter.
735
+
736
+ Creates a single proxy parameter and connects all nodes through it.
737
+ If an existing proxy parameter already handles the same internal source,
738
+ it will be reused instead of creating a new one.
739
+
740
+ Args:
741
+ conn_list: List of connections sharing the same external parameter
742
+ is_incoming: True if these are incoming connections to the group
743
+ """
744
+ if not conn_list:
745
+ return
746
+
747
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
748
+
749
+ # All connections share the same external parameter
750
+ # For outgoing: the internal (source) parameter is shared
751
+ # For incoming: the external (source) parameter is shared
752
+ first_conn = conn_list[0]
753
+ # Use source_parameter in both cases since we group by source
754
+ grouped_parameter = first_conn.source_parameter
755
+
756
+ # Check if there's an existing proxy parameter we can reuse
757
+ existing_proxy = self._find_existing_proxy_for_source(
758
+ first_conn.source_node, first_conn.source_parameter, is_incoming=is_incoming
759
+ )
760
+
761
+ # Delete all original connections first
762
+ for conn in conn_list:
763
+ request = DeleteConnectionRequest(
764
+ conn.source_parameter.name,
765
+ conn.target_parameter.name,
766
+ conn.source_node.name,
767
+ conn.target_node.name,
768
+ )
769
+ result = GriptapeNodes.handle_request(request)
770
+ if not isinstance(result, DeleteConnectionResultSuccess):
771
+ logger.warning(
772
+ "%s failed to delete connection from %s.%s to %s.%s",
773
+ self.name,
774
+ conn.source_node.name,
775
+ conn.source_parameter.name,
776
+ conn.target_node.name,
777
+ conn.target_parameter.name,
778
+ )
779
+
780
+ # Use existing proxy or create a new one
781
+ if existing_proxy is not None:
782
+ proxy_parameter = existing_proxy
783
+ else:
784
+ proxy_parameter = self._create_proxy_parameter_for_connection(grouped_parameter, is_incoming=is_incoming)
785
+
786
+ # Create connections for all external nodes through the single proxy
787
+ for conn in conn_list:
788
+ self._create_connections_for_proxy_single(proxy_parameter, conn, is_incoming=is_incoming)
789
+
790
+ def _find_existing_proxy_for_source(
791
+ self, source_node: BaseNode, source_parameter: Parameter, *, is_incoming: bool
792
+ ) -> Parameter | None:
793
+ """Find an existing proxy parameter that already handles the given source.
794
+
795
+ For outgoing connections (is_incoming=False):
796
+ Looks for a right-side proxy that has an incoming connection from the
797
+ same internal source node/parameter.
798
+
799
+ For incoming connections (is_incoming=True):
800
+ Looks for a left-side proxy that has an incoming connection from the
801
+ same external source node/parameter.
802
+
803
+ Args:
804
+ source_node: The source node of the connection
805
+ source_parameter: The source parameter of the connection
806
+ is_incoming: True if looking for incoming connection proxies
807
+
808
+ Returns:
809
+ The existing proxy parameter if found, None otherwise
810
+ """
811
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
812
+
813
+ connections = GriptapeNodes.FlowManager().get_connections()
814
+
815
+ # Determine which proxy parameters to check based on direction
816
+ if is_incoming:
817
+ proxy_param_names = self.metadata.get("left_parameters", [])
818
+ else:
819
+ proxy_param_names = self.metadata.get("right_parameters", [])
820
+
821
+ for proxy_name in proxy_param_names:
822
+ proxy_param = self.get_parameter_by_name(proxy_name)
823
+ if proxy_param is None:
824
+ continue
825
+
826
+ # Check incoming connections to this proxy parameter
827
+ incoming_to_proxy = connections.get_incoming_connections_to_parameter(self, proxy_param)
828
+ for conn in incoming_to_proxy:
829
+ if conn.source_node.name == source_node.name and conn.source_parameter.name == source_parameter.name:
830
+ return proxy_param
831
+
832
+ return None
833
+
834
+ def _create_connections_for_proxy_single(
835
+ self, proxy_parameter: Parameter, old_connection: Connection, *, is_incoming: bool
836
+ ) -> None:
837
+ """Create connections for a single external connection through a proxy parameter.
838
+
839
+ Unlike create_connections_for_proxy, this assumes the proxy parameter already exists
840
+ and is being shared by multiple connections.
841
+
842
+ Args:
843
+ proxy_parameter: The proxy parameter to connect through
844
+ old_connection: The original connection being remapped
845
+ is_incoming: True if this is an incoming connection to the group
846
+ """
847
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
848
+
849
+ create_first_connection = CreateConnectionRequest(
850
+ source_parameter_name=old_connection.source_parameter.name,
851
+ target_parameter_name=proxy_parameter.name,
852
+ source_node_name=old_connection.source_node.name,
853
+ target_node_name=self.name,
854
+ is_node_group_internal=not is_incoming,
855
+ )
856
+ create_second_connection = CreateConnectionRequest(
857
+ source_parameter_name=proxy_parameter.name,
858
+ target_parameter_name=old_connection.target_parameter.name,
859
+ source_node_name=self.name,
860
+ target_node_name=old_connection.target_node.name,
861
+ is_node_group_internal=is_incoming,
862
+ )
863
+
864
+ # Track connections for cleanup
865
+ if proxy_parameter.name not in self._proxy_param_to_connections:
866
+ self._proxy_param_to_connections[proxy_parameter.name] = 2
867
+ else:
868
+ self._proxy_param_to_connections[proxy_parameter.name] += 2
869
+
870
+ GriptapeNodes.handle_request(create_first_connection)
871
+ GriptapeNodes.handle_request(create_second_connection)
691
872
 
692
873
  def _validate_nodes_in_group(self, nodes: list[BaseNode]) -> None:
693
874
  """Validate that all nodes are in the group."""
@@ -255,6 +255,31 @@ class ConfigManager:
255
255
  workspace_path = self.workspace_path
256
256
  return workspace_path / relative_path
257
257
 
258
+ def _coerce_to_type(self, value: Any, cast_type: type) -> Any:
259
+ """Coerce a value to the specified type.
260
+
261
+ This is particularly useful for environment variables which are always strings.
262
+
263
+ Args:
264
+ value: The value to coerce.
265
+ cast_type: The type to coerce to (bool, int, float, or str).
266
+
267
+ Returns:
268
+ The coerced value.
269
+ """
270
+ if cast_type is bool:
271
+ if isinstance(value, bool):
272
+ return value
273
+ if isinstance(value, str):
274
+ return value.lower() not in ("false", "0", "no", "")
275
+ return bool(value)
276
+ if cast_type is int:
277
+ return int(value)
278
+ if cast_type is float:
279
+ return float(value)
280
+ # str is a no-op
281
+ return value
282
+
258
283
  def get_config_value(
259
284
  self,
260
285
  key: str,
@@ -262,6 +287,7 @@ class ConfigManager:
262
287
  should_load_env_var_if_detected: bool = True,
263
288
  config_source: Literal["user_config", "workspace_config", "default_config", "merged_config"] = "merged_config",
264
289
  default: Any | None = None,
290
+ cast_type: type[bool] | type[int] | type[float] | type[str] | None = None,
265
291
  ) -> Any:
266
292
  """Get a value from the configuration.
267
293
 
@@ -273,6 +299,8 @@ class ConfigManager:
273
299
  should_load_env_var_if_detected: If True, and the value starts with a $, it will be pulled from the environment variables.
274
300
  config_source: The source of the configuration to use. Can be 'user_config', 'workspace_config', 'default_config', or 'merged_config'.
275
301
  default: The default value to return if the key is not found in the configuration.
302
+ cast_type: Optional type to coerce the value to (bool, int, float, or str). Useful for environment
303
+ variables which are always strings (e.g., "false" -> False when cast_type=bool).
276
304
 
277
305
  Returns:
278
306
  The value associated with the key, or the entire category if key points to a dict.
@@ -296,6 +324,9 @@ class ConfigManager:
296
324
 
297
325
  value = GriptapeNodes.SecretsManager().get_secret(value[1:])
298
326
 
327
+ if cast_type is not None:
328
+ value = self._coerce_to_type(value, cast_type)
329
+
299
330
  return value
300
331
 
301
332
  def set_config_value(self, key: str, value: Any, *, should_set_env_var_if_detected: bool = True) -> None:
@@ -616,7 +616,12 @@ class LibraryManager:
616
616
 
617
617
  # Get git remote and ref if this library is in a git repository
618
618
  library_dir = json_path.parent.absolute()
619
- git_remote = get_git_remote(library_dir)
619
+ try:
620
+ git_remote = get_git_remote(library_dir)
621
+ except GitRemoteError as e:
622
+ logger.debug("Failed to get git remote for %s: %s", library_dir, e)
623
+ git_remote = None
624
+
620
625
  try:
621
626
  git_ref = get_current_ref(library_dir)
622
627
  except GitRefError as e:
@@ -671,7 +676,7 @@ class LibraryManager:
671
676
  result_details=details,
672
677
  )
673
678
 
674
- def _generate_sandbox_library_metadata(
679
+ def _generate_sandbox_library_metadata( # noqa: C901, PLR0915
675
680
  self,
676
681
  ) -> LoadLibraryMetadataFromFileResultSuccess | LoadLibraryMetadataFromFileResultFailure | None:
677
682
  """Generate sandbox library metadata by scanning Python files without importing them.
@@ -776,7 +781,12 @@ class LibraryManager:
776
781
  )
777
782
 
778
783
  # Get git remote and ref if the sandbox directory is in a git repository
779
- git_remote = get_git_remote(sandbox_library_dir)
784
+ try:
785
+ git_remote = get_git_remote(sandbox_directory)
786
+ except GitRemoteError as e:
787
+ logger.debug("Failed to get git remote for sandbox library %s: %s", sandbox_directory, e)
788
+ git_remote = None
789
+
780
790
  try:
781
791
  git_ref = get_current_ref(sandbox_library_dir)
782
792
  except GitRefError as e:
@@ -170,7 +170,9 @@ class SyncManager:
170
170
  self._get_cloud_storage_driver()
171
171
 
172
172
  # Check if file watching is enabled before starting it
173
- enable_file_watching = self._config_manager.get_config_value("enable_workspace_file_watching", default=True)
173
+ enable_file_watching = self._config_manager.get_config_value(
174
+ "enable_workspace_file_watching", default=True, cast_type=bool
175
+ )
174
176
  if enable_file_watching:
175
177
  # Start file watching after successful sync
176
178
  self._start_file_watching()