griptape-nodes 0.49.0__py3-none-any.whl → 0.51.0__py3-none-any.whl

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.
@@ -13,10 +13,17 @@ from griptape_nodes.exe_types.core_types import (
13
13
  ParameterTypeBuiltin,
14
14
  )
15
15
  from griptape_nodes.exe_types.flow import ControlFlow
16
- from griptape_nodes.exe_types.node_types import BaseNode, EndLoopNode, NodeResolutionState, StartLoopNode
16
+ from griptape_nodes.exe_types.node_types import (
17
+ BaseNode,
18
+ EndLoopNode,
19
+ ErrorProxyNode,
20
+ NodeResolutionState,
21
+ StartLoopNode,
22
+ )
17
23
  from griptape_nodes.exe_types.type_validator import TypeValidator
18
24
  from griptape_nodes.node_library.library_registry import LibraryNameAndVersion, LibraryRegistry
19
25
  from griptape_nodes.retained_mode.events.base_events import (
26
+ ResultDetails,
20
27
  ResultPayload,
21
28
  ResultPayloadFailure,
22
29
  )
@@ -46,6 +53,9 @@ from griptape_nodes.retained_mode.events.library_events import (
46
53
  GetLibraryMetadataResultSuccess,
47
54
  )
48
55
  from griptape_nodes.retained_mode.events.node_events import (
56
+ BatchSetNodeMetadataRequest,
57
+ BatchSetNodeMetadataResultFailure,
58
+ BatchSetNodeMetadataResultSuccess,
49
59
  CreateNodeRequest,
50
60
  CreateNodeResultFailure,
51
61
  CreateNodeResultSuccess,
@@ -73,6 +83,9 @@ from griptape_nodes.retained_mode.events.node_events import (
73
83
  ListParametersOnNodeRequest,
74
84
  ListParametersOnNodeResultFailure,
75
85
  ListParametersOnNodeResultSuccess,
86
+ SendNodeMessageRequest,
87
+ SendNodeMessageResultFailure,
88
+ SendNodeMessageResultSuccess,
76
89
  SerializedNodeCommands,
77
90
  SerializedParameterValueTracker,
78
91
  SerializedSelectedNodesCommands,
@@ -142,6 +155,9 @@ class NodeManager:
142
155
  )
143
156
  event_manager.assign_manager_to_request_type(GetNodeMetadataRequest, self.on_get_node_metadata_request)
144
157
  event_manager.assign_manager_to_request_type(SetNodeMetadataRequest, self.on_set_node_metadata_request)
158
+ event_manager.assign_manager_to_request_type(
159
+ BatchSetNodeMetadataRequest, self.on_batch_set_node_metadata_request
160
+ )
145
161
  event_manager.assign_manager_to_request_type(
146
162
  ListConnectionsForNodeRequest, self.on_list_connections_for_node_request
147
163
  )
@@ -288,7 +304,30 @@ class NodeManager:
288
304
  traceback.print_exc()
289
305
  details = f"Could not create Node '{final_node_name}' of type '{request.node_type}': {err}"
290
306
  logger.error(details)
291
- return CreateNodeResultFailure(result_details=details)
307
+
308
+ # Check if we should create an Error Proxy node instead of failing
309
+ if request.create_error_proxy_on_failure:
310
+ try:
311
+ # Create ErrorProxyNode directly since it needs special initialization
312
+ node = ErrorProxyNode(
313
+ name=final_node_name,
314
+ original_node_type=request.node_type,
315
+ original_library_name=request.specific_library_name or "Unknown",
316
+ failure_reason=str(err),
317
+ metadata=request.metadata,
318
+ )
319
+
320
+ logger.warning(
321
+ "Created Error Proxy (placeholder) node '%s' to substitute for failed '%s'",
322
+ final_node_name,
323
+ request.node_type,
324
+ )
325
+ except Exception as proxy_err:
326
+ details = f"Failed to create Error Proxy (placeholder) node: {proxy_err}"
327
+ logger.error(details)
328
+ return CreateNodeResultFailure(result_details=details)
329
+ else:
330
+ return CreateNodeResultFailure(result_details=details)
292
331
  # Add it to the Flow.
293
332
  parent_flow.add_node(node)
294
333
 
@@ -632,6 +671,46 @@ class NodeManager:
632
671
  result = SetNodeMetadataResultSuccess()
633
672
  return result
634
673
 
674
+ def on_batch_set_node_metadata_request(self, request: BatchSetNodeMetadataRequest) -> ResultPayload:
675
+ updated_nodes = []
676
+ failed_nodes = {}
677
+
678
+ for node_name, metadata_update in request.node_metadata_updates.items():
679
+ # Resolve node name and get node object
680
+ node = None
681
+ if node_name is None:
682
+ # Get from current context
683
+ if not GriptapeNodes.ContextManager().has_current_node():
684
+ failed_nodes["current_context"] = "No current context node available"
685
+ continue
686
+ node = GriptapeNodes.ContextManager().get_current_node()
687
+ actual_node_name = node.name
688
+ else:
689
+ actual_node_name = node_name
690
+
691
+ # Look up node if we don't have it yet
692
+ if node is None:
693
+ obj_mgr = GriptapeNodes.ObjectManager()
694
+ node = obj_mgr.attempt_get_object_by_name_as_type(actual_node_name, BaseNode)
695
+ if node is None:
696
+ failed_nodes[actual_node_name] = f"Node '{actual_node_name}' not found"
697
+ continue
698
+
699
+ single_request = SetNodeMetadataRequest(node_name=actual_node_name, metadata=metadata_update)
700
+ result = self.on_set_node_metadata_request(single_request)
701
+
702
+ if isinstance(result, SetNodeMetadataResultSuccess):
703
+ updated_nodes.append(actual_node_name)
704
+ else:
705
+ failed_nodes[actual_node_name] = result.result_details
706
+
707
+ if not updated_nodes:
708
+ return BatchSetNodeMetadataResultFailure(
709
+ result_details=f"Failed to update any nodes. Failed nodes: {failed_nodes}"
710
+ )
711
+
712
+ return BatchSetNodeMetadataResultSuccess(updated_nodes=updated_nodes, failed_nodes=failed_nodes)
713
+
635
714
  def on_list_connections_for_node_request(self, request: ListConnectionsForNodeRequest) -> ResultPayload:
636
715
  node_name = request.node_name
637
716
  node = None
@@ -873,7 +952,7 @@ class NodeManager:
873
952
  input_types=request.input_types,
874
953
  output_type=request.output_type,
875
954
  default_value=request.default_value,
876
- user_defined=True,
955
+ user_defined=request.is_user_defined,
877
956
  tooltip=request.tooltip,
878
957
  tooltip_as_input=request.tooltip_as_input,
879
958
  tooltip_as_property=request.tooltip_as_property,
@@ -1263,7 +1342,7 @@ class NodeManager:
1263
1342
 
1264
1343
  return None
1265
1344
 
1266
- def on_alter_parameter_details_request(self, request: AlterParameterDetailsRequest) -> ResultPayload: # noqa: C901, PLR0911
1345
+ def on_alter_parameter_details_request(self, request: AlterParameterDetailsRequest) -> ResultPayload: # noqa: C901, PLR0911, PLR0912
1267
1346
  node_name = request.node_name
1268
1347
  node = None
1269
1348
 
@@ -1292,6 +1371,24 @@ class NodeManager:
1292
1371
  logger.error(details)
1293
1372
  return AlterParameterDetailsResultFailure(result_details=details)
1294
1373
 
1374
+ # Handle ErrorProxyNode parameter alteration requests
1375
+ if isinstance(node, ErrorProxyNode):
1376
+ if request.initial_setup:
1377
+ # Record the alteration request for serialization replay
1378
+ node.record_initialization_request(request)
1379
+
1380
+ # Early return with warning - we're just preserving the original changes
1381
+ details = f"Parameter '{request.parameter_name}' alteration recorded for ErrorProxyNode '{node_name}'. Original node '{node.original_node_type}' had loading errors - preserving changes for correct recreation when dependency '{node.original_library_name}' is resolved."
1382
+ logger.warning(details)
1383
+
1384
+ result_details = ResultDetails(message=details, level="WARNING")
1385
+ return AlterParameterDetailsResultSuccess(result_details=result_details)
1386
+
1387
+ # Reject runtime parameter alterations on ErrorProxy
1388
+ details = f"Cannot modify parameter '{request.parameter_name}' on placeholder node '{node_name}'. This placeholder preserves your workflow structure but doesn't allow parameter modifications, as they could cause issues when the original node is restored."
1389
+ logger.error(details)
1390
+ return AlterParameterDetailsResultFailure(result_details=details)
1391
+
1295
1392
  # Does the Element actually exist on the Node?
1296
1393
  element = node.get_element_by_name_and_type(request.parameter_name)
1297
1394
  if element is None:
@@ -1426,6 +1523,22 @@ class NodeManager:
1426
1523
  logger.error(details)
1427
1524
  return SetParameterValueResultFailure(result_details=details)
1428
1525
 
1526
+ # Handle ErrorProxyNode parameter value requests
1527
+ if isinstance(node, ErrorProxyNode):
1528
+ if request.initial_setup:
1529
+ # For initial_setup, actually create the parameter and set the value
1530
+ # This allows normal serialization to handle it, rather than recording the command
1531
+ node.on_attempt_set_parameter_value(param_name)
1532
+ # Continue with normal parameter value setting logic below
1533
+ logger.debug(
1534
+ "Created parameter '%s' on ErrorProxyNode '%s' during initial setup", param_name, node_name
1535
+ )
1536
+ else:
1537
+ # Reject runtime parameter value changes on ErrorProxy
1538
+ details = f"Cannot set parameter '{param_name}' on placeholder node '{node_name}'. This placeholder preserves your workflow structure but doesn't allow parameter changes, as they could cause issues when the original node is restored."
1539
+ logger.error(details)
1540
+ return SetParameterValueResultFailure(result_details=details)
1541
+
1429
1542
  # Does the Parameter actually exist on the Node?
1430
1543
  parameter = node.get_parameter_by_name(param_name)
1431
1544
  if parameter is None:
@@ -1885,20 +1998,42 @@ class NodeManager:
1885
1998
  library_used = node.metadata["library"]
1886
1999
  # Get the library metadata so we can get the version.
1887
2000
  library_metadata_request = GetLibraryMetadataRequest(library=library_used)
1888
- library_metadata_result = GriptapeNodes().handle_request(library_metadata_request)
2001
+ # Call LibraryManager directly to avoid error toasts when library is unavailable (expected for ErrorProxyNode)
2002
+ # Per https://github.com/griptape-ai/griptape-nodes/issues/1940
2003
+ library_metadata_result = GriptapeNodes.LibraryManager().get_library_metadata_request(
2004
+ library_metadata_request
2005
+ )
2006
+
1889
2007
  if not isinstance(library_metadata_result, GetLibraryMetadataResultSuccess):
1890
- details = f"Attempted to serialize Node '{node_name}' to commands. Failed to get metadata for library '{library_used}'."
1891
- logger.error(details)
1892
- return SerializeNodeToCommandsResultFailure(result_details=details)
2008
+ if isinstance(node, ErrorProxyNode):
2009
+ # For ErrorProxyNode, use descriptive message when original library unavailable
2010
+ library_version = "<version unavailable; workflow was saved when library was unable to be loaded>"
2011
+ library_details = LibraryNameAndVersion(library_name=library_used, library_version=library_version)
2012
+ details = f"Serializing Node '{node_name}' (original type: {node.original_node_type}) with unavailable library '{library_used}'. Saving as ErrorProxy with placeholder version. Fix the missing library and reload the workflow to restore the original node."
2013
+ logger.warning(details)
2014
+ else:
2015
+ # For regular nodes, this is still an error
2016
+ details = f"Attempted to serialize Node '{node_name}' to commands. Failed to get metadata for library '{library_used}'."
2017
+ logger.error(details)
2018
+ return SerializeNodeToCommandsResultFailure(result_details=details)
2019
+ else:
2020
+ library_version = library_metadata_result.metadata.library_version
2021
+ library_details = LibraryNameAndVersion(library_name=library_used, library_version=library_version)
2022
+
2023
+ # Handle ErrorProxyNode serialization - serialize as original node type
1893
2024
 
1894
- library_version = library_metadata_result.metadata.library_version
1895
- library_details = LibraryNameAndVersion(library_name=library_used, library_version=library_version)
2025
+ if isinstance(node, ErrorProxyNode):
2026
+ serialized_node_type = node.original_node_type
2027
+ serialized_library_name = node.original_library_name
2028
+ else:
2029
+ serialized_node_type = node.__class__.__name__
2030
+ serialized_library_name = library_details.library_name
1896
2031
 
1897
2032
  # Get the creation details.
1898
2033
  create_node_request = CreateNodeRequest(
1899
- node_type=node.__class__.__name__,
2034
+ node_type=serialized_node_type,
1900
2035
  node_name=node_name,
1901
- specific_library_name=library_details.library_name,
2036
+ specific_library_name=serialized_library_name,
1902
2037
  metadata=copy.deepcopy(node.metadata),
1903
2038
  # If it is actively resolving, mark as unresolved.
1904
2039
  resolution=node.state.value,
@@ -1906,20 +2041,42 @@ class NodeManager:
1906
2041
  )
1907
2042
 
1908
2043
  # We're going to compare this node instance vs. a canonical one. Rez that one up.
1909
- reference_node = type(node)(name="REFERENCE NODE")
2044
+ # For ErrorProxyNode, we can't create a reference node, so skip comparison
2045
+ if isinstance(node, ErrorProxyNode):
2046
+ reference_node = None
2047
+ else:
2048
+ reference_node = type(node)(name="REFERENCE NODE")
1910
2049
 
1911
2050
  # Now creation or alteration of all of the elements.
1912
2051
  element_modification_commands = []
1913
2052
  for parameter in node.parameters:
1914
2053
  # Create the parameter, or alter it on the existing node
1915
2054
  if parameter.user_defined:
1916
- # Add a user-defined Parameter.
2055
+ # Always serialize user-defined parameters regardless of node type
2056
+ param_dict = parameter.to_dict()
2057
+ param_dict["initial_setup"] = True
2058
+ add_param_request = AddParameterToNodeRequest.create(**param_dict)
2059
+ element_modification_commands.append(add_param_request)
2060
+ elif isinstance(node, ErrorProxyNode):
2061
+ # For ErrorProxyNode, replay all recorded initialization requests for this parameter
2062
+ recorded_requests = node.get_recorded_initialization_requests()
2063
+ matching_requests = [
2064
+ recorded_request
2065
+ for recorded_request in recorded_requests
2066
+ if (
2067
+ hasattr(recorded_request, "parameter_name")
2068
+ and getattr(recorded_request, "parameter_name", None) == parameter.name
2069
+ )
2070
+ ]
2071
+ element_modification_commands.extend(matching_requests)
2072
+ elif reference_node is None:
2073
+ # Normal node with no reference - treat all parameters as needing serialization
1917
2074
  param_dict = parameter.to_dict()
1918
2075
  param_dict["initial_setup"] = True
1919
2076
  add_param_request = AddParameterToNodeRequest.create(**param_dict)
1920
2077
  element_modification_commands.append(add_param_request)
1921
2078
  else:
1922
- # Not user defined. Get any deltas from the values on the reference node.
2079
+ # Normal node - compare against reference node
1923
2080
  diff = NodeManager._manage_alter_details(parameter, reference_node)
1924
2081
  relevant = False
1925
2082
  for key in diff:
@@ -1934,6 +2091,10 @@ class NodeManager:
1934
2091
 
1935
2092
  # Now assignment of values to all of the parameters.
1936
2093
  set_value_commands = []
2094
+
2095
+ # ErrorProxyNode uses normal parameter serialization now since we create real parameters
2096
+ # Only AlterParameterDetailsRequest commands are recorded and replayed
2097
+ # Normal node - use current parameter values
1937
2098
  for parameter in node.parameters:
1938
2099
  # SetParameterValueRequest event
1939
2100
  set_param_value_requests = NodeManager._handle_parameter_value_saving(
@@ -2298,6 +2459,7 @@ class NodeManager:
2298
2459
  value: Any,
2299
2460
  serialized_parameter_value_tracker: SerializedParameterValueTracker,
2300
2461
  unique_parameter_uuid_to_values: dict,
2462
+ parameter: Parameter,
2301
2463
  parameter_name: str,
2302
2464
  node_name: str,
2303
2465
  *,
@@ -2321,8 +2483,10 @@ class NodeManager:
2321
2483
  case SerializedParameterValueTracker.TrackerState.NOT_IN_TRACKER:
2322
2484
  # This value is new for us.
2323
2485
 
2324
- # Confirm that the author wants this parameter and/or class to be serialized.
2325
- # TODO: https://github.com/griptape-ai/griptape-nodes/issues/1179 ID a method for classes and/or parameters to be flagged for NOT serializability.
2486
+ # Check if parameter is marked as non-serializable (e.g., ImageDrivers, PromptDrivers, file handles)
2487
+ if not parameter.serializable:
2488
+ serialized_parameter_value_tracker.add_as_not_serializable(value_id)
2489
+ return None
2326
2490
 
2327
2491
  # Check if we can serialize it.
2328
2492
  try:
@@ -2403,12 +2567,13 @@ class NodeManager:
2403
2567
  value=internal_value,
2404
2568
  serialized_parameter_value_tracker=serialized_parameter_value_tracker,
2405
2569
  unique_parameter_uuid_to_values=unique_parameter_uuid_to_values,
2570
+ parameter=parameter,
2406
2571
  is_output=False,
2407
2572
  parameter_name=parameter.name,
2408
2573
  node_name=node.name,
2409
2574
  )
2410
2575
  if internal_command is None:
2411
- details = f"Attempted to serialize set value for parameter '{parameter.name}' on node '{node.name}'. The set value will not be restored in anything that attempts to deserialize or save this node. The value for this parameter was not serialized because it did not match Griptape Nodes' criteria for serializability. To remedy, either update the value's type to support serializability or mark the parameter as not serializable."
2576
+ details = f"Attempted to serialize set value for parameter '{parameter.name}' on node '{node.name}'. The set value will not be restored in anything that attempts to deserialize or save this node. The value for this parameter was not serialized because it did not match Griptape Nodes' criteria for serializability. To remedy, either update the value's type to support serializability or mark the parameter as not serializable by setting serializable=False when creating the parameter."
2412
2577
  logger.warning(details)
2413
2578
  else:
2414
2579
  commands.append(internal_command)
@@ -2417,12 +2582,13 @@ class NodeManager:
2417
2582
  value=output_value,
2418
2583
  serialized_parameter_value_tracker=serialized_parameter_value_tracker,
2419
2584
  unique_parameter_uuid_to_values=unique_parameter_uuid_to_values,
2585
+ parameter=parameter,
2420
2586
  is_output=True,
2421
2587
  parameter_name=parameter.name,
2422
2588
  node_name=node.name,
2423
2589
  )
2424
2590
  if output_command is None:
2425
- details = f"Attempted to serialize output value for parameter '{parameter.name}' on node '{node.name}'. The output value will not be restored in anything that attempts to deserialize or save this node. The value for this parameter was not serialized because it did not match Griptape Nodes' criteria for serializability. To remedy, either update the value's type to support serializability or mark the parameter as not serializable."
2591
+ details = f"Attempted to serialize output value for parameter '{parameter.name}' on node '{node.name}'. The output value will not be restored in anything that attempts to deserialize or save this node. The value for this parameter was not serialized because it did not match Griptape Nodes' criteria for serializability. To remedy, either update the value's type to support serializability or mark the parameter as not serializable by setting serializable=False when creating the parameter."
2426
2592
  logger.warning(details)
2427
2593
  else:
2428
2594
  commands.append(output_command)
@@ -2533,3 +2699,66 @@ class NodeManager:
2533
2699
  return SetLockNodeStateResultFailure(result_details=details)
2534
2700
  node.lock = request.lock
2535
2701
  return SetLockNodeStateResultSuccess(node_name=node_name, locked=node.lock)
2702
+
2703
+ def on_send_node_message_request(self, request: SendNodeMessageRequest) -> ResultPayload:
2704
+ """Handle a SendNodeMessageRequest by calling the node's message callback.
2705
+
2706
+ Args:
2707
+ request: The SendNodeMessageRequest containing message details
2708
+
2709
+ Returns:
2710
+ ResultPayload: Success or failure result with callback response
2711
+ """
2712
+ node_name = request.node_name
2713
+ node = None
2714
+
2715
+ if node_name is None:
2716
+ # Get from the current context
2717
+ if not GriptapeNodes.ContextManager().has_current_node():
2718
+ details = "Attempted to send message to Node from Current Context. Failed because the Current Context is empty."
2719
+ logger.error(details)
2720
+ return SendNodeMessageResultFailure(result_details=details)
2721
+
2722
+ node = GriptapeNodes.ContextManager().get_current_node()
2723
+ node_name = node.name
2724
+
2725
+ if node is None:
2726
+ # Find the node by name
2727
+ obj_mgr = GriptapeNodes.ObjectManager()
2728
+ node = obj_mgr.attempt_get_object_by_name_as_type(node_name, BaseNode)
2729
+ if node is None:
2730
+ details = f"Attempted to send message to Node '{node_name}', but no such Node was found."
2731
+ logger.error(details)
2732
+ return SendNodeMessageResultFailure(result_details=details)
2733
+
2734
+ # Validate optional_element_name if specified
2735
+ if request.optional_element_name is not None:
2736
+ element = node.root_ui_element.find_element_by_name(request.optional_element_name)
2737
+ if element is None:
2738
+ details = f"Attempted to send message to Node '{node_name}' with element '{request.optional_element_name}', but no such element was found."
2739
+ logger.error(details)
2740
+ return SendNodeMessageResultFailure(result_details=details, altered_workflow_state=False)
2741
+
2742
+ # Call the node's message callback
2743
+ callback_result = node.on_node_message_received(
2744
+ optional_element_name=request.optional_element_name,
2745
+ message_type=request.message_type,
2746
+ message=request.message,
2747
+ )
2748
+
2749
+ if not callback_result.success:
2750
+ details = f"Failed to handle message for Node '{node_name}': {callback_result.details}"
2751
+ logger.warning(details)
2752
+ return SendNodeMessageResultFailure(
2753
+ result_details=callback_result.details,
2754
+ response=callback_result.response,
2755
+ altered_workflow_state=callback_result.altered_workflow_state,
2756
+ )
2757
+
2758
+ details = f"Successfully sent message to Node '{node_name}': {callback_result.details}"
2759
+ logger.debug(details)
2760
+ return SendNodeMessageResultSuccess(
2761
+ result_details=callback_result.details,
2762
+ response=callback_result.response,
2763
+ altered_workflow_state=callback_result.altered_workflow_state,
2764
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.49.0
3
+ Version: 0.51.0
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.0
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -0,0 +1,127 @@
1
+ griptape_nodes/__init__.py,sha256=yk7I75VnngqYyOdaU57hpusAyL8tHYi_DkTtubd44ZI,37367
2
+ griptape_nodes/app/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
3
+ griptape_nodes/app/__init__.py,sha256=DB-DTsgcNnbmEClXEouwzGhrmo3gHBCWXB9BkPGpdQI,90
4
+ griptape_nodes/app/api.py,sha256=RqNq8GikeEsDF9rt55vv1ZGYMgw5NO4bhMdLKXEId08,6925
5
+ griptape_nodes/app/app.py,sha256=TUlMsOG6h8KIsZp2wBAVYpwQT996hmi2q_Qubouuqt4,17984
6
+ griptape_nodes/app/watch.py,sha256=QTNTx4EbVEQCdidyUNdms74w7fjrjBKAadu1LUDp6WI,2064
7
+ griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
8
+ griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=pyjN81-eLtjyECFYLXOtMCixiiI9qBi5yald86iM7Ek,34
9
+ griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=8JEoaSNo4HPRjMYCvMDIGvgxfrS__0hrMBVCYutF9Xg,9274
10
+ griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=thC-W6O0WdHw8O5qAfoQS-0iXWCBrh20JibejHvGyQw,3347
11
+ griptape_nodes/bootstrap/workflow_executors/workflow_executor.py,sha256=lFAA-5bWyr2Kf1MyS50vX1SeG7l2zmbSrb5_kyyIIro,417
12
+ griptape_nodes/drivers/__init__.py,sha256=tHmiFQn6uJyFVhC2PrqHgRUH3d3yDsqMQpWqRasmaqA,42
13
+ griptape_nodes/drivers/storage/__init__.py,sha256=_7p8vJt3YnnF6sD3Uxxw38c-gazuMIHSS-m3G6sa2Qk,208
14
+ griptape_nodes/drivers/storage/base_storage_driver.py,sha256=so2Syl3QSN3iPvllEST6yuYOLaGg5h5Nwo3m8I51N-Y,3734
15
+ griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py,sha256=DTi1S--uxG6xi1U_EMQyu42vEc07ZIy-egLFu0tJ8-c,7847
16
+ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=PpEvtB_TWg5c0E5fr-PD_VW1fYBTNsm4BF1IDWUVPUY,3488
17
+ griptape_nodes/drivers/storage/storage_backend.py,sha256=3QBIwrgPc1krBIiPYLoK2swhIPDiKJnnucOEdyx7y3c,184
18
+ griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
19
+ griptape_nodes/exe_types/connections.py,sha256=_-VNzf6Kay62QzJlSX-LlHTUhz-CKF-UDsbZLJ0l6Wk,12435
20
+ griptape_nodes/exe_types/core_types.py,sha256=bNdC9UX4nX6yOqb9wQyOcG4DX0WaV65Jd6Yw7e5rnpQ,71471
21
+ griptape_nodes/exe_types/flow.py,sha256=pCeTrx8yrUgLw1U9yQxC7arzJjyP2vag-pG0QTKut-M,5716
22
+ griptape_nodes/exe_types/node_types.py,sha256=tNhh-lWyM_duSFAHhn-C-nbMU96TBnKklxcyVSBqd_w,59950
23
+ griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
24
+ griptape_nodes/machines/__init__.py,sha256=v0jkwr-CFOLmfEYUQvX8BKQLOdvhSsA6toXkdHcPGUE,30
25
+ griptape_nodes/machines/control_flow.py,sha256=rH6dRVXrCqXDDPoYLU31QuZh8kuIcRE7smli3pF0UdU,9843
26
+ griptape_nodes/machines/fsm.py,sha256=g6fFyeoNbIcR_h63Mt0L2scjOuWJhKyZQsnxcM8pYPU,2248
27
+ griptape_nodes/machines/node_resolution.py,sha256=709cRhvc6Su3Isa2qDnIbX876aXjNumzP2Fg6v2zpwQ,22145
28
+ griptape_nodes/mcp_server/__init__.py,sha256=GSpJWqE4lICaryhsQR1okeMH2x6j1bBL0HVxtr52WLg,42
29
+ griptape_nodes/mcp_server/server.py,sha256=xT9a0gZ3663Ro9pRc4F5aa7ze3upbSU5qLPOep_Ragw,5058
30
+ griptape_nodes/mcp_server/ws_request_manager.py,sha256=KFAqwgXD1Fo1KLzE9fcx3sAU4BYFRNqD7_cyN98bR7E,10951
31
+ griptape_nodes/node_library/__init__.py,sha256=U3FcSdmq6UW7qt6E3Up3NWKvUEn5_5lqL-u5qbzfxMQ,28
32
+ griptape_nodes/node_library/advanced_node_library.py,sha256=B1ZaxuFIzQ6tx_3MLIxlsHuahthEC1Hw_t6K_ByIdzs,2104
33
+ griptape_nodes/node_library/library_registry.py,sha256=fE1NF-9SeRPK_pWPQgfeDBsMzvxiAlShPBvi71DCG9Q,12099
34
+ griptape_nodes/node_library/workflow_registry.py,sha256=XYUggUMV_04dSYeYIBmTJ6RHdaie57hg5GYwKbquktg,5489
35
+ griptape_nodes/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ griptape_nodes/retained_mode/__init__.py,sha256=X12DKL6KhLsiRTPIlrPj2h76_sJ0q0eH4r0kMQkodm0,29
37
+ griptape_nodes/retained_mode/events/__init__.py,sha256=7B1C-c0jVvnShtHJ2lfX6BZPE0U1DgQwg1e4DorhKG0,22
38
+ griptape_nodes/retained_mode/events/agent_events.py,sha256=xyCtR-Hf1vv6Ft-z0At0ytIMYBRckYympxdByVZXrCE,4880
39
+ griptape_nodes/retained_mode/events/app_events.py,sha256=_1Hq2ynjeyry8WlJ8psvfYSAGHJtRmUowqypksF8Nfs,8416
40
+ griptape_nodes/retained_mode/events/arbitrary_python_events.py,sha256=uhep1c1xjUc-YQO5nIStAE48PS6rFZLTDQIr_Qb3we8,1460
41
+ griptape_nodes/retained_mode/events/base_events.py,sha256=RXENzYddHeo3eXDMo8hBygWPYN_uqAiZXmlS0ZUZsUs,23076
42
+ griptape_nodes/retained_mode/events/config_events.py,sha256=9WhFx6mD7QF_h1ldFAPRE_iLtrQBAFEvA6_MzhGOomk,6129
43
+ griptape_nodes/retained_mode/events/connection_events.py,sha256=QjHAp0SeCbRSG-dF_nU_CPaOcSKItq2DWJ_FHWgF1b4,4744
44
+ griptape_nodes/retained_mode/events/context_events.py,sha256=-FIwjI0hJodDhfM4BF-3GTRycu80v1TlSSOX34oA9nA,2122
45
+ griptape_nodes/retained_mode/events/execution_events.py,sha256=z1RakAGJQrNUmU6SU6evXSldPdlSlw0gBm7_S15JaEo,9946
46
+ griptape_nodes/retained_mode/events/flow_events.py,sha256=CE7aFHvByY6ii0hI-_Q9ukEJDbHk65LUeRBhrjGkxbQ,14139
47
+ griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=PQ0QRZAUBljSIGjB8QhYUeRmSrfmLsJ6XVcygJKi13I,1102
48
+ griptape_nodes/retained_mode/events/library_events.py,sha256=9KVMHA5VazY3fXEIm31Zmy-rJ43AxNgna4SzVPmy8Pg,17629
49
+ griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
50
+ griptape_nodes/retained_mode/events/node_events.py,sha256=z9Ke9skPMCcp3Mqqq18GzLSP8RcsfLh_L2_Z3ftJKpc,28950
51
+ griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
52
+ griptape_nodes/retained_mode/events/os_events.py,sha256=X0mmyk_r5t6upaQ8eWClD7J25AiX2ggsAuxMZSW9Vx0,8085
53
+ griptape_nodes/retained_mode/events/parameter_events.py,sha256=Fgfdgo70w73-8e4iw-j8zjP0MgKNDmojDjqQLLhbnoY,18549
54
+ griptape_nodes/retained_mode/events/payload_registry.py,sha256=q-wxUqp63vhNj-Pl1JGJHnBkhUefcCArPoMN3KBREEI,1691
55
+ griptape_nodes/retained_mode/events/secrets_events.py,sha256=fCw3OMFfxB8FTZs4ybojm1nqNvhcjtoNylQhX75-jkM,4156
56
+ griptape_nodes/retained_mode/events/static_file_events.py,sha256=c8kKkrxAPZxrE9fsldpWtweK1C4T-1-dHWw_76SRehM,3764
57
+ griptape_nodes/retained_mode/events/sync_events.py,sha256=AoxBZLPPdzx4S5CiOJVRDebHnQb349Dq5jVO8Fh_sn8,2016
58
+ griptape_nodes/retained_mode/events/validation_events.py,sha256=H2yWoHp2t7QwGV_fDQXRy7JojYnK4k6SOAlEvRYST_Q,3062
59
+ griptape_nodes/retained_mode/events/workflow_events.py,sha256=n_GOxfpCITT46uUJusU3cpsklK--8oDOEPL4aq6AQdU,18661
60
+ griptape_nodes/retained_mode/griptape_nodes.py,sha256=KAHju-jgUHQGtb5I3T5_IgdTezooz0rTa57iQeif7KY,24988
61
+ griptape_nodes/retained_mode/managers/__init__.py,sha256=OTXysKusqYCQeAYwnVj4PbE3MxvAUTq9xOZT6vUE3JA,24
62
+ griptape_nodes/retained_mode/managers/agent_manager.py,sha256=ZL01xBfx0Bg84QH7OX_Zel1VOGL6t86nxdaUG3HFUYs,11265
63
+ griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=9c3-taR1mKTNbUHxT_Znw__cYZ4DTnDs5JB8Vb9Mm6s,1807
64
+ griptape_nodes/retained_mode/managers/config_manager.py,sha256=11shHccjKfS3WvCYH4F2s2HIKnbPMsZ6iWBVgZkxPDA,25676
65
+ griptape_nodes/retained_mode/managers/context_manager.py,sha256=DiGNh09TZ7rsLEcXqqB9Yrh2ietBy59LPF7GM0OBQS8,22930
66
+ griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=GBBz7HJBJVNyXLGRdAvqDgihMRB_YjWqdEwLMCnadUg,4409
67
+ griptape_nodes/retained_mode/managers/event_manager.py,sha256=rGoeGO0ATZd9w8Gm1RDHoODDYyJ-XqxiGJidYijH_QY,7201
68
+ griptape_nodes/retained_mode/managers/flow_manager.py,sha256=3xE61Pa6dUdboPTvhW-OSYOXbyKQdBIzQkwqXp3Rv5U,111589
69
+ griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py,sha256=Iq79VxTdETiExBfFWXceJggDZqS6X3OkzXE9XwFclVw,1340
70
+ griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py,sha256=fvAP0VaYGPHYl_Kg3RL4gdJlpqya8UTvpP-C49r950k,6723
71
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py,sha256=xE6I3jGWxSSkUtuZebwk0AvukIP2JzLBN4tNqq_MEm0,14758
72
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_fsm.py,sha256=DWTSIDbhgFDQIGxrLaDO3y8GIt77-3KD0wWwx_R30N8,18549
73
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/__init__.py,sha256=X0SnqNuEtBVPvccfrUr_wBQQ9i5xJzcaWJLwFJTRRco,814
74
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/base.py,sha256=jeO8k1B6OV50jkN8lXvu_JkhqBGlhC0unULeNQx8w3o,2609
75
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/github.py,sha256=KctvCUy6ysM4zIp0XXkDOIlMJryapJAoXWA2ZXPxM4I,4302
76
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/local_file.py,sha256=mVE-MG2qc0pN_ZzdqH7lkzMopVJRjn-F3LVdvfceRaw,15292
77
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/package.py,sha256=hbHg-P4ALGgAqlkbaV1hM1v3Fwl5uJKUi_Z94hS3Bu8,3746
78
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=32sj26dns8uvQIZUxHNmCDsKyXUZDP_PNKifXPUWeHg,6111
79
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=cCGr-MQ1RlVBiUTZepYEKdVhPgC4ebcYrmpv8rI3VeM,894
80
+ griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
81
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=yJzyQAAPa8-UCk4xBtloaUeH9RQX7F-QsXOMCFIpTxE,98816
82
+ griptape_nodes/retained_mode/managers/node_manager.py,sha256=gNM_IO57mpWS74g_fiRo9EfLQ4a0UAW6_LXGDzixtkM,147631
83
+ griptape_nodes/retained_mode/managers/object_manager.py,sha256=tIPeAiF94ptIpXxM29qFgQTaXazRgX7faTJLV87yWZE,12403
84
+ griptape_nodes/retained_mode/managers/operation_manager.py,sha256=lTkMZlaacTgtV5oV-YF6HG8xsx9V_LwX1eg074WTs2k,20137
85
+ griptape_nodes/retained_mode/managers/os_manager.py,sha256=bPJYCkJASisbWuA9qDKCXTquGEaVOMdgBTWOO10WmbA,34347
86
+ griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=6MTvnXQUjYXuCzXIlhozKYoF1jTk6BrDiML-vepqafY,6384
87
+ griptape_nodes/retained_mode/managers/session_manager.py,sha256=fLjtBvgGY3daq1vbpJPXq069n35Z-Zr5dF3B0XyD2JY,11817
88
+ griptape_nodes/retained_mode/managers/settings.py,sha256=wAPQFlUHmw5nQKxT-9Bw_yxduaxc7XHtdehdHDhqUZc,4665
89
+ griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=cEtzWoTsl1sJyYyVWrd2O7kPSpQ1rjRYx7P_Lm5wtF8,7339
90
+ griptape_nodes/retained_mode/managers/sync_manager.py,sha256=oVtFLQa-S4iiGwuuy8YJ0lZvbkF106VE3jW2qjCQoQM,20671
91
+ griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=85gpl9WCgHbWNifxoiAidHmsXyqpUCTjuEW-FziFYME,8375
92
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=XhsIAA2gBrO2ZI5jXijbmP05dFvyBDaG9DTPwY6qfZ4,177538
93
+ griptape_nodes/retained_mode/retained_mode.py,sha256=NmpAQ3NksDdAZ9SMGRfbSDKBr5cDRjSu06SJNGH2Vvw,56903
94
+ griptape_nodes/retained_mode/utils/__init__.py,sha256=W5dvv8YwvVVq_8eVTgMd3Z_VB_Dtq1sIIVq8745QH_I,52
95
+ griptape_nodes/retained_mode/utils/engine_identity.py,sha256=PZmdlYM69-B-6Z1F4iJfZyVm2twJY5cSGoiUJCMj0xU,7846
96
+ griptape_nodes/retained_mode/utils/name_generator.py,sha256=IZLahtfP3XC79XApLdGoZ0IKKUkgiITpd16RK7NbyEs,2524
97
+ griptape_nodes/traits/__init__.py,sha256=bTLXTiZTJz2z15RRLoPI4nvLnNW9FiLcKL_2pT4E10g,32
98
+ griptape_nodes/traits/add_param_button.py,sha256=Xtc39SfvYY6JDjhxu2wmdeaHW2X4LkpNAQufSTCP3hY,655
99
+ griptape_nodes/traits/button.py,sha256=rpQQ77ASKH3YJabc5WWw9DpEHQiMg1jx0i0sdkwH-SA,611
100
+ griptape_nodes/traits/clamp.py,sha256=BZVHiWfBNePWaPMaLyOgtcWzkM7Ls4hcPlm_afmGiIs,1030
101
+ griptape_nodes/traits/compare.py,sha256=X-BXGemRDxQV4EX8X24LdtcwMWwfQ1jGqDvH2bSiSuc,521
102
+ griptape_nodes/traits/compare_images.py,sha256=KW0WlwsJP6nBoC1irdeRnUWUnZIJvlROlDhyWhX8iEs,1594
103
+ griptape_nodes/traits/file_system_picker.py,sha256=p-RaH4xwb2Fo0wuFsYbsiL66W23KdESX0Qq6EAtDFj8,5806
104
+ griptape_nodes/traits/minmax.py,sha256=eVySrz02WPvpwbSrqW7FRTmetNBOBKyf8YrXrzyOGnk,1312
105
+ griptape_nodes/traits/options.py,sha256=Kj7isw0XkhI1jmCCYuXP63Td8K8rg21nGC77ultNXnI,1096
106
+ griptape_nodes/traits/slider.py,sha256=bLe46gtCmjhMCHaGzUstIWMJv2Zl2Yee7fkT6g4Q6Rk,1236
107
+ griptape_nodes/traits/trait_registry.py,sha256=pU26mW2ztfu1UARGYloflsTPqJ1X_-u013cMNoel9Hw,1171
108
+ griptape_nodes/traits/traits.json,sha256=xtY7lcMzeUPiyh494xj4LyRl44c0VBFL-LRAkywuxD4,60
109
+ griptape_nodes/updater/__init__.py,sha256=eWalSt_N5a0RPT2YkXeIee_YPiCL47OB0G9GB0gn3pY,2522
110
+ griptape_nodes/updater/__main__.py,sha256=lhMMctbBeni57ximitvkwqJ1TQzk79Jg9w0rkKjtp5Y,79
111
+ griptape_nodes/utils/__init__.py,sha256=5-NvqVvxiwuRx2UgyzenuLFXyodvfDqJ_dzcrgZpPOk,33
112
+ griptape_nodes/utils/dict_utils.py,sha256=kyli5MOfzSor0a8lmXfYBVS_NXGf6UK1SM6k_Qn5bs8,6889
113
+ griptape_nodes/utils/image_preview.py,sha256=NhYIqohRF9vbFpWIEvZHdPLLPK_JdUBvC4RvNAsSa1w,4480
114
+ griptape_nodes/utils/metaclasses.py,sha256=RSKyAvZppH_hbMugmUmIr8QqOg1sYY4uRNfQybD4O8Q,287
115
+ griptape_nodes/utils/uv_utils.py,sha256=ZK37LmacKfxMVKkcIOyJ35HOXgV6sFWE9CzgKPmaRU0,519
116
+ griptape_nodes/utils/version_utils.py,sha256=Y-HJfJW6Jxuz_jOnHxMiy-pmMauHRnY-7BO3alGmw-Q,4318
117
+ griptape_nodes/version_compatibility/__init__.py,sha256=JMz1sB7Zsj6pS1S5sdsPR0kn89s1A0sB0kFIvygJYfo,74
118
+ griptape_nodes/version_compatibility/versions/__init__.py,sha256=PWSxM28LPUdBdRPA98j4RUWvuZ4NqfX1day2VU6SqPw,74
119
+ griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py,sha256=21iKlFpsmBW4WsAexSD0WMAJnsYmMq2sIbDeYC831fc,62
120
+ griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py,sha256=z4hXUeZNSlkJ7xwG6HRJISeWA7iAtZLKQhTiTvyhSwk,5262
121
+ griptape_nodes/version_compatibility/workflow_versions/__init__.py,sha256=z5XDgkizoNByCXpyo34hfsJKFsWlOHbD6hgzfYH9ubc,52
122
+ griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
123
+ griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=9PclAp_Mm5IPtd5yj5XSS5-x7QYmifvhTly20CgBZmo,2018
124
+ griptape_nodes-0.51.0.dist-info/WHEEL,sha256=4n27za1eEkOnA7dNjN6C5-O2rUiw6iapszm14Uj-Qmk,79
125
+ griptape_nodes-0.51.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
126
+ griptape_nodes-0.51.0.dist-info/METADATA,sha256=T0xTRn5SMCOcFTVFS_d6sBC_XdxGNGiiA3YzQMFWl0Q,4980
127
+ griptape_nodes-0.51.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.11
2
+ Generator: uv 0.8.13
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any