griptape-nodes 0.45.1__py3-none-any.whl → 0.47.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.
Files changed (30) hide show
  1. griptape_nodes/__init__.py +51 -14
  2. griptape_nodes/exe_types/core_types.py +65 -10
  3. griptape_nodes/exe_types/node_types.py +10 -0
  4. griptape_nodes/machines/node_resolution.py +10 -8
  5. griptape_nodes/node_library/workflow_registry.py +1 -1
  6. griptape_nodes/retained_mode/events/base_events.py +74 -1
  7. griptape_nodes/retained_mode/events/secrets_events.py +2 -0
  8. griptape_nodes/retained_mode/events/workflow_events.py +4 -2
  9. griptape_nodes/retained_mode/griptape_nodes.py +17 -13
  10. griptape_nodes/retained_mode/managers/agent_manager.py +8 -6
  11. griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py +1 -1
  12. griptape_nodes/retained_mode/managers/config_manager.py +36 -45
  13. griptape_nodes/retained_mode/managers/flow_manager.py +98 -98
  14. griptape_nodes/retained_mode/managers/library_manager.py +51 -51
  15. griptape_nodes/retained_mode/managers/node_manager.py +122 -129
  16. griptape_nodes/retained_mode/managers/object_manager.py +9 -10
  17. griptape_nodes/retained_mode/managers/os_manager.py +31 -31
  18. griptape_nodes/retained_mode/managers/secrets_manager.py +5 -5
  19. griptape_nodes/retained_mode/managers/static_files_manager.py +18 -17
  20. griptape_nodes/retained_mode/managers/sync_manager.py +3 -2
  21. griptape_nodes/retained_mode/managers/version_compatibility_manager.py +84 -1
  22. griptape_nodes/retained_mode/managers/workflow_manager.py +221 -163
  23. griptape_nodes/retained_mode/retained_mode.py +22 -44
  24. griptape_nodes/version_compatibility/workflow_versions/__init__.py +1 -0
  25. griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py +1 -0
  26. griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py +42 -0
  27. {griptape_nodes-0.45.1.dist-info → griptape_nodes-0.47.0.dist-info}/METADATA +1 -1
  28. {griptape_nodes-0.45.1.dist-info → griptape_nodes-0.47.0.dist-info}/RECORD +30 -27
  29. {griptape_nodes-0.45.1.dist-info → griptape_nodes-0.47.0.dist-info}/WHEEL +1 -1
  30. {griptape_nodes-0.45.1.dist-info → griptape_nodes-0.47.0.dist-info}/entry_points.txt +0 -0
@@ -315,9 +315,8 @@ class LibraryManager:
315
315
  """Get all registered event handlers for a specific request type."""
316
316
  request_type = PayloadRegistry.get_type(request.request_type)
317
317
  if request_type is None:
318
- return ListCapableLibraryEventHandlersResultFailure(
319
- exception=KeyError(f"Request type '{request.request_type}' is not registered in the PayloadRegistry.")
320
- )
318
+ details = f"Request type '{request.request_type}' is not registered in the PayloadRegistry."
319
+ return ListCapableLibraryEventHandlersResultFailure(exception=KeyError(details), result_details=details)
321
320
  handler_mappings = self.get_registered_event_handlers(request_type)
322
321
  return ListCapableLibraryEventHandlersResultSuccess(handlers=list(handler_mappings.keys()))
323
322
 
@@ -342,7 +341,7 @@ class LibraryManager:
342
341
  details = f"Attempted to list node types in a Library named '{request.library}'. Failed because no Library with that name was registered."
343
342
  logger.error(details)
344
343
 
345
- result = ListNodeTypesInLibraryResultFailure()
344
+ result = ListNodeTypesInLibraryResultFailure(result_details=details)
346
345
  return result
347
346
 
348
347
  # Cool, get a copy of the list.
@@ -365,7 +364,7 @@ class LibraryManager:
365
364
  details = f"Attempted to get metadata for Library '{request.library}'. Failed because no Library with that name was registered."
366
365
  logger.error(details)
367
366
 
368
- result = GetLibraryMetadataResultFailure()
367
+ result = GetLibraryMetadataResultFailure(result_details=details)
369
368
  return result
370
369
 
371
370
  # Get the metadata off of it.
@@ -398,6 +397,7 @@ class LibraryManager:
398
397
  problems=[
399
398
  "Library could not be found at the file path specified. It will be removed from the configuration."
400
399
  ],
400
+ result_details=details,
401
401
  )
402
402
 
403
403
  # Load the JSON
@@ -412,6 +412,7 @@ class LibraryManager:
412
412
  library_name=None,
413
413
  status=LibraryStatus.UNUSABLE,
414
414
  problems=["Library file not formatted as proper JSON."],
415
+ result_details=details,
415
416
  )
416
417
  except Exception as err:
417
418
  details = f"Attempted to load Library JSON file from location '{json_path}'. Failed because an exception occurred: {err}"
@@ -421,6 +422,7 @@ class LibraryManager:
421
422
  library_name=None,
422
423
  status=LibraryStatus.UNUSABLE,
423
424
  problems=[f"Exception occurred when attempting to load the library: {err}."],
425
+ result_details=details,
424
426
  )
425
427
 
426
428
  # Try to extract library name from JSON for better error reporting
@@ -445,6 +447,7 @@ class LibraryManager:
445
447
  library_name=library_name,
446
448
  status=LibraryStatus.UNUSABLE,
447
449
  problems=problems,
450
+ result_details=details,
448
451
  )
449
452
  except Exception as err:
450
453
  details = f"Attempted to load Library JSON file. Failed because the file at path '{json_path}' failed to match the library schema due to: {err}"
@@ -454,6 +457,7 @@ class LibraryManager:
454
457
  library_name=library_name,
455
458
  status=LibraryStatus.UNUSABLE,
456
459
  problems=[f"Library file did not match the library schema specified due to: {err}"],
460
+ result_details=details,
457
461
  )
458
462
 
459
463
  details = f"Successfully loaded library metadata from JSON file at {json_path}"
@@ -523,11 +527,13 @@ class LibraryManager:
523
527
  sandbox_library_dir_as_posix = sandbox_library_dir.as_posix()
524
528
 
525
529
  if not sandbox_library_dir.exists():
530
+ details = "Sandbox directory does not exist."
526
531
  return LoadLibraryMetadataFromFileResultFailure(
527
532
  library_path=sandbox_library_dir_as_posix,
528
533
  library_name=LibraryManager.SANDBOX_LIBRARY_NAME,
529
534
  status=LibraryStatus.MISSING,
530
- problems=["Sandbox directory does not exist."],
535
+ problems=[details],
536
+ result_details=details,
531
537
  )
532
538
 
533
539
  sandbox_node_candidates = self._find_files_in_dir(directory=sandbox_library_dir, extension=".py")
@@ -578,11 +584,13 @@ class LibraryManager:
578
584
 
579
585
  engine_version = GriptapeNodes().handle_engine_version_request(request=GetEngineVersionRequest())
580
586
  if not isinstance(engine_version, GetEngineVersionResultSuccess):
587
+ details = "Could not get engine version for sandbox library generation."
581
588
  return LoadLibraryMetadataFromFileResultFailure(
582
589
  library_path=sandbox_library_dir_as_posix,
583
590
  library_name=LibraryManager.SANDBOX_LIBRARY_NAME,
584
591
  status=LibraryStatus.UNUSABLE,
585
- problems=["Could not get engine version for sandbox library generation."],
592
+ problems=[details],
593
+ result_details=details,
586
594
  )
587
595
 
588
596
  engine_version_str = f"{engine_version.major}.{engine_version.minor}.{engine_version.patch}"
@@ -619,7 +627,7 @@ class LibraryManager:
619
627
  details = f"Attempted to get node metadata for a node type '{request.node_type}' in a Library named '{request.library}'. Failed because no Library with that name was registered."
620
628
  logger.error(details)
621
629
 
622
- result = GetNodeMetadataFromLibraryResultFailure()
630
+ result = GetNodeMetadataFromLibraryResultFailure(result_details=details)
623
631
  return result
624
632
 
625
633
  # Does the node type exist within the library?
@@ -629,7 +637,7 @@ class LibraryManager:
629
637
  details = f"Attempted to get node metadata for a node type '{request.node_type}' in a Library named '{request.library}'. Failed because no node type of that name could be found in the Library."
630
638
  logger.error(details)
631
639
 
632
- result = GetNodeMetadataFromLibraryResultFailure()
640
+ result = GetNodeMetadataFromLibraryResultFailure(result_details=details)
633
641
  return result
634
642
 
635
643
  details = f"Successfully retrieved node metadata for a node type '{request.node_type}' in a Library named '{request.library}'."
@@ -647,7 +655,7 @@ class LibraryManager:
647
655
  except KeyError:
648
656
  details = f"Attempted to get categories in a Library named '{request.library}'. Failed because no Library with that name was registered."
649
657
  logger.error(details)
650
- result = ListCategoriesInLibraryResultFailure()
658
+ result = ListCategoriesInLibraryResultFailure(result_details=details)
651
659
  return result
652
660
 
653
661
  categories = library.get_categories()
@@ -672,7 +680,7 @@ class LibraryManager:
672
680
  )
673
681
  details = f"Attempted to load Library JSON file. Failed because no file could be found at the specified path: {json_path}"
674
682
  logger.error(details)
675
- return RegisterLibraryFromFileResultFailure()
683
+ return RegisterLibraryFromFileResultFailure(result_details=details)
676
684
 
677
685
  # Use the new metadata loading functionality
678
686
  metadata_request = LoadLibraryMetadataFromFileRequest(file_path=file_path)
@@ -688,7 +696,7 @@ class LibraryManager:
688
696
  status=failure_result.status,
689
697
  problems=failure_result.problems,
690
698
  )
691
- return RegisterLibraryFromFileResultFailure()
699
+ return RegisterLibraryFromFileResultFailure(result_details=str(failure_result.result_details))
692
700
 
693
701
  # Get the validated library data
694
702
  library_data = metadata_result.library_schema
@@ -706,7 +714,7 @@ class LibraryManager:
706
714
  )
707
715
  details = f"Attempted to load Library '{library_data.name}' JSON file from '{json_path}'. Failed because version string '{library_data.metadata.library_version}' wasn't valid. Must be in major.minor.patch format."
708
716
  logger.error(details)
709
- return RegisterLibraryFromFileResultFailure()
717
+ return RegisterLibraryFromFileResultFailure(result_details=details)
710
718
 
711
719
  # Get the directory containing the JSON file to resolve relative paths
712
720
  base_dir = json_path.parent.absolute()
@@ -733,7 +741,7 @@ class LibraryManager:
733
741
  )
734
742
  details = f"Attempted to load Library '{library_data.name}' from '{json_path}'. Failed to load Advanced Library module: {err}"
735
743
  logger.error(details)
736
- return RegisterLibraryFromFileResultFailure()
744
+ return RegisterLibraryFromFileResultFailure(result_details=details)
737
745
 
738
746
  # Create or get the library
739
747
  try:
@@ -758,7 +766,7 @@ class LibraryManager:
758
766
 
759
767
  details = f"Attempted to load Library JSON file from '{json_path}'. Failed because a Library '{library_data.name}' already exists. Error: {err}."
760
768
  logger.error(details)
761
- return RegisterLibraryFromFileResultFailure()
769
+ return RegisterLibraryFromFileResultFailure(result_details=details)
762
770
 
763
771
  # Install node library dependencies
764
772
  try:
@@ -784,19 +792,15 @@ class LibraryManager:
784
792
  )
785
793
  details = f"Attempted to load Library JSON file from '{json_path}'. Failed when creating the virtual environment: {e}."
786
794
  logger.error(details)
787
- return RegisterLibraryFromFileResultFailure()
795
+ return RegisterLibraryFromFileResultFailure(result_details=details)
788
796
  if self._can_write_to_venv_location(library_venv_python_path):
789
797
  # Check disk space before installing dependencies
790
798
  config_manager = GriptapeNodes.ConfigManager()
791
799
  min_space_gb = config_manager.get_config_value("minimum_disk_space_gb_libraries")
792
800
  if not OSManager.check_available_disk_space(Path(venv_path), min_space_gb):
793
801
  error_msg = OSManager.format_disk_space_error(Path(venv_path))
794
- logger.error(
795
- "Attempted to load Library JSON from '%s'. Failed when installing dependencies (requires %.1f GB): %s",
796
- json_path,
797
- min_space_gb,
798
- error_msg,
799
- )
802
+ details = f"Attempted to load Library JSON from '{json_path}'. Failed when installing dependencies due to insufficient disk space (requires {min_space_gb} GB): {error_msg}"
803
+ logger.error(details)
800
804
  self._library_file_path_to_info[file_path] = LibraryManager.LibraryInfo(
801
805
  library_path=file_path,
802
806
  library_name=library_data.name,
@@ -806,7 +810,7 @@ class LibraryManager:
806
810
  f"Insufficient disk space for dependencies (requires {min_space_gb} GB): {error_msg}"
807
811
  ],
808
812
  )
809
- return RegisterLibraryFromFileResultFailure()
813
+ return RegisterLibraryFromFileResultFailure(result_details=details)
810
814
 
811
815
  # Grab the python executable from the virtual environment so that we can pip install there
812
816
  logger.info(
@@ -847,7 +851,7 @@ class LibraryManager:
847
851
  )
848
852
  details = f"Attempted to load Library JSON file from '{json_path}'. Failed when installing dependencies: {error_details}"
849
853
  logger.error(details)
850
- return RegisterLibraryFromFileResultFailure()
854
+ return RegisterLibraryFromFileResultFailure(result_details=details)
851
855
 
852
856
  # We are at least potentially viable.
853
857
  # Record all problems that occurred
@@ -910,11 +914,11 @@ class LibraryManager:
910
914
  case LibraryStatus.UNUSABLE:
911
915
  details = f"Attempted to load Library JSON file from '{json_path}'. Failed because no nodes were loaded. Check the log for more details."
912
916
  logger.error(details)
913
- return RegisterLibraryFromFileResultFailure()
917
+ return RegisterLibraryFromFileResultFailure(result_details=details)
914
918
  case _:
915
919
  details = f"Attempted to load Library JSON file from '{json_path}'. Failed because an unknown/unexpected status '{library_load_results.status}' was returned."
916
920
  logger.error(details)
917
- return RegisterLibraryFromFileResultFailure()
921
+ return RegisterLibraryFromFileResultFailure(result_details=details)
918
922
 
919
923
  def register_library_from_requirement_specifier_request(
920
924
  self, request: RegisterLibraryFromRequirementSpecifierRequest
@@ -930,20 +934,16 @@ class LibraryManager:
930
934
  except RuntimeError as e:
931
935
  details = f"Attempted to install library '{request.requirement_specifier}'. Failed when creating the virtual environment: {e}"
932
936
  logger.error(details)
933
- return RegisterLibraryFromRequirementSpecifierResultFailure()
937
+ return RegisterLibraryFromRequirementSpecifierResultFailure(result_details=details)
934
938
  if self._can_write_to_venv_location(library_python_venv_path):
935
939
  # Check disk space before installing dependencies
936
940
  config_manager = GriptapeNodes.ConfigManager()
937
941
  min_space_gb = config_manager.get_config_value("minimum_disk_space_gb_libraries")
938
942
  if not OSManager.check_available_disk_space(Path(venv_path), min_space_gb):
939
943
  error_msg = OSManager.format_disk_space_error(Path(venv_path))
940
- logger.error(
941
- "Attempted to install library '%s'. Failed when installing dependencies (requires %.1f GB): %s",
942
- request.requirement_specifier,
943
- min_space_gb,
944
- error_msg,
945
- )
946
- return RegisterLibraryFromRequirementSpecifierResultFailure()
944
+ details = f"Attempted to install library '{request.requirement_specifier}'. Failed when installing dependencies due to insufficient disk space (requires {min_space_gb} GB): {error_msg}"
945
+ logger.error(details)
946
+ return RegisterLibraryFromRequirementSpecifierResultFailure(result_details=details)
947
947
 
948
948
  uv_path = find_uv_bin()
949
949
 
@@ -970,11 +970,11 @@ class LibraryManager:
970
970
  except subprocess.CalledProcessError as e:
971
971
  details = f"Attempted to install library '{request.requirement_specifier}'. Failed: return code={e.returncode}, stdout={e.stdout}, stderr={e.stderr}"
972
972
  logger.error(details)
973
- return RegisterLibraryFromRequirementSpecifierResultFailure()
973
+ return RegisterLibraryFromRequirementSpecifierResultFailure(result_details=details)
974
974
  except InvalidRequirement as e:
975
975
  details = f"Attempted to install library '{request.requirement_specifier}'. Failed due to invalid requirement specifier: {e}"
976
976
  logger.error(details)
977
- return RegisterLibraryFromRequirementSpecifierResultFailure()
977
+ return RegisterLibraryFromRequirementSpecifierResultFailure(result_details=details)
978
978
 
979
979
  library_path = str(files(package_name).joinpath(request.library_config_name))
980
980
 
@@ -982,7 +982,7 @@ class LibraryManager:
982
982
  if isinstance(register_result, RegisterLibraryFromFileResultFailure):
983
983
  details = f"Attempted to install library '{request.requirement_specifier}'. Failed due to {register_result}"
984
984
  logger.error(details)
985
- return RegisterLibraryFromRequirementSpecifierResultFailure()
985
+ return RegisterLibraryFromRequirementSpecifierResultFailure(result_details=details)
986
986
 
987
987
  return RegisterLibraryFromRequirementSpecifierResultSuccess(library_name=request.requirement_specifier)
988
988
 
@@ -1109,7 +1109,7 @@ class LibraryManager:
1109
1109
  except Exception as e:
1110
1110
  details = f"Attempted to unload library '{request.library_name}'. Failed due to {e}"
1111
1111
  logger.error(details)
1112
- return UnloadLibraryFromRegistryResultFailure()
1112
+ return UnloadLibraryFromRegistryResultFailure(result_details=details)
1113
1113
 
1114
1114
  # Clean up all stable module aliases for this library
1115
1115
  self._unregister_all_stable_module_aliases_for_library(request.library_name)
@@ -1131,7 +1131,7 @@ class LibraryManager:
1131
1131
  if not list_libraries_result.succeeded():
1132
1132
  details = "Attempted to get all info for all libraries, but listing the registered libraries failed."
1133
1133
  logger.error(details)
1134
- return GetAllInfoForAllLibrariesResultFailure()
1134
+ return GetAllInfoForAllLibrariesResultFailure(result_details=details)
1135
1135
 
1136
1136
  try:
1137
1137
  list_libraries_success = cast("ListRegisteredLibrariesResultSuccess", list_libraries_result)
@@ -1146,7 +1146,7 @@ class LibraryManager:
1146
1146
  if not library_all_info_result.succeeded():
1147
1147
  details = f"Attempted to get all info for all libraries, but failed when getting all info for library named '{library_name}'."
1148
1148
  logger.error(details)
1149
- return GetAllInfoForAllLibrariesResultFailure()
1149
+ return GetAllInfoForAllLibrariesResultFailure(result_details=details)
1150
1150
 
1151
1151
  library_all_info_success = cast("GetAllInfoForLibraryResultSuccess", library_all_info_result)
1152
1152
 
@@ -1154,7 +1154,7 @@ class LibraryManager:
1154
1154
  except Exception as err:
1155
1155
  details = f"Attempted to get all info for all libraries. Encountered error {err}."
1156
1156
  logger.error(details)
1157
- return GetAllInfoForAllLibrariesResultFailure()
1157
+ return GetAllInfoForAllLibrariesResultFailure(result_details=details)
1158
1158
 
1159
1159
  # We're home free now
1160
1160
  details = "Successfully retrieved all info for all libraries."
@@ -1169,7 +1169,7 @@ class LibraryManager:
1169
1169
  except KeyError:
1170
1170
  details = f"Attempted to get all library info for a Library named '{request.library}'. Failed because no Library with that name was registered."
1171
1171
  logger.error(details)
1172
- result = GetAllInfoForLibraryResultFailure()
1172
+ result = GetAllInfoForLibraryResultFailure(result_details=details)
1173
1173
  return result
1174
1174
 
1175
1175
  library_metadata_request = GetLibraryMetadataRequest(library=request.library)
@@ -1178,7 +1178,7 @@ class LibraryManager:
1178
1178
  if not library_metadata_result.succeeded():
1179
1179
  details = f"Attempted to get all library info for a Library named '{request.library}'. Failed attempting to get the library's metadata."
1180
1180
  logger.error(details)
1181
- return GetAllInfoForLibraryResultFailure()
1181
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1182
1182
 
1183
1183
  list_categories_request = ListCategoriesInLibraryRequest(library=request.library)
1184
1184
  list_categories_result = self.list_categories_in_library_request(list_categories_request)
@@ -1186,7 +1186,7 @@ class LibraryManager:
1186
1186
  if not list_categories_result.succeeded():
1187
1187
  details = f"Attempted to get all library info for a Library named '{request.library}'. Failed attempting to get the list of categories in the library."
1188
1188
  logger.error(details)
1189
- return GetAllInfoForLibraryResultFailure()
1189
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1190
1190
 
1191
1191
  node_type_list_request = ListNodeTypesInLibraryRequest(library=request.library)
1192
1192
  node_type_list_result = self.on_list_node_types_in_library_request(node_type_list_request)
@@ -1194,7 +1194,7 @@ class LibraryManager:
1194
1194
  if not node_type_list_result.succeeded():
1195
1195
  details = f"Attempted to get all library info for a Library named '{request.library}'. Failed attempting to get the list of node types in the library."
1196
1196
  logger.error(details)
1197
- return GetAllInfoForLibraryResultFailure()
1197
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1198
1198
 
1199
1199
  # Cast everyone to their success counterparts.
1200
1200
  try:
@@ -1206,7 +1206,7 @@ class LibraryManager:
1206
1206
  f"Attempted to get all library info for a Library named '{request.library}'. Encountered error: {err}."
1207
1207
  )
1208
1208
  logger.error(details)
1209
- return GetAllInfoForLibraryResultFailure()
1209
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1210
1210
 
1211
1211
  # Now build the map of node types to metadata.
1212
1212
  node_type_name_to_node_metadata_details = {}
@@ -1217,14 +1217,14 @@ class LibraryManager:
1217
1217
  if not node_metadata_result.succeeded():
1218
1218
  details = f"Attempted to get all library info for a Library named '{request.library}'. Failed attempting to get the metadata for a node type called '{node_type_name}'."
1219
1219
  logger.error(details)
1220
- return GetAllInfoForLibraryResultFailure()
1220
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1221
1221
 
1222
1222
  try:
1223
1223
  node_metadata_result_success = cast("GetNodeMetadataFromLibraryResultSuccess", node_metadata_result)
1224
1224
  except Exception as err:
1225
1225
  details = f"Attempted to get all library info for a Library named '{request.library}'. Encountered error: {err}."
1226
1226
  logger.error(details)
1227
- return GetAllInfoForLibraryResultFailure()
1227
+ return GetAllInfoForLibraryResultFailure(result_details=details)
1228
1228
 
1229
1229
  # Put it into the map.
1230
1230
  node_type_name_to_node_metadata_details[node_type_name] = node_metadata_result_success
@@ -2004,7 +2004,7 @@ class LibraryManager:
2004
2004
  if not clear_all_result.succeeded():
2005
2005
  details = "Failed to clear the existing object state when preparing to reload all libraries."
2006
2006
  logger.error(details)
2007
- return ReloadAllLibrariesResultFailure()
2007
+ return ReloadAllLibrariesResultFailure(result_details=details)
2008
2008
 
2009
2009
  # Unload all libraries now.
2010
2010
  all_libraries_request = ListRegisteredLibrariesRequest()
@@ -2012,7 +2012,7 @@ class LibraryManager:
2012
2012
  if not isinstance(all_libraries_result, ListRegisteredLibrariesResultSuccess):
2013
2013
  details = "When preparing to reload all libraries, failed to get registered libraries."
2014
2014
  logger.error(details)
2015
- return ReloadAllLibrariesResultFailure()
2015
+ return ReloadAllLibrariesResultFailure(result_details=details)
2016
2016
 
2017
2017
  for library_name in all_libraries_result.libraries:
2018
2018
  unload_library_request = UnloadLibraryFromRegistryRequest(library_name=library_name)
@@ -2020,7 +2020,7 @@ class LibraryManager:
2020
2020
  if not unload_library_result.succeeded():
2021
2021
  details = f"When preparing to reload all libraries, failed to unload library '{library_name}'."
2022
2022
  logger.error(details)
2023
- return ReloadAllLibrariesResultFailure()
2023
+ return ReloadAllLibrariesResultFailure(result_details=details)
2024
2024
 
2025
2025
  # Load (or reload, which should trigger a hot reload) all libraries
2026
2026
  self.load_all_libraries_from_config()