griptape-nodes 0.65.3__py3-none-any.whl → 0.65.5__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.
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from pathlib import Path
10
+ from subprocess import _ENV
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
@@ -21,7 +22,7 @@ class PythonSubprocessExecutor:
21
22
  self._is_running = False
22
23
 
23
24
  async def execute_python_script(
24
- self, script_path: Path, args: list[str] | None = None, cwd: Path | None = None
25
+ self, script_path: Path, args: list[str] | None = None, cwd: Path | None = None, env: _ENV | None = None
25
26
  ) -> None:
26
27
  """Execute a Python script in a subprocess and wait for completion.
27
28
 
@@ -29,6 +30,7 @@ class PythonSubprocessExecutor:
29
30
  script_path: Path to the Python script to execute
30
31
  args: Additional command line arguments
31
32
  cwd: Working directory for the subprocess
33
+ env: Environment variables for the subprocess
32
34
  """
33
35
  if self.is_running():
34
36
  logger.warning("Another subprocess is already running. Terminating it first.")
@@ -44,6 +46,7 @@ class PythonSubprocessExecutor:
44
46
  self._process = await asyncio.create_subprocess_exec(
45
47
  *command,
46
48
  cwd=cwd,
49
+ env=env,
47
50
  stdout=asyncio.subprocess.PIPE,
48
51
  stderr=asyncio.subprocess.PIPE,
49
52
  )
@@ -125,6 +125,9 @@ class SubprocessWorkflowExecutor(LocalSessionWorkflowExecutor, PythonSubprocessE
125
125
  script_path=tmp_script_path,
126
126
  args=args,
127
127
  cwd=Path(tmpdir),
128
+ env={
129
+ "GTN_CONFIG_ENABLE_WORKSPACE_FILE_WATCHING": "false",
130
+ },
128
131
  )
129
132
  except Exception as e:
130
133
  msg = f"Failed to execute subprocess script: {e}"
@@ -83,4 +83,7 @@ class SubprocessWorkflowPublisher(LocalWorkflowPublisher, PythonSubprocessExecut
83
83
  script_path=tmp_script_path,
84
84
  args=args,
85
85
  cwd=Path(tmpdir),
86
+ env={
87
+ "GTN_CONFIG_ENABLE_WORKSPACE_FILE_WATCHING": "false",
88
+ },
86
89
  )
@@ -255,6 +255,31 @@ class ConfigManager:
255
255
  workspace_path = self.workspace_path
256
256
  return workspace_path / relative_path
257
257
 
258
+ def _coerce_to_type(self, value: Any, cast_type: type) -> Any:
259
+ """Coerce a value to the specified type.
260
+
261
+ This is particularly useful for environment variables which are always strings.
262
+
263
+ Args:
264
+ value: The value to coerce.
265
+ cast_type: The type to coerce to (bool, int, float, or str).
266
+
267
+ Returns:
268
+ The coerced value.
269
+ """
270
+ if cast_type is bool:
271
+ if isinstance(value, bool):
272
+ return value
273
+ if isinstance(value, str):
274
+ return value.lower() not in ("false", "0", "no", "")
275
+ return bool(value)
276
+ if cast_type is int:
277
+ return int(value)
278
+ if cast_type is float:
279
+ return float(value)
280
+ # str is a no-op
281
+ return value
282
+
258
283
  def get_config_value(
259
284
  self,
260
285
  key: str,
@@ -262,6 +287,7 @@ class ConfigManager:
262
287
  should_load_env_var_if_detected: bool = True,
263
288
  config_source: Literal["user_config", "workspace_config", "default_config", "merged_config"] = "merged_config",
264
289
  default: Any | None = None,
290
+ cast_type: type[bool] | type[int] | type[float] | type[str] | None = None,
265
291
  ) -> Any:
266
292
  """Get a value from the configuration.
267
293
 
@@ -273,6 +299,8 @@ class ConfigManager:
273
299
  should_load_env_var_if_detected: If True, and the value starts with a $, it will be pulled from the environment variables.
274
300
  config_source: The source of the configuration to use. Can be 'user_config', 'workspace_config', 'default_config', or 'merged_config'.
275
301
  default: The default value to return if the key is not found in the configuration.
302
+ cast_type: Optional type to coerce the value to (bool, int, float, or str). Useful for environment
303
+ variables which are always strings (e.g., "false" -> False when cast_type=bool).
276
304
 
277
305
  Returns:
278
306
  The value associated with the key, or the entire category if key points to a dict.
@@ -296,6 +324,9 @@ class ConfigManager:
296
324
 
297
325
  value = GriptapeNodes.SecretsManager().get_secret(value[1:])
298
326
 
327
+ if cast_type is not None:
328
+ value = self._coerce_to_type(value, cast_type)
329
+
299
330
  return value
300
331
 
301
332
  def set_config_value(self, key: str, value: Any, *, should_set_env_var_if_detected: bool = True) -> None:
@@ -616,7 +616,12 @@ class LibraryManager:
616
616
 
617
617
  # Get git remote and ref if this library is in a git repository
618
618
  library_dir = json_path.parent.absolute()
619
- git_remote = get_git_remote(library_dir)
619
+ try:
620
+ git_remote = get_git_remote(library_dir)
621
+ except GitRemoteError as e:
622
+ logger.debug("Failed to get git remote for %s: %s", library_dir, e)
623
+ git_remote = None
624
+
620
625
  try:
621
626
  git_ref = get_current_ref(library_dir)
622
627
  except GitRefError as e:
@@ -776,7 +781,12 @@ class LibraryManager:
776
781
  )
777
782
 
778
783
  # Get git remote and ref if the sandbox directory is in a git repository
779
- git_remote = get_git_remote(sandbox_library_dir)
784
+ try:
785
+ git_remote = get_git_remote(sandbox_library_dir)
786
+ except GitRemoteError as e:
787
+ logger.debug("Failed to get git remote for sandbox library %s: %s", sandbox_library_dir, e)
788
+ git_remote = None
789
+
780
790
  try:
781
791
  git_ref = get_current_ref(sandbox_library_dir)
782
792
  except GitRefError as e:
@@ -170,7 +170,9 @@ class SyncManager:
170
170
  self._get_cloud_storage_driver()
171
171
 
172
172
  # Check if file watching is enabled before starting it
173
- enable_file_watching = self._config_manager.get_config_value("enable_workspace_file_watching", default=True)
173
+ enable_file_watching = self._config_manager.get_config_value(
174
+ "enable_workspace_file_watching", default=True, cast_type=bool
175
+ )
174
176
  if enable_file_watching:
175
177
  # Start file watching after successful sync
176
178
  self._start_file_watching()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.65.3
3
+ Version: 0.65.5
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -9,17 +9,17 @@ griptape_nodes/app/app.py,sha256=48q09c2xDjvbf4Qa1_buQhnPjR2jqkXo428GeBRkw8g,160
9
9
  griptape_nodes/app/watch.py,sha256=hKVP_SuV9C17bH1h9o4uIVTKH-IL_-0iyHaNYmILTWU,1594
10
10
  griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
11
11
  griptape_nodes/bootstrap/utils/__init__.py,sha256=tlNEApJLZazcBNhxkTdup4URwznnz4nZxjSaRfFrTBM,31
12
- griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=pe7oC2tUNYpZDE2Aa-Q2LaFwXWYt21tYF18qYYbDCP4,4326
12
+ griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=JUCWV1G8oz1LtBhiLHoTtaYPG14zsYoj3bDvz3cWBQk,4466
13
13
  griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=pyjN81-eLtjyECFYLXOtMCixiiI9qBi5yald86iM7Ek,34
14
14
  griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py,sha256=Zqb9yQe-3PxcaCEpLVcq6CQPn5iwjl5TJjQehm1fvZ0,16652
15
15
  griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=jp81z4QFSuQsXigKN0h2Ywo0Tr_whbxFG-TJ7MCrS2Q,10263
16
- griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=owMjR_lNqLcLVKJXjNPyhmdSX6XtMTDfU_Eb9xmnEvA,12817
16
+ griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=2uDtGLtsEJcSzpCd8nEdRsIP6CDcIumTcI51izHlWUA,12944
17
17
  griptape_nodes/bootstrap/workflow_executors/utils/__init__.py,sha256=IEz4GHM4-w_u6VpLemrj-V38v8aZJinr5Wya9ucEad0,40
18
18
  griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py,sha256=LCW6P3s3DTG_cUvG41l4GxRyj43c1p9yYlcJMACeW3s,1659
19
19
  griptape_nodes/bootstrap/workflow_executors/workflow_executor.py,sha256=c9FQXcvskas9N3G5OnTQO2SxJZJVoxbn7lug1GIRUBw,1074
20
20
  griptape_nodes/bootstrap/workflow_publishers/__init__.py,sha256=7ncdCGtEArgTBgSFDNCSBoIIAJpzlph1wTd2wipwvvM,35
21
21
  griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py,sha256=ZLe0Bf-LVdeLgTkfzndawUaB-1P8AdZrM732ZMxcNaw,1721
22
- griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=O9gK7BvBE-5pMSG70rXLjibbUKfJuce85hWcs6iYyXg,2879
22
+ griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=h1Se4wjFMFFt9v_PD6QqBzujkDd_7w7mYxAIBXO4j_w,2994
23
23
  griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py,sha256=Kj-IIxgg01ihyUmLWgZu4ZJ6M7V1fK4Efw9quCcu-ZM,41
24
24
  griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py,sha256=5NfuaGrL-97Wb6JORRhR-zU4ooj3FaxOjqJizGb96Y0,2060
25
25
  griptape_nodes/cli/__init__.py,sha256=HuXHtxqDMtpYRokxiFYuNB7R5EgkOshPil273kTmgNg,33
@@ -142,7 +142,7 @@ griptape_nodes/retained_mode/griptape_nodes.py,sha256=0pv6TmHqcaNPb1Rd4XJzhYMLtx
142
142
  griptape_nodes/retained_mode/managers/__init__.py,sha256=OTXysKusqYCQeAYwnVj4PbE3MxvAUTq9xOZT6vUE3JA,24
143
143
  griptape_nodes/retained_mode/managers/agent_manager.py,sha256=B7O9lczy83AJjRwdHUFgs6I0Pd3ANNbzPYhf70bsg7c,26311
144
144
  griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=LyWzHQKmyDh-2zh2PIahdYyAthf_rMYs4zvhtVo-LsU,3423
145
- griptape_nodes/retained_mode/managers/config_manager.py,sha256=8kEQkXrt0frkLUfpjCaEvDN5hs6q4QTuVebwuFGOvKI,25546
145
+ griptape_nodes/retained_mode/managers/config_manager.py,sha256=74AMeaCS0eOeFbzMk5I54MtB7-SNQbwlx_-O6zBBQRo,26739
146
146
  griptape_nodes/retained_mode/managers/context_manager.py,sha256=eb44_CAZhCg2iYIoodlAPpYc67tG3sHyq9dPNoiq_1s,23031
147
147
  griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=-31364A03kU0YmAx3nM7nHdWfKnkej5Cawt_Plbwa68,10526
148
148
  griptape_nodes/retained_mode/managers/event_manager.py,sha256=v66GUmh5Knyxls-lB3TicsOxK535A7aZkmjDOIehbog,20537
@@ -208,7 +208,7 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/packa
208
208
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=XgG7whE74zWDxX1pOvhASW0pwjOei1EDLvIH19xdzT0,6117
209
209
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=cCGr-MQ1RlVBiUTZepYEKdVhPgC4ebcYrmpv8rI3VeM,894
210
210
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
211
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=aE6dlTL77jdS61D7Ut3wD5QX2wni30oTTm3N1KpFGI8,154119
211
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=oU_K_rWR_77qJOTtOeKH_fZlsNLyymeSQchoe9QMbxQ,154471
212
212
  griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=Ezmn5_48r4JWYe-tFGqmw9dXLvvTiO1rw9b4MNCkw0U,15955
213
213
  griptape_nodes/retained_mode/managers/model_manager.py,sha256=3lj2X8vIvDSERPtR2VEXNFEWy_D8H6muxRvD-PEx8U8,44845
214
214
  griptape_nodes/retained_mode/managers/node_manager.py,sha256=hLNiGnrzd1W_v3GBzfVrr6SNkKKQk6vbVgLaUIW1heQ,214936
@@ -229,7 +229,7 @@ griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=knoHlbR-VrkeNULY
229
229
  griptape_nodes/retained_mode/managers/session_manager.py,sha256=u3OEir9rjwG7GFM4MA5crKwcwq6F-lCUKlFzxlFU4co,14085
230
230
  griptape_nodes/retained_mode/managers/settings.py,sha256=BnIOYxsaE834_oIg6C_oRqFz0MDv8qSqLtwEGpiJZvA,12054
231
231
  griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=qQLOwugzqWoz2fzmOpXldU8U33R_WXQ8i4trIKodKv8,11494
232
- griptape_nodes/retained_mode/managers/sync_manager.py,sha256=xcV_PyVWtDpNyCPvc32m9ZqnmF7lRoChFwAuzxlyZYE,21402
232
+ griptape_nodes/retained_mode/managers/sync_manager.py,sha256=dF6nAAy1DLDQydefx7v3EtPCBiCrk4vURMum57WfmK8,21448
233
233
  griptape_nodes/retained_mode/managers/user_manager.py,sha256=JAOOKDhUfIbj0CJ5EHRBcplmxheQTzeogbvGO23VqXQ,4508
234
234
  griptape_nodes/retained_mode/managers/variable_manager.py,sha256=TnuqHSRK9Yiu_EtKxQksF9SyyQb72lbFQuTQZdpBxeE,24116
235
235
  griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=P7mW_XD0Cbxw-vlRoi6pQ9cG7hUX_CLJS9p5M1JytHQ,17025
@@ -277,7 +277,7 @@ griptape_nodes/version_compatibility/versions/v0_63_8/__init__.py,sha256=1VJswR2
277
277
  griptape_nodes/version_compatibility/versions/v0_63_8/deprecated_nodegroup_parameters.py,sha256=MqrmFszysezVEqsrGXrAK7VKjkVaxUtkpHysg15MDeM,4401
278
278
  griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
279
279
  griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py,sha256=Thx8acnbw5OychhwEEj9aFxvbPe7Wgn4V9ZmZ7KRZqc,2082
280
- griptape_nodes-0.65.3.dist-info/WHEEL,sha256=93kfTGt3a0Dykt_T-gsjtyS5_p8F_d6CE1NwmBOirzo,79
281
- griptape_nodes-0.65.3.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
282
- griptape_nodes-0.65.3.dist-info/METADATA,sha256=-qaV69DGa0V9Fm6dW0Y8tPFho-Zmprges164yrh-FUQ,5374
283
- griptape_nodes-0.65.3.dist-info/RECORD,,
280
+ griptape_nodes-0.65.5.dist-info/WHEEL,sha256=ZyFSCYkV2BrxH6-HRVRg3R9Fo7MALzer9KiPYqNxSbo,79
281
+ griptape_nodes-0.65.5.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
282
+ griptape_nodes-0.65.5.dist-info/METADATA,sha256=mg6cNC5BI8gj8XIg7Wex7-RmCU-SI40NtUnXuQA2-Ts,5374
283
+ griptape_nodes-0.65.5.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.16
2
+ Generator: uv 0.9.18
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any