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