griptape-nodes 0.68.1__tar.gz → 0.70.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 (281) hide show
  1. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/PKG-INFO +3 -3
  2. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/pyproject.toml +3 -3
  3. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/api_client/client.py +5 -1
  4. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/app/app.py +51 -0
  5. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/node_groups/base_node_group.py +22 -2
  6. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/node_types.py +1 -1
  7. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/execution_status_component.py +23 -0
  8. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/log_parameter.py +5 -1
  9. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/seed_parameter.py +14 -16
  10. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/node_events.py +38 -3
  11. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/context_manager.py +1 -27
  12. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/flow_manager.py +7 -7
  13. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/node_manager.py +116 -27
  14. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/object_manager.py +0 -1
  15. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/retained_mode.py +17 -0
  16. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/README.md +0 -0
  17. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/__init__.py +0 -0
  18. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/__main__.py +0 -0
  19. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/api_client/__init__.py +0 -0
  20. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/api_client/request_client.py +0 -0
  21. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/app/.python-version +0 -0
  22. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/app/__init__.py +0 -0
  23. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/app/watch.py +0 -0
  24. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/__init__.py +0 -0
  25. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/utils/__init__.py +0 -0
  26. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/utils/python_subprocess_executor.py +0 -0
  27. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  28. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +0 -0
  29. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +0 -0
  30. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +0 -0
  31. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +0 -0
  32. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +0 -0
  33. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -0
  34. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_publishers/__init__.py +0 -0
  35. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +0 -0
  36. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +0 -0
  37. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +0 -0
  38. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +0 -0
  39. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/__init__.py +0 -0
  40. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/__init__.py +0 -0
  41. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/config.py +0 -0
  42. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/engine.py +0 -0
  43. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/init.py +0 -0
  44. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/libraries.py +0 -0
  45. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/models.py +0 -0
  46. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/commands/self.py +0 -0
  47. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/main.py +0 -0
  48. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/cli/shared.py +0 -0
  49. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/__init__.py +0 -0
  50. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/directed_graph.py +0 -0
  51. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/__init__.py +0 -0
  52. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/core.py +0 -0
  53. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/exceptions.py +0 -0
  54. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/formats.py +0 -0
  55. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/matching.py +0 -0
  56. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/parsing.py +0 -0
  57. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/resolution.py +0 -0
  58. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/macro_parser/segments.py +0 -0
  59. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/node_executor.py +0 -0
  60. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/__init__.py +0 -0
  61. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/default_project_template.py +0 -0
  62. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/defaults/README.md +0 -0
  63. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/directory.py +0 -0
  64. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/loader.py +0 -0
  65. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/project.py +0 -0
  66. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/situation.py +0 -0
  67. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/common/project_templates/validation.py +0 -0
  68. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/__init__.py +0 -0
  69. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/storage/__init__.py +0 -0
  70. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/storage/base_storage_driver.py +0 -0
  71. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +0 -0
  72. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/storage/local_storage_driver.py +0 -0
  73. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/storage/storage_backend.py +0 -0
  74. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/thread_storage/__init__.py +0 -0
  75. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py +0 -0
  76. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py +0 -0
  77. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py +0 -0
  78. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/drivers/thread_storage/thread_storage_backend.py +0 -0
  79. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/__init__.py +0 -0
  80. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/base_iterative_nodes.py +0 -0
  81. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/connections.py +0 -0
  82. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/core_types.py +0 -0
  83. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/flow.py +0 -0
  84. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/node_groups/__init__.py +0 -0
  85. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/node_groups/base_iterative_node_group.py +0 -0
  86. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/node_groups/subflow_node_group.py +0 -0
  87. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/README.md +0 -0
  88. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/__init__.py +0 -0
  89. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/api_key_provider_parameter.py +0 -0
  90. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/artifact_url/__init__.py +0 -0
  91. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/artifact_url/public_artifact_url_parameter.py +0 -0
  92. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/__init__.py +0 -0
  93. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_model_parameter.py +0 -0
  94. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_parameter.py +0 -0
  95. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py +0 -0
  96. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_variant_parameter.py +0 -0
  97. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py +0 -0
  98. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_components/progress_bar_component.py +0 -0
  99. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/__init__.py +0 -0
  100. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_audio.py +0 -0
  101. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_bool.py +0 -0
  102. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_button.py +0 -0
  103. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_dict.py +0 -0
  104. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_float.py +0 -0
  105. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_image.py +0 -0
  106. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_int.py +0 -0
  107. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_json.py +0 -0
  108. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_number.py +0 -0
  109. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_range.py +0 -0
  110. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_string.py +0 -0
  111. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_three_d.py +0 -0
  112. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/param_types/parameter_video.py +0 -0
  113. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/exe_types/type_validator.py +0 -0
  114. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/__init__.py +0 -0
  115. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/control_flow.py +0 -0
  116. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/dag_builder.py +0 -0
  117. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/fsm.py +0 -0
  118. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/parallel_resolution.py +0 -0
  119. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/machines/sequential_resolution.py +0 -0
  120. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/mcp_server/__init__.py +0 -0
  121. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/node_library/__init__.py +0 -0
  122. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/node_library/advanced_node_library.py +0 -0
  123. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/node_library/library_registry.py +0 -0
  124. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/node_library/workflow_registry.py +0 -0
  125. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/py.typed +0 -0
  126. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/__init__.py +0 -0
  127. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/__init__.py +0 -0
  128. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/agent_events.py +0 -0
  129. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/app_events.py +0 -0
  130. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/arbitrary_python_events.py +0 -0
  131. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/base_events.py +0 -0
  132. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/config_events.py +0 -0
  133. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/connection_events.py +0 -0
  134. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/context_events.py +0 -0
  135. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/execution_events.py +0 -0
  136. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/flow_events.py +0 -0
  137. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  138. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/library_events.py +0 -0
  139. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/logger_events.py +0 -0
  140. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/mcp_events.py +0 -0
  141. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/model_events.py +0 -0
  142. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/object_events.py +0 -0
  143. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/os_events.py +0 -0
  144. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/parameter_events.py +0 -0
  145. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  146. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/project_events.py +0 -0
  147. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/resource_events.py +0 -0
  148. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/secrets_events.py +0 -0
  149. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/static_file_events.py +0 -0
  150. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/sync_events.py +0 -0
  151. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/validation_events.py +0 -0
  152. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/variable_events.py +0 -0
  153. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/events/workflow_events.py +0 -0
  154. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/griptape_nodes.py +0 -0
  155. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/__init__.py +0 -0
  156. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/agent_manager.py +0 -0
  157. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -0
  158. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/config_manager.py +0 -0
  159. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +0 -0
  160. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/event_manager.py +0 -0
  161. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/__init__.py +0 -0
  162. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py +0 -0
  163. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py +0 -0
  164. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/after_library_callback_problem.py +0 -0
  165. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/before_library_callback_problem.py +0 -0
  166. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/create_config_category_problem.py +0 -0
  167. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/dependency_installation_failed_problem.py +0 -0
  168. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/deprecated_node_warning_problem.py +0 -0
  169. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_library_problem.py +0 -0
  170. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_node_registration_problem.py +0 -0
  171. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/engine_version_error_problem.py +0 -0
  172. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/incompatible_requirements_problem.py +0 -0
  173. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/insufficient_disk_space_problem.py +0 -0
  174. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/invalid_version_string_problem.py +0 -0
  175. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_json_decode_problem.py +0 -0
  176. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_load_exception_problem.py +0 -0
  177. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_not_found_problem.py +0 -0
  178. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_problem.py +0 -0
  179. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_exception_problem.py +0 -0
  180. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_validation_problem.py +0 -0
  181. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_deprecation_warning_problem.py +0 -0
  182. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_removed_problem.py +0 -0
  183. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_base_node_problem.py +0 -0
  184. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_found_problem.py +0 -0
  185. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_module_import_problem.py +0 -0
  186. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/old_xdg_location_warning_problem.py +0 -0
  187. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/sandbox_directory_missing_problem.py +0 -0
  188. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_incompatible_problem.py +0 -0
  189. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_warning_problem.py +0 -0
  190. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/update_config_category_problem.py +0 -0
  191. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/venv_creation_failed_problem.py +0 -0
  192. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/__init__.py +0 -0
  193. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/deprecated_node_in_workflow_problem.py +0 -0
  194. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_dependency_version_string_problem.py +0 -0
  195. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_library_version_string_problem.py +0 -0
  196. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_schema_problem.py +0 -0
  197. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_section_count_problem.py +0 -0
  198. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_toml_format_problem.py +0 -0
  199. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_not_registered_problem.py +0 -0
  200. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_below_required_problem.py +0 -0
  201. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_large_difference_problem.py +0 -0
  202. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_major_mismatch_problem.py +0 -0
  203. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_minor_difference_problem.py +0 -0
  204. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_creation_date_problem.py +0 -0
  205. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_last_modified_date_problem.py +0 -0
  206. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_toml_section_problem.py +0 -0
  207. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/node_type_not_found_problem.py +0 -0
  208. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_found_problem.py +0 -0
  209. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py +0 -0
  210. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py +0 -0
  211. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/library_manager.py +0 -0
  212. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/mcp_manager.py +0 -0
  213. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/model_manager.py +0 -0
  214. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  215. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/os_manager.py +0 -0
  216. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/project_manager.py +0 -0
  217. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_components/__init__.py +0 -0
  218. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_components/capability_field.py +0 -0
  219. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_components/comparator.py +0 -0
  220. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +0 -0
  221. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_components/resource_type.py +0 -0
  222. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_manager.py +0 -0
  223. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_types/__init__.py +0 -0
  224. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_types/compute_resource.py +0 -0
  225. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +0 -0
  226. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/resource_types/os_resource.py +0 -0
  227. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/secrets_manager.py +0 -0
  228. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/session_manager.py +0 -0
  229. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/settings.py +0 -0
  230. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/static_files_manager.py +0 -0
  231. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/sync_manager.py +0 -0
  232. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/user_manager.py +0 -0
  233. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/variable_manager.py +0 -0
  234. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +0 -0
  235. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/managers/workflow_manager.py +0 -0
  236. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/utils/__init__.py +0 -0
  237. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  238. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/retained_mode/variable_types.py +0 -0
  239. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/servers/__init__.py +0 -0
  240. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/servers/mcp.py +0 -0
  241. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/servers/static.py +0 -0
  242. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/__init__.py +0 -0
  243. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/add_param_button.py +0 -0
  244. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/button.py +0 -0
  245. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/clamp.py +0 -0
  246. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/color_picker.py +0 -0
  247. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/compare.py +0 -0
  248. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/compare_images.py +0 -0
  249. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/file_system_picker.py +0 -0
  250. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/minmax.py +0 -0
  251. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/multi_options.py +0 -0
  252. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/numbers_selector.py +0 -0
  253. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/options.py +0 -0
  254. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/slider.py +0 -0
  255. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/trait_registry.py +0 -0
  256. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/traits/traits.json +0 -0
  257. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/updater/__init__.py +0 -0
  258. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/updater/__main__.py +0 -0
  259. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/__init__.py +0 -0
  260. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/async_utils.py +0 -0
  261. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/dict_utils.py +0 -0
  262. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/file_utils.py +0 -0
  263. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/git_utils.py +0 -0
  264. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/huggingface_utils.py +0 -0
  265. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/image_preview.py +0 -0
  266. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/library_utils.py +0 -0
  267. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/metaclasses.py +0 -0
  268. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/uv_utils.py +0 -0
  269. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/utils/version_utils.py +0 -0
  270. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/__init__.py +0 -0
  271. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  272. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
  273. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +0 -0
  274. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_63_8/__init__.py +0 -0
  275. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_63_8/deprecated_nodegroup_parameters.py +0 -0
  276. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_65_4/__init__.py +0 -0
  277. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_65_4/run_in_parallel_to_run_in_order.py +0 -0
  278. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_65_5/__init__.py +0 -0
  279. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_65_5/flux_2_removed_parameters.py +0 -0
  280. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py +0 -0
  281. {griptape_nodes-0.68.1 → griptape_nodes-0.70.0}/src/griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.68.1
3
+ Version: 0.70.0
4
4
  Summary: Add your description here
5
- Requires-Dist: griptape>=1.8.12
5
+ Requires-Dist: griptape>=1.9.0
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
9
9
  Requires-Dist: httpx>=0.28.0,<1.0.0
10
- Requires-Dist: websockets>=15.0.1,<16.0.0
10
+ Requires-Dist: websockets>=15.0.1,<17.0.0
11
11
  Requires-Dist: tomlkit>=0.13.2
12
12
  Requires-Dist: uv>=0.6.16
13
13
  Requires-Dist: fastapi>=0.115.12
@@ -1,16 +1,16 @@
1
1
  [project]
2
2
  name = "griptape-nodes"
3
- version = "0.68.1"
3
+ version = "0.70.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.12",
8
+ "griptape>=1.9.0",
9
9
  "pydantic>=2.10.6",
10
10
  "python-dotenv>=1.0.1",
11
11
  "xdg-base-dirs>=6.0.2",
12
12
  "httpx>=0.28.0,<1.0.0",
13
- "websockets>=15.0.1,<16.0.0",
13
+ "websockets>=15.0.1,<17.0.0",
14
14
  "tomlkit>=0.13.2",
15
15
  # TODO: https://github.com/griptape-ai/griptape-nodes/issues/833
16
16
  "uv>=0.6.16",
@@ -168,7 +168,11 @@ class Client:
168
168
  logger.debug("WebSocket client connected")
169
169
  except TimeoutError as e:
170
170
  logger.error("Failed to connect WebSocket client: timeout")
171
- msg = "Connection timeout"
171
+ msg = (
172
+ "Connection timeout - failed to connect to Nodes API. "
173
+ "This usually indicates an invalid or missing GT_CLOUD_API_KEY. "
174
+ "Please verify your API key is correct."
175
+ )
172
176
  raise ConnectionError(msg) from e
173
177
 
174
178
  async def _disconnect(self) -> None:
@@ -3,11 +3,14 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import json
5
5
  import logging
6
+ import sys
6
7
  import threading
7
8
  from dataclasses import dataclass
8
9
 
10
+ from rich.align import Align
9
11
  from rich.console import Console
10
12
  from rich.logging import RichHandler
13
+ from rich.panel import Panel
11
14
 
12
15
  from griptape_nodes.api_client import Client
13
16
  from griptape_nodes.retained_mode.events import app_events, execution_events
@@ -113,6 +116,35 @@ logging.basicConfig(
113
116
  console = Console()
114
117
 
115
118
 
119
+ def _ensure_api_key() -> str:
120
+ """Verify that GT_CLOUD_API_KEY is set, exit with clear error message if not.
121
+
122
+ Returns:
123
+ The API key value
124
+
125
+ Raises:
126
+ SystemExit: If API key is missing or empty
127
+ """
128
+ secrets_manager = griptape_nodes.SecretsManager()
129
+ api_key = secrets_manager.get_secret("GT_CLOUD_API_KEY", should_error_on_not_found=False)
130
+
131
+ if not api_key:
132
+ message = Panel(
133
+ Align.center(
134
+ "[bold red]Nodes API key is not set, please run [code]gtn init[/code] with a valid key:[/bold red]\n"
135
+ "[code]gtn init --api-key <your key>[/code]\n\n"
136
+ "[bold red]You can generate a new key from [/bold red][bold blue][link=https://nodes.griptape.ai]https://nodes.griptape.ai[/link][/bold blue]",
137
+ ),
138
+ title="[red]X[/red] Missing Nodes API Key",
139
+ border_style="red",
140
+ padding=(1, 4),
141
+ )
142
+ console.print(message)
143
+ sys.exit(1)
144
+
145
+ return api_key
146
+
147
+
116
148
  def start_app() -> None:
117
149
  """Legacy sync entry point - runs async app."""
118
150
  try:
@@ -125,6 +157,9 @@ def start_app() -> None:
125
157
 
126
158
  async def astart_app() -> None:
127
159
  """New async app entry point."""
160
+ # Verify API key is set before starting
161
+ _ensure_api_key()
162
+
128
163
  # Initialize event queue in main thread
129
164
  griptape_nodes.EventManager().initialize_queue()
130
165
 
@@ -154,6 +189,22 @@ def _start_websocket_connection() -> None:
154
189
 
155
190
  # Run the async WebSocket tasks
156
191
  loop.run_until_complete(_run_websocket_tasks())
192
+ except ConnectionError:
193
+ # Connection failed - likely due to invalid/missing API key
194
+ message = Panel(
195
+ Align.center(
196
+ "[bold red]Failed to connect to Nodes API.[/bold red]\n\n"
197
+ "This usually indicates an invalid or missing [code]GT_CLOUD_API_KEY[/code].\n\n"
198
+ "[bold red]Please verify your API key:[/bold red]\n"
199
+ "[code]gtn init --api-key <your key>[/code]\n\n"
200
+ "[bold red]You can generate a new key from [/bold red][bold blue][link=https://nodes.griptape.ai]https://nodes.griptape.ai[/link][/bold blue]",
201
+ ),
202
+ title="[red]X[/red] Connection Failed",
203
+ border_style="red",
204
+ padding=(1, 4),
205
+ )
206
+ console.print(message)
207
+ sys.exit(1)
157
208
  except Exception as e:
158
209
  logger.error("WebSocket thread error: %s", e)
159
210
  raise
@@ -65,8 +65,7 @@ class BaseNodeGroup(BaseNode):
65
65
  Args:
66
66
  nodes: A list of nodes to add to this group
67
67
  """
68
- for node in nodes:
69
- self.nodes[node.name] = node
68
+ self._add_nodes_to_group_dict(nodes)
70
69
 
71
70
  node_names_in_group = set(self.nodes.keys())
72
71
  self.metadata["node_names_in_group"] = list(node_names_in_group)
@@ -93,3 +92,24 @@ class BaseNodeGroup(BaseNode):
93
92
  if node.name not in self.nodes:
94
93
  msg = f"Node {node.name} is not in node group {self.name}"
95
94
  raise ValueError(msg)
95
+
96
+ def handle_child_node_rename(self, old_name: str, new_name: str) -> None:
97
+ """Update group membership when a child node is renamed.
98
+
99
+ Args:
100
+ old_name: The old name of the child node
101
+ new_name: The new name of the child node
102
+ """
103
+ if old_name not in self.nodes:
104
+ return
105
+
106
+ # Update the nodes dictionary
107
+ node = self.nodes.pop(old_name)
108
+ self.nodes[new_name] = node
109
+
110
+ # Update the metadata
111
+ node_names_in_group = self.metadata.get("node_names_in_group", [])
112
+ if old_name in node_names_in_group:
113
+ node_names_in_group.remove(old_name)
114
+ node_names_in_group.append(new_name)
115
+ self.metadata["node_names_in_group"] = node_names_in_group
@@ -1623,7 +1623,7 @@ class EndNode(BaseNode):
1623
1623
  self,
1624
1624
  was_successful_modes={ParameterMode.PROPERTY},
1625
1625
  result_details_modes={ParameterMode.INPUT},
1626
- parameter_group_initially_collapsed=False,
1626
+ parameter_group_initially_collapsed=True,
1627
1627
  result_details_placeholder="Details about the completion or failure will be shown here.",
1628
1628
  )
1629
1629
 
@@ -83,6 +83,17 @@ class ExecutionStatusComponent:
83
83
  """
84
84
  return self._status_group
85
85
 
86
+ def _update_status_group_display_label(self, *, show_warning: bool) -> None:
87
+ """Update the Status ParameterGroup display label with optional warning emoji."""
88
+ if show_warning:
89
+ self._status_group.update_ui_options_key("display_name", "⚠️ Status")
90
+ return
91
+
92
+ # Remove display_name to use default "Status" from name
93
+ ui_options = self._status_group.ui_options.copy()
94
+ ui_options.pop("display_name", None)
95
+ self._status_group.ui_options = ui_options
96
+
86
97
  def set_execution_result(self, *, was_successful: bool, result_details: str) -> None:
87
98
  """Set the execution result values.
88
99
 
@@ -92,6 +103,16 @@ class ExecutionStatusComponent:
92
103
  """
93
104
  self._update_parameter_value(self._was_successful, was_successful)
94
105
  self._update_parameter_value(self._result_details, result_details)
106
+ # Update display label: show warning emoji only on actual failure (not placeholder/initialization messages)
107
+ # While string matching is not the best practice, it's currently the only way to check for placeholder messages.
108
+ # TODO: use a better approach to check for placeholder messages. https://github.com/griptape-ai/griptape-nodes/issues/3686
109
+ is_placeholder = result_details in (
110
+ "<Results will appear when the node executes>",
111
+ "Beginning execution...",
112
+ "",
113
+ )
114
+ show_warning = not was_successful and not is_placeholder
115
+ self._update_status_group_display_label(show_warning=show_warning)
95
116
 
96
117
  def clear_execution_status(self, initial_message: str | None = None) -> None:
97
118
  """Clear execution status and reset parameters.
@@ -102,6 +123,8 @@ class ExecutionStatusComponent:
102
123
  if initial_message is None:
103
124
  initial_message = ""
104
125
  self.set_execution_result(was_successful=False, result_details=initial_message)
126
+ # Reset to "Status" during execution (not a failure yet)
127
+ self._update_status_group_display_label(show_warning=False)
105
128
 
106
129
  def append_to_result_details(self, additional_text: str, separator: str = "\n") -> None:
107
130
  """Append text to the existing result_details.
@@ -20,7 +20,7 @@ class LogParameter:
20
20
  output_type="str",
21
21
  allowed_modes={ParameterMode.OUTPUT},
22
22
  tooltip="logs",
23
- ui_options={"multiline": True},
23
+ ui_options={"multiline": True, "placeholder_text": ""},
24
24
  )
25
25
  )
26
26
 
@@ -68,6 +68,10 @@ class StdoutCapture:
68
68
  def flush(self) -> None:
69
69
  self._original_stdout.flush()
70
70
 
71
+ def isatty(self) -> bool:
72
+ # Return False to prevent libraries from outputting ANSI color codes
73
+ return False
74
+
71
75
  def __enter__(self) -> "StdoutCapture":
72
76
  sys.stdout = self
73
77
  return self
@@ -3,6 +3,8 @@ from typing import Any
3
3
 
4
4
  from griptape_nodes.exe_types.core_types import Parameter, ParameterMode
5
5
  from griptape_nodes.exe_types.node_types import BaseNode
6
+ from griptape_nodes.exe_types.param_types.parameter_bool import ParameterBool
7
+ from griptape_nodes.exe_types.param_types.parameter_int import ParameterInt
6
8
 
7
9
 
8
10
  class SeedParameter:
@@ -10,24 +12,20 @@ class SeedParameter:
10
12
  self._node = node
11
13
  self._max_seed = max_seed
12
14
 
13
- def add_input_parameters(self) -> None:
14
- self._node.add_parameter(
15
- Parameter(
16
- name="randomize_seed",
17
- type="bool",
18
- output_type="bool",
19
- tooltip="randomize the seed on each run",
20
- default_value=False,
21
- )
15
+ def add_input_parameters(self, *, inside_param_group: bool = False) -> None:
16
+ randomize_seed_parameter = ParameterBool(
17
+ name="randomize_seed",
18
+ tooltip="randomize the seed on each run",
19
+ default_value=False,
22
20
  )
23
- self._node.add_parameter(
24
- Parameter(
25
- name="seed",
26
- type="int",
27
- tooltip="seed",
28
- default_value=42,
29
- )
21
+ seed_parameter = ParameterInt(
22
+ name="seed",
23
+ tooltip="the seed to use for the generation",
24
+ default_value=42,
30
25
  )
26
+ if not inside_param_group:
27
+ self._node.add_parameter(randomize_seed_parameter)
28
+ self._node.add_parameter(seed_parameter)
31
29
 
32
30
  def remove_input_parameters(self) -> None:
33
31
  self._node.remove_parameter_element_by_name("randomize_seed")
@@ -390,8 +390,6 @@ class GetAllNodeInfoResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailure)
390
390
  class SetLockNodeStateRequest(WorkflowNotAlteredMixin, RequestPayload):
391
391
  """Lock a node.
392
392
 
393
- Use when: Implementing locking functionality, preventing changes to nodes.
394
-
395
393
  Args:
396
394
  node_name: Name of the node to lock
397
395
  lock: Whether to lock or unlock the node. If true, the node will be locked, otherwise it will be unlocked.
@@ -418,6 +416,39 @@ class SetLockNodeStateResultFailure(WorkflowNotAlteredMixin, ResultPayloadFailur
418
416
  """Node failed to lock."""
419
417
 
420
418
 
419
+ @dataclass
420
+ @PayloadRegistry.register
421
+ class BatchSetNodeLockStateRequest(WorkflowNotAlteredMixin, RequestPayload):
422
+ """Set lock state for multiple nodes in a single request.
423
+
424
+ Use when: Locking or unlocking multiple nodes at once, consistent with BatchSetNodeMetadataRequest.
425
+
426
+ Args:
427
+ node_names: Names of nodes to lock/unlock.
428
+ lock: Whether to lock (True) or unlock (False) the nodes.
429
+
430
+ Results: BatchSetNodeLockStateResultSuccess | BatchSetNodeLockStateResultFailure
431
+ """
432
+
433
+ node_names: list[str]
434
+ lock: bool
435
+
436
+
437
+ @dataclass
438
+ @PayloadRegistry.register
439
+ class BatchSetNodeLockStateResultSuccess(WorkflowNotAlteredMixin, ResultPayloadSuccess):
440
+ """Batch node lock state update completed successfully."""
441
+
442
+ updated_nodes: list[str]
443
+ failed_nodes: dict[str, str] = field(default_factory=dict)
444
+
445
+
446
+ @dataclass
447
+ @PayloadRegistry.register
448
+ class BatchSetNodeLockStateResultFailure(ResultPayloadFailure):
449
+ """Batch node lock state update failed. Common causes: all nodes not found."""
450
+
451
+
421
452
  # A Node's state can be serialized to a sequence of commands that the engine runs.
422
453
  @dataclass
423
454
  class SerializedNodeCommands:
@@ -533,6 +564,7 @@ class SerializeNodeToCommandsRequest(RequestPayload):
533
564
  serialized_parameter_value_tracker: SerializedParameterValueTracker = field(
534
565
  default_factory=SerializedParameterValueTracker
535
566
  )
567
+ use_pickling: bool = False
536
568
 
537
569
 
538
570
  @dataclass
@@ -617,7 +649,8 @@ class SerializeSelectedNodesToCommandsResultSuccess(WorkflowNotAlteredMixin, Res
617
649
 
618
650
  # They will be passed with node_name, timestamp
619
651
  # Could be a flow command if it's all nodes in a flow.
620
- serialized_selected_node_commands: SerializedSelectedNodesCommands
652
+ serialized_selected_node_commands: str
653
+ pickled_values: dict[str, str]
621
654
 
622
655
 
623
656
  @dataclass
@@ -643,6 +676,8 @@ class DeserializeSelectedNodesFromCommandsRequest(WorkflowNotAlteredMixin, Reque
643
676
  Results: DeserializeSelectedNodesFromCommandsResultSuccess (with node names) | DeserializeSelectedNodesFromCommandsResultFailure (deserialization error)
644
677
  """
645
678
 
679
+ deserialize_commands: str
680
+ pickled_values: dict[str, str]
646
681
  positions: list[NewPosition] | None = None
647
682
 
648
683
 
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING, Any
4
+ from typing import TYPE_CHECKING
5
5
 
6
6
  from griptape_nodes.exe_types.flow import ControlFlow
7
7
  from griptape_nodes.retained_mode.events.context_events import (
@@ -18,8 +18,6 @@ if TYPE_CHECKING:
18
18
  from griptape_nodes.exe_types.core_types import BaseNodeElement
19
19
  from griptape_nodes.exe_types.node_types import BaseNode
20
20
  from griptape_nodes.retained_mode.events.base_events import ResultPayload
21
- from griptape_nodes.retained_mode.events.flow_events import SerializedFlowCommands
22
- from griptape_nodes.retained_mode.events.node_events import SerializedSelectedNodesCommands
23
21
  from griptape_nodes.retained_mode.managers.event_manager import EventManager
24
22
 
25
23
  logger = logging.getLogger("griptape_nodes")
@@ -34,7 +32,6 @@ class ContextManager:
34
32
  """
35
33
 
36
34
  _workflow_stack: list[ContextManager.WorkflowContextState]
37
- _clipboard: ClipBoard
38
35
 
39
36
  class WorkflowContextError(Exception):
40
37
  """Base exception for workflow context errors."""
@@ -242,32 +239,9 @@ class ContextManager:
242
239
  ) -> None:
243
240
  self._manager.pop_element()
244
241
 
245
- class ClipBoard:
246
- """Keeps Commands for Copying or Pasting."""
247
-
248
- # Contains flow, node, parameter, connections
249
- flow_commands: SerializedFlowCommands | None
250
- # Contains node and Parameter and relevant connections
251
- node_commands: SerializedSelectedNodesCommands | None
252
- parameter_uuid_to_values: dict[str, Any] | None
253
-
254
- def __init__(self) -> None:
255
- self.flow_commands = None
256
- self.node_commands = None
257
- self.parameter_uuid_to_values = None
258
-
259
- def clear(self) -> None:
260
- del self.flow_commands
261
- self.flow_commands = None
262
- del self.node_commands
263
- self.node_commands = None
264
- if self.parameter_uuid_to_values is not None:
265
- self.parameter_uuid_to_values.clear()
266
-
267
242
  def __init__(self, event_manager: EventManager) -> None:
268
243
  """Initialize the context manager with empty workflow and flow stacks."""
269
244
  self._workflow_stack = []
270
- self._clipboard = self.ClipBoard()
271
245
  event_manager.assign_manager_to_request_type(
272
246
  request_type=SetWorkflowContextRequest, callback=self.on_set_workflow_context_request
273
247
  )
@@ -17,7 +17,7 @@ from griptape_nodes.exe_types.core_types import (
17
17
  ParameterTypeBuiltin,
18
18
  )
19
19
  from griptape_nodes.exe_types.flow import ControlFlow
20
- from griptape_nodes.exe_types.node_groups import SubflowNodeGroup
20
+ from griptape_nodes.exe_types.node_groups import BaseNodeGroup, SubflowNodeGroup
21
21
  from griptape_nodes.exe_types.node_types import (
22
22
  BaseNode,
23
23
  ErrorProxyNode,
@@ -1530,9 +1530,9 @@ class FlowManager:
1530
1530
  if node_name is not None:
1531
1531
  node_name_to_uuid[node_name] = serialize_result.serialized_node_commands.node_uuid
1532
1532
 
1533
- # SubflowNodeGroups must be serialized LAST because they reference child node names via node_names_to_add
1533
+ # BaseNodeGroups must be serialized LAST because they reference child node names via node_names_to_add
1534
1534
  # If we deserialize a NodeGroup before its children, the child nodes won't exist yet
1535
- if isinstance(node, SubflowNodeGroup):
1535
+ if isinstance(node, BaseNodeGroup):
1536
1536
  serialized_node_group_commands.append(serialize_result.serialized_node_commands)
1537
1537
  else:
1538
1538
  serialized_node_commands.append(serialize_result.serialized_node_commands)
@@ -1543,7 +1543,7 @@ class FlowManager:
1543
1543
  serialize_result.set_parameter_value_commands
1544
1544
  )
1545
1545
 
1546
- # Update SubflowNodeGroup commands to use UUIDs instead of names in node_names_to_add
1546
+ # Update BaseNodeGroup commands to use UUIDs instead of names in node_names_to_add
1547
1547
  # This allows workflow generation to directly look up variable names from UUIDs
1548
1548
 
1549
1549
  for node_group_command in serialized_node_group_commands:
@@ -3224,9 +3224,9 @@ class FlowManager:
3224
3224
  # Store the serialized node's UUID for correlation to connections and setting parameter values later.
3225
3225
  node_name_to_uuid[node_name] = serialized_node.node_uuid
3226
3226
 
3227
- # SubflowNodeGroups must be serialized LAST because CreateNodeGroupRequest references child node names
3227
+ # BaseNodeGroups must be serialized LAST because CreateNodeGroupRequest references child node names
3228
3228
  # If we deserialize a NodeGroup before its children, the child nodes won't exist yet
3229
- if isinstance(node, SubflowNodeGroup):
3229
+ if isinstance(node, BaseNodeGroup):
3230
3230
  serialized_node_group_commands.append(serialized_node)
3231
3231
  else:
3232
3232
  serialized_node_commands.append(serialized_node)
@@ -3299,7 +3299,7 @@ class FlowManager:
3299
3299
  # This ensures child nodes exist before their parent NodeGroups are created during deserialization
3300
3300
  serialized_node_commands.extend(serialized_node_group_commands)
3301
3301
 
3302
- # Update SubflowNodeGroup commands to use UUIDs instead of names in node_names_to_add
3302
+ # Update BaseNodeGroup commands to use UUIDs instead of names in node_names_to_add
3303
3303
  # This allows workflow generation to directly look up variable names from UUIDs
3304
3304
  # Build a complete node name to UUID map including nodes from all subflows
3305
3305
  complete_node_name_to_uuid = dict(node_name_to_uuid) # Start with current flow's nodes