griptape-nodes 0.45.1__tar.gz → 0.64.8__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 (301) hide show
  1. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/PKG-INFO +12 -3
  2. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/README.md +1 -0
  3. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/pyproject.toml +38 -13
  4. griptape_nodes-0.64.8/src/griptape_nodes/__init__.py +24 -0
  5. griptape_nodes-0.64.8/src/griptape_nodes/__main__.py +6 -0
  6. griptape_nodes-0.64.8/src/griptape_nodes/api_client/__init__.py +9 -0
  7. griptape_nodes-0.64.8/src/griptape_nodes/api_client/client.py +279 -0
  8. griptape_nodes-0.64.8/src/griptape_nodes/api_client/request_client.py +278 -0
  9. griptape_nodes-0.64.8/src/griptape_nodes/app/app.py +414 -0
  10. griptape_nodes-0.64.8/src/griptape_nodes/app/watch.py +54 -0
  11. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/utils/__init__.py +1 -0
  12. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/utils/python_subprocess_executor.py +122 -0
  13. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +385 -0
  14. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +258 -0
  15. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +306 -0
  16. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +1 -0
  17. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +58 -0
  18. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +43 -0
  19. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_publishers/__init__.py +1 -0
  20. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +44 -0
  21. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +86 -0
  22. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +1 -0
  23. griptape_nodes-0.64.8/src/griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +69 -0
  24. griptape_nodes-0.64.8/src/griptape_nodes/cli/__init__.py +1 -0
  25. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/__init__.py +1 -0
  26. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/config.py +74 -0
  27. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/engine.py +69 -0
  28. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/init.py +684 -0
  29. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/libraries.py +101 -0
  30. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/models.py +523 -0
  31. griptape_nodes-0.64.8/src/griptape_nodes/cli/commands/self.py +120 -0
  32. griptape_nodes-0.64.8/src/griptape_nodes/cli/main.py +61 -0
  33. griptape_nodes-0.64.8/src/griptape_nodes/cli/shared.py +77 -0
  34. griptape_nodes-0.64.8/src/griptape_nodes/common/__init__.py +1 -0
  35. griptape_nodes-0.64.8/src/griptape_nodes/common/directed_graph.py +71 -0
  36. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/__init__.py +43 -0
  37. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/core.py +242 -0
  38. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/exceptions.py +122 -0
  39. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/formats.py +179 -0
  40. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/matching.py +137 -0
  41. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/parsing.py +212 -0
  42. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/resolution.py +186 -0
  43. griptape_nodes-0.64.8/src/griptape_nodes/common/macro_parser/segments.py +42 -0
  44. griptape_nodes-0.64.8/src/griptape_nodes/common/node_executor.py +566 -0
  45. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/__init__.py +49 -0
  46. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/default_project_template.py +87 -0
  47. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/defaults/README.md +36 -0
  48. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/directory.py +67 -0
  49. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/loader.py +342 -0
  50. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/project.py +252 -0
  51. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/situation.py +143 -0
  52. griptape_nodes-0.64.8/src/griptape_nodes/common/project_templates/validation.py +140 -0
  53. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/storage/base_storage_driver.py +29 -20
  54. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +23 -46
  55. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/storage/local_storage_driver.py +24 -14
  56. griptape_nodes-0.64.8/src/griptape_nodes/drivers/thread_storage/__init__.py +15 -0
  57. griptape_nodes-0.64.8/src/griptape_nodes/drivers/thread_storage/base_thread_storage_driver.py +106 -0
  58. griptape_nodes-0.64.8/src/griptape_nodes/drivers/thread_storage/griptape_cloud_thread_storage_driver.py +213 -0
  59. griptape_nodes-0.64.8/src/griptape_nodes/drivers/thread_storage/local_thread_storage_driver.py +137 -0
  60. griptape_nodes-0.64.8/src/griptape_nodes/drivers/thread_storage/thread_storage_backend.py +10 -0
  61. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/exe_types/connections.py +88 -11
  62. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/exe_types/core_types.py +779 -41
  63. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/exe_types/flow.py +3 -3
  64. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/node_types.py +2292 -0
  65. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/__init__.py +1 -0
  66. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/artifact_url/__init__.py +1 -0
  67. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/artifact_url/public_artifact_url_parameter.py +155 -0
  68. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/execution_status_component.py +138 -0
  69. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/huggingface/__init__.py +1 -0
  70. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_model_parameter.py +168 -0
  71. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_file_parameter.py +38 -0
  72. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter.py +33 -0
  73. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py +136 -0
  74. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/log_parameter.py +136 -0
  75. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/progress_bar_component.py +57 -0
  76. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_components/seed_parameter.py +59 -0
  77. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/__init__.py +1 -0
  78. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_audio.py +243 -0
  79. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_bool.py +221 -0
  80. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_float.py +179 -0
  81. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_image.py +243 -0
  82. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_int.py +183 -0
  83. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_number.py +380 -0
  84. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_string.py +259 -0
  85. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_three_d.py +215 -0
  86. griptape_nodes-0.64.8/src/griptape_nodes/exe_types/param_types/parameter_video.py +243 -0
  87. griptape_nodes-0.64.8/src/griptape_nodes/machines/control_flow.py +463 -0
  88. griptape_nodes-0.64.8/src/griptape_nodes/machines/dag_builder.py +284 -0
  89. griptape_nodes-0.64.8/src/griptape_nodes/machines/fsm.py +78 -0
  90. griptape_nodes-0.64.8/src/griptape_nodes/machines/parallel_resolution.py +652 -0
  91. griptape_nodes-0.45.1/src/griptape_nodes/machines/node_resolution.py → griptape_nodes-0.64.8/src/griptape_nodes/machines/sequential_resolution.py +244 -192
  92. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/node_library/library_registry.py +77 -16
  93. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/node_library/workflow_registry.py +114 -3
  94. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/agent_events.py +392 -0
  95. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/app_events.py +64 -1
  96. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/base_events.py +103 -40
  97. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/config_events.py +30 -0
  98. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/execution_events.py +66 -9
  99. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/flow_events.py +104 -12
  100. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/library_events.py +32 -3
  101. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/mcp_events.py +363 -0
  102. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/model_events.py +296 -0
  103. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/node_events.py +393 -12
  104. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/os_events.py +576 -0
  105. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/parameter_events.py +138 -2
  106. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/project_events.py +528 -0
  107. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/resource_events.py +290 -0
  108. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/secrets_events.py +2 -0
  109. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/events/variable_events.py +361 -0
  110. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/workflow_events.py +129 -4
  111. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/griptape_nodes.py +125 -229
  112. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/agent_manager.py +559 -0
  113. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +71 -0
  114. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/config_manager.py +76 -90
  115. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/context_manager.py +6 -5
  116. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +297 -0
  117. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/event_manager.py +334 -0
  118. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/__init__.py +1 -0
  119. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py +59 -0
  120. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py +33 -0
  121. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/after_library_callback_problem.py +32 -0
  122. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/before_library_callback_problem.py +32 -0
  123. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/create_config_category_problem.py +32 -0
  124. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/dependency_installation_failed_problem.py +32 -0
  125. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/deprecated_node_warning_problem.py +83 -0
  126. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_library_problem.py +28 -0
  127. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/duplicate_node_registration_problem.py +44 -0
  128. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/engine_version_error_problem.py +28 -0
  129. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/insufficient_disk_space_problem.py +33 -0
  130. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/invalid_version_string_problem.py +32 -0
  131. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_json_decode_problem.py +28 -0
  132. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_load_exception_problem.py +32 -0
  133. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_not_found_problem.py +30 -0
  134. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_problem.py +20 -0
  135. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_exception_problem.py +32 -0
  136. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/library_schema_validation_problem.py +38 -0
  137. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_deprecation_warning_problem.py +44 -0
  138. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/modified_parameters_set_removed_problem.py +44 -0
  139. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_base_node_problem.py +40 -0
  140. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_class_not_found_problem.py +38 -0
  141. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/node_module_import_problem.py +53 -0
  142. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/sandbox_directory_missing_problem.py +28 -0
  143. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_incompatible_problem.py +44 -0
  144. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/ui_options_field_modified_warning_problem.py +35 -0
  145. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/update_config_category_problem.py +32 -0
  146. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/libraries/venv_creation_failed_problem.py +32 -0
  147. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/__init__.py +75 -0
  148. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/deprecated_node_in_workflow_problem.py +83 -0
  149. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_dependency_version_string_problem.py +38 -0
  150. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_library_version_string_problem.py +38 -0
  151. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_schema_problem.py +31 -0
  152. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_metadata_section_count_problem.py +31 -0
  153. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/invalid_toml_format_problem.py +30 -0
  154. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_not_registered_problem.py +35 -0
  155. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_below_required_problem.py +41 -0
  156. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_large_difference_problem.py +41 -0
  157. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_major_mismatch_problem.py +41 -0
  158. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/library_version_minor_difference_problem.py +41 -0
  159. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_creation_date_problem.py +30 -0
  160. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_last_modified_date_problem.py +30 -0
  161. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/missing_toml_section_problem.py +30 -0
  162. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/node_type_not_found_problem.py +51 -0
  163. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_found_problem.py +27 -0
  164. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py +20 -0
  165. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py +39 -0
  166. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/flow_manager.py +3514 -0
  167. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py +15 -15
  168. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py +20 -20
  169. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py +1 -1
  170. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py +1 -1
  171. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py +21 -6
  172. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py +1 -1
  173. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py +1 -1
  174. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_manager.py +482 -270
  175. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/mcp_manager.py +372 -0
  176. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/model_manager.py +1196 -0
  177. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/node_manager.py +1818 -389
  178. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/object_manager.py +26 -17
  179. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/os_manager.py +1805 -0
  180. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/project_manager.py +1067 -0
  181. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_components/__init__.py +1 -0
  182. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_components/capability_field.py +41 -0
  183. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_components/comparator.py +18 -0
  184. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_components/resource_instance.py +236 -0
  185. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_components/resource_type.py +79 -0
  186. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_manager.py +306 -0
  187. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_types/__init__.py +1 -0
  188. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py +108 -0
  189. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/resource_types/os_resource.py +87 -0
  190. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/secrets_manager.py +39 -9
  191. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/session_manager.py +365 -0
  192. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/settings.py +241 -0
  193. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/static_files_manager.py +255 -0
  194. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/sync_manager.py +37 -24
  195. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/user_manager.py +120 -0
  196. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/variable_manager.py +529 -0
  197. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +386 -0
  198. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/workflow_manager.py +1337 -780
  199. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/retained_mode.py +341 -50
  200. griptape_nodes-0.64.8/src/griptape_nodes/retained_mode/variable_types.py +18 -0
  201. griptape_nodes-0.64.8/src/griptape_nodes/servers/__init__.py +1 -0
  202. griptape_nodes-0.45.1/src/griptape_nodes/mcp_server/server.py → griptape_nodes-0.64.8/src/griptape_nodes/servers/mcp.py +70 -26
  203. griptape_nodes-0.64.8/src/griptape_nodes/servers/static.py +195 -0
  204. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/add_param_button.py +1 -1
  205. griptape_nodes-0.64.8/src/griptape_nodes/traits/button.py +368 -0
  206. griptape_nodes-0.64.8/src/griptape_nodes/traits/color_picker.py +66 -0
  207. griptape_nodes-0.64.8/src/griptape_nodes/traits/multi_options.py +216 -0
  208. griptape_nodes-0.64.8/src/griptape_nodes/traits/numbers_selector.py +77 -0
  209. griptape_nodes-0.64.8/src/griptape_nodes/traits/options.py +133 -0
  210. griptape_nodes-0.64.8/src/griptape_nodes/traits/traits.json +8 -0
  211. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/updater/__init__.py +3 -2
  212. griptape_nodes-0.64.8/src/griptape_nodes/utils/__init__.py +5 -0
  213. griptape_nodes-0.64.8/src/griptape_nodes/utils/async_utils.py +156 -0
  214. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/utils/dict_utils.py +8 -2
  215. griptape_nodes-0.64.8/src/griptape_nodes/utils/huggingface_utils.py +136 -0
  216. griptape_nodes-0.64.8/src/griptape_nodes/utils/version_utils.py +126 -0
  217. griptape_nodes-0.64.8/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +86 -0
  218. griptape_nodes-0.64.8/src/griptape_nodes/version_compatibility/versions/v0_63_8/__init__.py +1 -0
  219. griptape_nodes-0.64.8/src/griptape_nodes/version_compatibility/versions/v0_63_8/deprecated_nodegroup_parameters.py +105 -0
  220. griptape_nodes-0.64.8/src/griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py +1 -0
  221. griptape_nodes-0.64.8/src/griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py +52 -0
  222. griptape_nodes-0.45.1/src/griptape_nodes/__init__.py +0 -941
  223. griptape_nodes-0.45.1/src/griptape_nodes/app/api.py +0 -195
  224. griptape_nodes-0.45.1/src/griptape_nodes/app/app.py +0 -464
  225. griptape_nodes-0.45.1/src/griptape_nodes/app/watch.py +0 -71
  226. griptape_nodes-0.45.1/src/griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +0 -219
  227. griptape_nodes-0.45.1/src/griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +0 -90
  228. griptape_nodes-0.45.1/src/griptape_nodes/bootstrap/workflow_executors/workflow_executor.py +0 -19
  229. griptape_nodes-0.45.1/src/griptape_nodes/exe_types/node_types.py +0 -1119
  230. griptape_nodes-0.45.1/src/griptape_nodes/machines/control_flow.py +0 -249
  231. griptape_nodes-0.45.1/src/griptape_nodes/machines/fsm.py +0 -69
  232. griptape_nodes-0.45.1/src/griptape_nodes/mcp_server/ws_request_manager.py +0 -268
  233. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/events/agent_events.py +0 -165
  234. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/events/os_events.py +0 -232
  235. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/agent_manager.py +0 -248
  236. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +0 -51
  237. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/engine_identity_manager.py +0 -146
  238. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/event_manager.py +0 -157
  239. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/flow_manager.py +0 -2053
  240. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/os_manager.py +0 -830
  241. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/session_manager.py +0 -328
  242. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/settings.py +0 -102
  243. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/static_files_manager.py +0 -182
  244. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/managers/version_compatibility_manager.py +0 -105
  245. griptape_nodes-0.45.1/src/griptape_nodes/retained_mode/utils/engine_identity.py +0 -245
  246. griptape_nodes-0.45.1/src/griptape_nodes/traits/button.py +0 -21
  247. griptape_nodes-0.45.1/src/griptape_nodes/traits/options.py +0 -34
  248. griptape_nodes-0.45.1/src/griptape_nodes/traits/traits.json +0 -4
  249. griptape_nodes-0.45.1/src/griptape_nodes/utils/__init__.py +0 -1
  250. griptape_nodes-0.45.1/src/griptape_nodes/utils/version_utils.py +0 -51
  251. griptape_nodes-0.45.1/src/griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +0 -77
  252. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/app/.python-version +0 -0
  253. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/app/__init__.py +0 -0
  254. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/bootstrap/__init__.py +0 -0
  255. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/bootstrap/workflow_executors/__init__.py +0 -0
  256. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/__init__.py +0 -0
  257. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/storage/__init__.py +0 -0
  258. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/drivers/storage/storage_backend.py +0 -0
  259. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/exe_types/__init__.py +0 -0
  260. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/exe_types/type_validator.py +0 -0
  261. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/machines/__init__.py +0 -0
  262. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/mcp_server/__init__.py +0 -0
  263. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/node_library/__init__.py +0 -0
  264. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/node_library/advanced_node_library.py +0 -0
  265. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/py.typed +0 -0
  266. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/__init__.py +0 -0
  267. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/__init__.py +0 -0
  268. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/arbitrary_python_events.py +0 -0
  269. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/connection_events.py +0 -0
  270. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/context_events.py +0 -0
  271. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/generate_request_payload_schemas.py +0 -0
  272. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/logger_events.py +0 -0
  273. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/object_events.py +0 -0
  274. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/payload_registry.py +0 -0
  275. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/static_file_events.py +0 -0
  276. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/sync_events.py +0 -0
  277. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/events/validation_events.py +0 -0
  278. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/__init__.py +0 -0
  279. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py +0 -0
  280. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py +0 -0
  281. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py +0 -0
  282. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py +0 -0
  283. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py +0 -0
  284. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/managers/operation_manager.py +0 -0
  285. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/utils/__init__.py +0 -0
  286. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/retained_mode/utils/name_generator.py +0 -0
  287. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/__init__.py +0 -0
  288. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/clamp.py +0 -0
  289. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/compare.py +0 -0
  290. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/compare_images.py +0 -0
  291. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/file_system_picker.py +0 -0
  292. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/minmax.py +0 -0
  293. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/slider.py +0 -0
  294. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/traits/trait_registry.py +0 -0
  295. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/updater/__main__.py +0 -0
  296. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/utils/image_preview.py +0 -0
  297. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/utils/metaclasses.py +0 -0
  298. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/utils/uv_utils.py +0 -0
  299. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/version_compatibility/__init__.py +0 -0
  300. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/version_compatibility/versions/__init__.py +0 -0
  301. {griptape_nodes-0.45.1 → griptape_nodes-0.64.8}/src/griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.45.1
3
+ Version: 0.64.8
4
4
  Summary: Add your description here
5
- Requires-Dist: griptape>=1.8.0
5
+ Requires-Dist: griptape>=1.8.12
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
@@ -15,11 +15,19 @@ Requires-Dist: uvicorn>=0.34.2
15
15
  Requires-Dist: packaging>=25.0
16
16
  Requires-Dist: python-multipart>=0.0.20
17
17
  Requires-Dist: json-repair>=0.46.1
18
- Requires-Dist: imageio-ffmpeg>=0.6.0
19
18
  Requires-Dist: mcp[ws]>=1.10.1
20
19
  Requires-Dist: binaryornot>=0.4.4
21
20
  Requires-Dist: pillow>=11.3.0
22
21
  Requires-Dist: watchfiles>=1.1.0
22
+ Requires-Dist: typer>=0.15.0
23
+ Requires-Dist: huggingface-hub>=1.1.0
24
+ Requires-Dist: rich>=14.1.0
25
+ Requires-Dist: semver>=3.0.4
26
+ Requires-Dist: aiofiles>=25.1.0
27
+ Requires-Dist: aioshutil>=1.5
28
+ Requires-Dist: ruamel-yaml>=0.18.15
29
+ Requires-Dist: asyncio-thread-runner>=1.0
30
+ Requires-Dist: portalocker>=2.10.0
23
31
  Requires-Dist: austin-dist>=3.7.0 ; extra == 'profiling'
24
32
  Requires-Python: >=3.12.0, <3.13
25
33
  Provides-Extra: profiling
@@ -48,6 +56,7 @@ This repository contains the Griptape Nodes Engine - the local component that ru
48
56
  - **📚 Full Documentation:** [docs.griptapenodes.com](https://docs.griptapenodes.com)
49
57
  - **⚙️ Installation:** [docs.griptapenodes.com/en/stable/installation/](https://docs.griptapenodes.com/en/latest/installation/)
50
58
  - **🔧 Engine Configuration:** [docs.griptapenodes.com/en/stable/configuration/](https://docs.griptapenodes.com/en/latest/configuration/)
59
+ - **📋 Migration Guide:** [MIGRATION.md](MIGRATION.md) - Guide for migrating from deprecated nodes
51
60
 
52
61
  **🧩 Extending Griptape Nodes:**
53
62
 
@@ -21,6 +21,7 @@ This repository contains the Griptape Nodes Engine - the local component that ru
21
21
  - **📚 Full Documentation:** [docs.griptapenodes.com](https://docs.griptapenodes.com)
22
22
  - **⚙️ Installation:** [docs.griptapenodes.com/en/stable/installation/](https://docs.griptapenodes.com/en/latest/installation/)
23
23
  - **🔧 Engine Configuration:** [docs.griptapenodes.com/en/stable/configuration/](https://docs.griptapenodes.com/en/latest/configuration/)
24
+ - **📋 Migration Guide:** [MIGRATION.md](MIGRATION.md) - Guide for migrating from deprecated nodes
24
25
 
25
26
  **🧩 Extending Griptape Nodes:**
26
27
 
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "griptape-nodes"
3
- version = "0.45.1"
3
+ version = "0.64.8"
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.0",
8
+ "griptape>=1.8.12",
9
9
  "pydantic>=2.10.6",
10
10
  "python-dotenv>=1.0.1",
11
11
  "xdg-base-dirs>=6.0.2",
@@ -19,11 +19,19 @@ dependencies = [
19
19
  "packaging>=25.0",
20
20
  "python-multipart>=0.0.20",
21
21
  "json-repair>=0.46.1",
22
- "imageio-ffmpeg>=0.6.0",
23
22
  "mcp[ws]>=1.10.1",
24
23
  "binaryornot>=0.4.4",
25
24
  "pillow>=11.3.0",
26
25
  "watchfiles>=1.1.0",
26
+ "typer>=0.15.0",
27
+ "huggingface-hub>=1.1.0",
28
+ "rich>=14.1.0",
29
+ "semver>=3.0.4",
30
+ "aiofiles>=25.1.0",
31
+ "aioshutil>=1.5",
32
+ "ruamel.yaml>=0.18.15",
33
+ "asyncio-thread-runner>=1.0",
34
+ "portalocker>=2.10.0",
27
35
  ]
28
36
 
29
37
  [project.optional-dependencies]
@@ -31,6 +39,7 @@ profiling = ["austin-dist>=3.7.0"]
31
39
 
32
40
  [dependency-groups]
33
41
  dev = [
42
+ "griptape-cloud-client",
34
43
  "mdformat>=0.7.22",
35
44
  "mdformat-gfm>=0.4.1",
36
45
  "mdformat-frontmatter>=2.0.8",
@@ -39,14 +48,21 @@ dev = [
39
48
  "pyright>=1.1.396",
40
49
  "ruff>=0.11.0",
41
50
  "typos>=1.30.2",
42
- "watchdog>=6.0.0",
43
51
  ]
44
52
  docs = [
45
53
  "mkdocs-material>=9.6.9",
46
54
  "mkdocs>=1.5.2",
47
55
  "mkdocstrings[python]>=0.29.1",
56
+ "mkdocs-mermaid2-plugin>=1.2.2",
57
+ ]
58
+ test = [
59
+ "pytest>=8.3.5",
60
+ "pytest-asyncio>=1.1.0",
61
+ "pytest-mock>=3.14.0",
62
+ "pytest-xdist>=3.6.1",
63
+ "pytest-cov>=6.0.0",
64
+ "coverage>=7.0.0",
48
65
  ]
49
- test = ["pytest>=8.3.5", "pytest-mock>=3.14.0", "pytest-xdist>=3.6.1"]
50
66
 
51
67
  [project.scripts]
52
68
  griptape-nodes = "griptape_nodes:main"
@@ -56,11 +72,13 @@ gtn = "griptape_nodes:main"
56
72
  requires = ["uv_build"]
57
73
  build-backend = "uv_build"
58
74
 
75
+ [tool.uv.sources]
76
+ griptape-cloud-client = { git = "https://github.com/griptape-ai/griptape-cloud-python-client", rev = "main" }
77
+
59
78
  [tool.ruff]
60
79
  line-length = 120
80
+ extend-exclude = ["libraries/**/templates/*.py"]
61
81
 
62
- [tool.ruff.format]
63
- exclude = [".venv"]
64
82
 
65
83
  [tool.ruff.lint]
66
84
  select = ["ALL"]
@@ -77,7 +95,6 @@ ignore = [
77
95
  "E501", # TODO: https://github.com/griptape-ai/griptape-nodes/issues/834
78
96
  "D100", # TODO: https://github.com/griptape-ai/griptape-nodes/issues/835
79
97
  "BLE001", # TODO: https://github.com/griptape-ai/griptape-nodes/issues/839
80
- "B026", # TODO: https://github.com/griptape-ai/griptape-nodes/issues/836
81
98
  "SLF001", # TODO :https://github.com/griptape-ai/griptape-nodes/issues/838
82
99
  "SIM108", # Intentional
83
100
  "SIM110", # Intentional
@@ -91,10 +108,13 @@ ignore = [
91
108
 
92
109
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
93
110
  "nodes.griptape_nodes_library".msg = "Import from griptape_nodes_library instead of nodes.griptape_nodes_library"
111
+ "libraries.griptape_nodes_library".msg = "Import from griptape_nodes_library instead of libraries.griptape_nodes_library"
112
+ "libraries.griptape_nodes_advanced_media_library".msg = "Import from griptape_nodes_advanced_media_library instead of libraries.griptape_nodes_advanced_media_library"
113
+ "libraries.griptape_cloud".msg = "Import from griptape_cloud instead of libraries.griptape_cloud"
94
114
 
95
115
  [tool.ruff.lint.per-file-ignores]
96
116
  "tests/*" = ["S101", "D104"]
97
- "nodes/tests/*" = ["S101", "D104"]
117
+ "libraries/**/tests/*" = ["S101", "D104"]
98
118
 
99
119
  [tool.ruff.lint.flake8-annotations]
100
120
  mypy-init-return = true
@@ -102,12 +122,20 @@ mypy-init-return = true
102
122
  [tool.ruff.lint.pydocstyle]
103
123
  convention = "google"
104
124
 
125
+ [tool.typos]
126
+ default.extend-ignore-re = [
127
+ # Ignore any line that ends with this comment:
128
+ "(?Rm)^.*(#|//)\\s*spellchecker:disable-line$",
129
+ # Or: ignore the *next* line after this comment:
130
+ "(?m)(#|//)\\s*spellchecker:ignore-next-line\\n.*",
131
+ ]
132
+
105
133
  [tool.pyright]
106
134
  venvPath = "."
107
135
  venv = ".venv"
108
136
  include = ["."]
109
137
  exclude = [
110
- "libraries/griptape_nodes_library/workflows/templates/**/*",
138
+ "libraries/**/templates/*",
111
139
  ".venv",
112
140
  "GriptapeNodes",
113
141
  "**/node_modules",
@@ -116,6 +144,3 @@ exclude = [
116
144
  ]
117
145
  pythonVersion = "3.12"
118
146
  reportIncompatibleMethodOverride = false
119
-
120
- [tool.uv.sources]
121
- griptape = { git = "https://github.com/griptape-ai/griptape", rev = "main" }
@@ -0,0 +1,24 @@
1
+ """Griptape Nodes package."""
2
+
3
+ import sys
4
+ from pathlib import Path
5
+
6
+ from rich.console import Console
7
+
8
+
9
+ def main() -> None:
10
+ """Main entry point for the Griptape Nodes CLI."""
11
+ # Hack to make paths "just work". # noqa: FIX004
12
+ # Without this, packages like `nodes` don't properly import.
13
+ # Long term solution could be to make `nodes` a proper src-layout package
14
+ # but current engine relies on importing files rather than packages.
15
+ sys.path.append(str(Path.cwd()))
16
+
17
+ console = Console()
18
+ with console.status("[bold green]Loading Griptape Nodes...", spinner="dots"):
19
+ from griptape_nodes.cli.main import app
20
+
21
+ app()
22
+
23
+
24
+ __all__ = ["main"]
@@ -0,0 +1,6 @@
1
+ """Main entry point for the Griptape Nodes CLI when run as a module."""
2
+
3
+ from griptape_nodes import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -0,0 +1,9 @@
1
+ """API client for Nodes API communication."""
2
+
3
+ from griptape_nodes.api_client.client import Client
4
+ from griptape_nodes.api_client.request_client import RequestClient
5
+
6
+ __all__ = [
7
+ "Client",
8
+ "RequestClient",
9
+ ]
@@ -0,0 +1,279 @@
1
+ """Unified WebSocket client for Nodes API communication."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import contextlib
7
+ import json
8
+ import logging
9
+ import os
10
+ from typing import TYPE_CHECKING, Any, Self
11
+ from urllib.parse import urljoin
12
+
13
+ from websockets.asyncio.client import connect
14
+ from websockets.exceptions import ConnectionClosed
15
+
16
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
17
+
18
+ if TYPE_CHECKING:
19
+ from collections.abc import AsyncIterator
20
+ from types import TracebackType
21
+
22
+ logger = logging.getLogger("griptape_nodes_client")
23
+
24
+
25
+ def get_default_websocket_url() -> str:
26
+ """Get the default WebSocket endpoint URL for connecting to Nodes API.
27
+
28
+ Returns:
29
+ WebSocket URL for Nodes API events endpoint
30
+ """
31
+ return urljoin(
32
+ os.getenv("GRIPTAPE_NODES_API_BASE_URL", "https://api.nodes.griptape.ai").replace("http", "ws"),
33
+ "/ws/engines/events?version=v2",
34
+ )
35
+
36
+
37
+ class Client:
38
+ """WebSocket client for Nodes API pub/sub communication.
39
+
40
+ Provides connection management, topic-based pub/sub, and message routing.
41
+ Handles WebSocket reconnection and async event streaming.
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ api_key: str | None = None,
47
+ url: str | None = None,
48
+ ):
49
+ """Initialize Nodes API client.
50
+
51
+ Args:
52
+ api_key: API key for authentication (defaults to GT_CLOUD_API_KEY from SecretsManager)
53
+ url: WebSocket URL to connect to (defaults to Nodes API endpoint)
54
+ """
55
+ self.url = url if url is not None else get_default_websocket_url()
56
+
57
+ # Get API key from SecretsManager if not provided
58
+ if api_key is None:
59
+ api_key = GriptapeNodes.SecretsManager().get_secret("GT_CLOUD_API_KEY")
60
+
61
+ self.api_key = api_key
62
+
63
+ self.headers = {"Authorization": f"Bearer {api_key}"} if api_key else {}
64
+
65
+ # Event streaming management
66
+ self._message_queue: asyncio.Queue = asyncio.Queue()
67
+ self._subscribed_topics: set[str] = set()
68
+ self._receiving_task: asyncio.Task | None = None
69
+ self._sending_task: asyncio.Task | None = None
70
+ self._websocket: Any = None
71
+ self._connection_ready = asyncio.Event()
72
+ self._reconnect_delay = 2.0
73
+
74
+ async def __aenter__(self) -> Self:
75
+ """Async context manager entry: connect to WebSocket server."""
76
+ await self._connect()
77
+ return self
78
+
79
+ async def __aexit__(
80
+ self,
81
+ exc_type: type[BaseException] | None,
82
+ exc_val: BaseException | None,
83
+ exc_tb: TracebackType | None,
84
+ ) -> None:
85
+ """Async context manager exit: disconnect from WebSocket server."""
86
+ await self._disconnect()
87
+
88
+ def __aiter__(self) -> AsyncIterator[dict[str, Any]]:
89
+ """Return self as async iterator."""
90
+ return self
91
+
92
+ async def __anext__(self) -> dict[str, Any]:
93
+ """Get next message from the message queue.
94
+
95
+ Returns:
96
+ Next message dictionary from subscribed topics
97
+
98
+ Raises:
99
+ StopAsyncIteration: When iteration is cancelled
100
+ """
101
+ try:
102
+ return await self._message_queue.get()
103
+ except asyncio.CancelledError:
104
+ raise StopAsyncIteration from None
105
+
106
+ @property
107
+ def messages(self) -> AsyncIterator[dict[str, Any]]:
108
+ """Async iterator for receiving messages from subscribed topics.
109
+
110
+ Returns:
111
+ Async iterator yielding message dictionaries
112
+
113
+ Example:
114
+ async with Client(...) as client:
115
+ await client.subscribe("topic")
116
+ async for message in client.messages:
117
+ print(message)
118
+ """
119
+ return self
120
+
121
+ async def subscribe(self, topic: str) -> None:
122
+ """Subscribe to a topic by sending subscribe command to server.
123
+
124
+ Args:
125
+ topic: Topic name to subscribe to
126
+
127
+ Example:
128
+ await client.subscribe("sessions/123/response")
129
+ """
130
+ self._subscribed_topics.add(topic)
131
+ await self._send_subscribe_command(topic)
132
+
133
+ async def unsubscribe(self, topic: str) -> None:
134
+ """Unsubscribe from a topic.
135
+
136
+ Args:
137
+ topic: Topic name to unsubscribe from
138
+ """
139
+ self._subscribed_topics.discard(topic)
140
+ await self._send_unsubscribe_command(topic)
141
+
142
+ async def publish(self, event_type: str, payload: dict[str, Any], topic: str) -> None:
143
+ """Publish an event to the server.
144
+
145
+ Args:
146
+ event_type: Type of event to publish
147
+ payload: Event payload data
148
+ topic: Topic to publish to
149
+ """
150
+ message = {"type": event_type, "payload": payload, "topic": topic}
151
+ await self._send_message(message)
152
+
153
+ async def _connect(self) -> None:
154
+ """Connect to the WebSocket server and start receiving messages.
155
+
156
+ This method starts the connection manager task.
157
+ It returns once the initial connection is established.
158
+
159
+ Raises:
160
+ ConnectionError: If connection fails
161
+ """
162
+ # Start connection manager task
163
+ self._receiving_task = asyncio.create_task(self._manage_connection())
164
+
165
+ # Wait for initial connection to be established
166
+ try:
167
+ await asyncio.wait_for(self._connection_ready.wait(), timeout=10.0)
168
+ logger.debug("WebSocket client connected")
169
+ except TimeoutError as e:
170
+ logger.error("Failed to connect WebSocket client: timeout")
171
+ msg = "Connection timeout"
172
+ raise ConnectionError(msg) from e
173
+
174
+ async def _disconnect(self) -> None:
175
+ """Disconnect from the WebSocket server and clean up tasks."""
176
+ # Cancel tasks
177
+ if self._receiving_task:
178
+ self._receiving_task.cancel()
179
+ with contextlib.suppress(asyncio.CancelledError):
180
+ await self._receiving_task
181
+
182
+ if self._sending_task:
183
+ self._sending_task.cancel()
184
+ with contextlib.suppress(asyncio.CancelledError):
185
+ await self._sending_task
186
+
187
+ # Close websocket connection
188
+ if self._websocket:
189
+ await self._websocket.close()
190
+ logger.info("WebSocket client disconnected")
191
+
192
+ async def _manage_connection(self) -> None:
193
+ """Manage WebSocket connection lifecycle with automatic reconnection.
194
+
195
+ This method establishes and maintains the WebSocket connection,
196
+ automatically reconnecting on failures.
197
+ """
198
+ try:
199
+ async for websocket in connect(self.url, additional_headers=self.headers):
200
+ self._websocket = websocket
201
+ self._connection_ready.set()
202
+ logger.debug("WebSocket connection established: %s", self.url)
203
+
204
+ # Resubscribe to all topics after reconnection
205
+ if self._subscribed_topics:
206
+ logger.debug("Resubscribing to %d topics after reconnection", len(self._subscribed_topics))
207
+ for topic in self._subscribed_topics:
208
+ await self._send_subscribe_command(topic)
209
+
210
+ try:
211
+ await self._receive_messages(websocket)
212
+ except ConnectionClosed:
213
+ logger.info("WebSocket connection closed, reconnecting...")
214
+ self._connection_ready.clear()
215
+ continue
216
+
217
+ except asyncio.CancelledError:
218
+ logger.debug("Connection manager task cancelled")
219
+
220
+ async def _receive_messages(self, websocket: Any) -> None:
221
+ """Receive messages from WebSocket and put them in message queue.
222
+
223
+ Args:
224
+ websocket: WebSocket connection to receive messages from
225
+
226
+ Raises:
227
+ ConnectionClosed: When the WebSocket connection is closed
228
+ """
229
+ try:
230
+ async for message in websocket:
231
+ try:
232
+ data = json.loads(message)
233
+ await self._message_queue.put(data)
234
+ except json.JSONDecodeError:
235
+ logger.error("Failed to parse message: %s", message)
236
+ except Exception as e:
237
+ logger.error("Error receiving message: %s", e)
238
+ except asyncio.CancelledError:
239
+ logger.debug("Receive messages task cancelled")
240
+ raise
241
+
242
+ async def _send_message(self, message: dict[str, Any]) -> None:
243
+ """Send a message through the WebSocket connection.
244
+
245
+ Args:
246
+ message: Message dictionary to send
247
+
248
+ Raises:
249
+ ConnectionError: If not connected
250
+ """
251
+ if not self._websocket:
252
+ msg = "Not connected to WebSocket"
253
+ raise ConnectionError(msg)
254
+
255
+ try:
256
+ await self._websocket.send(json.dumps(message))
257
+ logger.debug("Sent message type: %s", message.get("type"))
258
+ except Exception as e:
259
+ logger.error("Failed to send message: %s", e)
260
+
261
+ async def _send_subscribe_command(self, topic: str) -> None:
262
+ """Send subscribe command to server.
263
+
264
+ Args:
265
+ topic: Topic to subscribe to
266
+ """
267
+ message = {"type": "subscribe", "topic": topic, "payload": {}}
268
+ await self._send_message(message)
269
+ logger.debug("Sent subscribe command for topic: %s", topic)
270
+
271
+ async def _send_unsubscribe_command(self, topic: str) -> None:
272
+ """Send unsubscribe command to server.
273
+
274
+ Args:
275
+ topic: Topic to unsubscribe from
276
+ """
277
+ message = {"type": "unsubscribe", "topic": topic, "payload": {}}
278
+ await self._send_message(message)
279
+ logger.debug("Sent unsubscribe command for topic: %s", topic)