sapiopycommons 2025.9.10a743__tar.gz → 2025.9.10a745__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.

Potentially problematic release.


This version of sapiopycommons might be problematic. Click here for more details.

Files changed (124) hide show
  1. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/tool_service_base.py +26 -4
  4. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/.gitignore +0 -0
  5. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/LICENSE +0 -0
  6. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/README.md +0 -0
  7. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/__init__.py +0 -0
  8. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/__init__.py +0 -0
  9. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/converter_service_base.py +0 -0
  10. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2.py +0 -0
  11. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2.pyi +0 -0
  12. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2_grpc.py +0 -0
  13. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2.py +0 -0
  14. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2.pyi +0 -0
  15. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2_grpc.py +0 -0
  16. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2.py +0 -0
  17. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2.pyi +0 -0
  18. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2_grpc.py +0 -0
  19. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2.py +0 -0
  20. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2.pyi +0 -0
  21. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2_grpc.py +0 -0
  22. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2.py +0 -0
  23. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2.pyi +0 -0
  24. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2_grpc.py +0 -0
  25. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2.py +0 -0
  26. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2.pyi +0 -0
  27. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2_grpc.py +0 -0
  28. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_pb2.py +0 -0
  29. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_pb2.pyi +0 -0
  30. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/step_pb2_grpc.py +0 -0
  31. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2.py +0 -0
  32. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2.pyi +0 -0
  33. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2_grpc.py +0 -0
  34. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2.py +0 -0
  35. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2.pyi +0 -0
  36. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2_grpc.py +0 -0
  37. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2.py +0 -0
  38. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2.pyi +0 -0
  39. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2_grpc.py +0 -0
  40. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/protobuf_utils.py +0 -0
  41. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/server.py +0 -0
  42. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/ai/test_client.py +0 -0
  43. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/callbacks/__init__.py +0 -0
  44. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  45. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  46. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  47. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/chem/Molecules.py +0 -0
  48. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/chem/__init__.py +0 -0
  49. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/customreport/__init__.py +0 -0
  50. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  51. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/customreport/column_builder.py +0 -0
  52. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  53. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/customreport/term_builder.py +0 -0
  54. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/datatype/__init__.py +0 -0
  55. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  56. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/datatype/data_fields.py +0 -0
  57. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  58. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/__init__.py +0 -0
  59. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/experiment_cache.py +0 -0
  60. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  61. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  62. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/experiment_step_factory.py +0 -0
  63. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  64. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/plate_designer.py +0 -0
  65. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/eln/step_creation.py +0 -0
  66. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/__init__.py +0 -0
  67. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  68. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_bridge.py +0 -0
  69. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  70. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_data_handler.py +0 -0
  71. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_util.py +0 -0
  72. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_validator.py +0 -0
  73. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/file_writer.py +0 -0
  74. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/files/temp_files.py +0 -0
  75. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  76. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  77. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/__init__.py +0 -0
  78. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/accession_service.py +0 -0
  79. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/aliases.py +0 -0
  80. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/audit_log.py +0 -0
  81. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/custom_report_util.py +0 -0
  82. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/data_structure_util.py +0 -0
  83. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/directive_util.py +0 -0
  84. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/exceptions.py +0 -0
  85. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/html_formatter.py +0 -0
  86. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/popup_util.py +0 -0
  87. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/sapio_links.py +0 -0
  88. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/storage_util.py +0 -0
  89. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/general/time_util.py +0 -0
  90. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  91. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  92. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/processtracking/__init__.py +0 -0
  93. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  94. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  95. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  96. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  97. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/rules/__init__.py +0 -0
  98. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  99. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  100. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/samples/aliquot.py +0 -0
  101. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  102. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  103. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/webhook/__init__.py +0 -0
  104. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  105. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  106. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/src/sapiopycommons/webhook/webservice_handlers.py +0 -0
  107. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  108. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/_do_not_add_init_py_here +0 -0
  109. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/accession_test.py +0 -0
  110. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/aliquot_test.py +0 -0
  111. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/bio_reg_test.py +0 -0
  112. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/chem_test.py +0 -0
  113. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/chem_test_curation_queue.py +0 -0
  114. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/curation_queue_test.sdf +0 -0
  115. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/data_type_models.py +0 -0
  116. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  117. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  118. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  119. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto/8_color_ICS.wsp +0 -0
  120. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  121. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/flowcyto_test.py +0 -0
  122. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/kappa.chains.fasta +0 -0
  123. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/mafft_test.py +0 -0
  124. {sapiopycommons-2025.9.10a743 → sapiopycommons-2025.9.10a745}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.9.10a743
3
+ Version: 2025.9.10a745
4
4
  Summary: Official Sapio Python API Utilities Package
5
5
  Project-URL: Homepage, https://github.com/sapiosciences
6
6
  Author-email: Jonathan Steck <jsteck@sapiosciences.com>, Yechen Qiao <yqiao@sapiosciences.com>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sapiopycommons"
7
- version='2025.09.10a743'
7
+ version='2025.09.10a745'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -5,14 +5,16 @@ import io
5
5
  import json
6
6
  import logging
7
7
  import re
8
+ import subprocess
8
9
  import traceback
9
10
  from abc import abstractmethod, ABC
10
11
  from logging import Logger
12
+ from subprocess import CompletedProcess
11
13
  from typing import Any, Iterable, Mapping
12
14
 
13
15
  from grpc import ServicerContext
14
16
  from sapiopylib.rest.User import SapioUser, ensure_logger_initialized
15
- from sapiopylib.rest.pojo.datatype.FieldDefinition import AbstractVeloxFieldDefinition, FieldValidator
17
+ from sapiopylib.rest.pojo.datatype.FieldDefinition import AbstractVeloxFieldDefinition
16
18
 
17
19
  from sapiopycommons.ai.protoapi.fielddefinitions.fields_pb2 import FieldValueMapPbo, FieldValuePbo
18
20
  from sapiopycommons.ai.protoapi.fielddefinitions.velox_field_def_pb2 import VeloxFieldDefPbo, FieldTypePbo, \
@@ -663,7 +665,7 @@ class ToolBase(ABC):
663
665
  string_properties=StringPropertiesPbo(
664
666
  default_value=default_value,
665
667
  max_length=max_length,
666
- field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
668
+ field_validator=FieldValidatorPbo(validation_regex=validation_regex, error_message=error_msg) if validation_regex else None
667
669
  )
668
670
  ))
669
671
 
@@ -697,7 +699,7 @@ class ToolBase(ABC):
697
699
  default_value=default_value,
698
700
  static_list_values=allowed_values,
699
701
  direct_edit=direct_edit,
700
- field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
702
+ field_validator=FieldValidatorPbo(validation_regex=validation_regex, error_message=error_msg) if validation_regex else None
701
703
  )
702
704
  ))
703
705
 
@@ -732,7 +734,7 @@ class ToolBase(ABC):
732
734
  static_list_values=allowed_values,
733
735
  multi_select=True,
734
736
  direct_edit=direct_edit,
735
- field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
737
+ field_validator=FieldValidatorPbo(validation_regex=validation_regex, error_message=error_msg) if validation_regex else None
736
738
  )
737
739
  ))
738
740
 
@@ -828,6 +830,26 @@ class ToolBase(ABC):
828
830
  """
829
831
  pass
830
832
 
833
+ def call_subprocess(self, args: list[str], cwd: str | None = None, **kwargs) -> CompletedProcess[str]:
834
+ """
835
+ Call a subprocess with the given arguments, logging the command and any errors that occur.
836
+ This function will raise an exception if the return code of the subprocess is non-zero. The output of the
837
+ subprocess will be captured and returned as part of the CompletedProcess object.
838
+
839
+ :param args: The list of arguments to pass to the subprocess.
840
+ :param cwd: The working directory to run the subprocess in. If None, the current working directory is used.
841
+ :param kwargs: Additional keyword arguments to pass to subprocess.run().
842
+ :return: The CompletedProcess object returned by subprocess.run().
843
+ """
844
+ try:
845
+ self.log_info(f"Running subprocess with command: {' '.join(args)}")
846
+ return subprocess.run(args, check=True, capture_output=True, text=True, cwd=cwd, **kwargs)
847
+ except subprocess.CalledProcessError as e:
848
+ self.log_error(f"Error running subprocess. Return code: {e.returncode}")
849
+ self.log_error(f"STDOUT: {e.stdout}")
850
+ self.log_error(f"STDERR: {e.stderr}")
851
+ raise
852
+
831
853
  def log_info(self, message: str) -> None:
832
854
  """
833
855
  Log an info message for this tool. If verbose logging is enabled, this message will be included in the logs