griptape-nodes 0.40.0__py3-none-any.whl → 0.42.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 (49) hide show
  1. griptape_nodes/app/__init__.py +1 -5
  2. griptape_nodes/app/app.py +12 -9
  3. griptape_nodes/app/app_sessions.py +132 -36
  4. griptape_nodes/app/watch.py +3 -1
  5. griptape_nodes/drivers/storage/local_storage_driver.py +3 -2
  6. griptape_nodes/exe_types/flow.py +68 -368
  7. griptape_nodes/machines/control_flow.py +16 -13
  8. griptape_nodes/machines/node_resolution.py +16 -14
  9. griptape_nodes/node_library/workflow_registry.py +2 -2
  10. griptape_nodes/retained_mode/events/agent_events.py +70 -8
  11. griptape_nodes/retained_mode/events/app_events.py +132 -11
  12. griptape_nodes/retained_mode/events/arbitrary_python_events.py +23 -0
  13. griptape_nodes/retained_mode/events/base_events.py +7 -25
  14. griptape_nodes/retained_mode/events/config_events.py +87 -11
  15. griptape_nodes/retained_mode/events/connection_events.py +56 -5
  16. griptape_nodes/retained_mode/events/context_events.py +27 -4
  17. griptape_nodes/retained_mode/events/execution_events.py +99 -14
  18. griptape_nodes/retained_mode/events/flow_events.py +165 -7
  19. griptape_nodes/retained_mode/events/library_events.py +193 -15
  20. griptape_nodes/retained_mode/events/logger_events.py +11 -0
  21. griptape_nodes/retained_mode/events/node_events.py +243 -22
  22. griptape_nodes/retained_mode/events/object_events.py +40 -4
  23. griptape_nodes/retained_mode/events/os_events.py +13 -2
  24. griptape_nodes/retained_mode/events/parameter_events.py +212 -8
  25. griptape_nodes/retained_mode/events/secrets_events.py +59 -7
  26. griptape_nodes/retained_mode/events/static_file_events.py +57 -4
  27. griptape_nodes/retained_mode/events/validation_events.py +39 -4
  28. griptape_nodes/retained_mode/events/workflow_events.py +188 -17
  29. griptape_nodes/retained_mode/griptape_nodes.py +46 -323
  30. griptape_nodes/retained_mode/managers/agent_manager.py +1 -1
  31. griptape_nodes/retained_mode/managers/engine_identity_manager.py +146 -0
  32. griptape_nodes/retained_mode/managers/event_manager.py +14 -2
  33. griptape_nodes/retained_mode/managers/flow_manager.py +749 -64
  34. griptape_nodes/retained_mode/managers/library_manager.py +112 -2
  35. griptape_nodes/retained_mode/managers/node_manager.py +35 -32
  36. griptape_nodes/retained_mode/managers/object_manager.py +11 -3
  37. griptape_nodes/retained_mode/managers/os_manager.py +70 -1
  38. griptape_nodes/retained_mode/managers/secrets_manager.py +4 -0
  39. griptape_nodes/retained_mode/managers/session_manager.py +328 -0
  40. griptape_nodes/retained_mode/managers/settings.py +7 -0
  41. griptape_nodes/retained_mode/managers/workflow_manager.py +523 -454
  42. griptape_nodes/retained_mode/retained_mode.py +44 -0
  43. griptape_nodes/retained_mode/utils/engine_identity.py +141 -27
  44. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/METADATA +2 -2
  45. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/RECORD +48 -47
  46. griptape_nodes/retained_mode/utils/session_persistence.py +0 -105
  47. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/WHEEL +0 -0
  48. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/entry_points.txt +0 -0
  49. {griptape_nodes-0.40.0.dist-info → griptape_nodes-0.42.0.dist-info}/licenses/LICENSE +0 -0
@@ -32,8 +32,10 @@ from griptape_nodes.retained_mode.events.execution_events import (
32
32
  from griptape_nodes.retained_mode.events.flow_events import (
33
33
  CreateFlowRequest,
34
34
  DeleteFlowRequest,
35
+ GetFlowMetadataRequest,
35
36
  ListFlowsInFlowRequest,
36
37
  ListNodesInFlowRequest,
38
+ SetFlowMetadataRequest,
37
39
  )
38
40
  from griptape_nodes.retained_mode.events.library_events import (
39
41
  GetNodeMetadataFromLibraryRequest,
@@ -1247,6 +1249,48 @@ class RetainedMode:
1247
1249
  request = GetFlowStateRequest(flow_name=flow_name)
1248
1250
  return GriptapeNodes().handle_request(request)
1249
1251
 
1252
+ @classmethod
1253
+ def get_metadata_for_flow(cls, flow_name: str) -> ResultPayload:
1254
+ """Retrieves metadata associated with a flow.
1255
+
1256
+ Flow metadata can include UI position, display name, tags, and other custom properties.
1257
+
1258
+ Args:
1259
+ flow_name (str): Name of the flow to get metadata for.
1260
+
1261
+ Returns:
1262
+ ResultPayload: Contains the flow's metadata.
1263
+
1264
+ Example:
1265
+ # Get flow metadata
1266
+ result = cmd.get_metadata_for_flow("my_flow")
1267
+ """
1268
+ request = GetFlowMetadataRequest(flow_name=flow_name)
1269
+ result = GriptapeNodes().handle_request(request)
1270
+ return result
1271
+
1272
+ @classmethod
1273
+ def set_metadata_for_flow(cls, flow_name: str, metadata: dict[Any, Any]) -> ResultPayload:
1274
+ """Sets metadata for a flow.
1275
+
1276
+ Args:
1277
+ flow_name (str): Name of the flow to set metadata for.
1278
+ metadata (dict): Dictionary containing the metadata to set.
1279
+
1280
+ Returns:
1281
+ ResultPayload: Contains the result of the metadata update operation.
1282
+
1283
+ Example:
1284
+ # Set flow position
1285
+ metadata = {
1286
+ "position": {"x": 100, "y": 200}
1287
+ }
1288
+ result = cmd.set_metadata_for_flow("my_flow", metadata)
1289
+ """
1290
+ request = SetFlowMetadataRequest(flow_name=flow_name, metadata=metadata)
1291
+ result = GriptapeNodes().handle_request(request)
1292
+ return result
1293
+
1250
1294
  # ARBITRARY PYTHON EXECUTION
1251
1295
  @classmethod
1252
1296
  def run_arbitrary_python(cls, python_str: str) -> ResultPayload:
@@ -1,6 +1,7 @@
1
- """Manages engine identity for a single engine per machine.
1
+ """Manages engine identity for multiple engines per machine.
2
2
 
3
3
  Handles engine ID, name storage, and generation for unique engine identification.
4
+ Supports multiple engines with selection via GTN_ENGINE_ID environment variable.
4
5
  """
5
6
 
6
7
  import json
@@ -15,9 +16,9 @@ from .name_generator import generate_engine_name
15
16
 
16
17
 
17
18
  class EngineIdentity:
18
- """Manages engine identity for a single engine per machine."""
19
+ """Manages engine identity for multiple engines per machine."""
19
20
 
20
- _ENGINE_DATA_FILE = "engine.json"
21
+ _ENGINE_DATA_FILE = "engines.json"
21
22
 
22
23
  @classmethod
23
24
  def _get_engine_data_dir(cls) -> Path:
@@ -30,11 +31,11 @@ class EngineIdentity:
30
31
  return cls._get_engine_data_dir() / cls._ENGINE_DATA_FILE
31
32
 
32
33
  @classmethod
33
- def _load_engine_data(cls) -> dict:
34
- """Load engine data from storage.
34
+ def _load_engines_data(cls) -> dict:
35
+ """Load engines data from storage.
35
36
 
36
37
  Returns:
37
- dict: Engine data including id, name, timestamps
38
+ dict: Engines data structure with engines array and default_engine_id
38
39
  """
39
40
  engine_data_file = cls._get_engine_data_file()
40
41
 
@@ -42,48 +43,124 @@ class EngineIdentity:
42
43
  try:
43
44
  with engine_data_file.open("r") as f:
44
45
  data = json.load(f)
45
- if isinstance(data, dict):
46
+ if isinstance(data, dict) and "engines" in data:
46
47
  return data
47
48
  except (json.JSONDecodeError, OSError):
48
- # If file is corrupted, return empty dict
49
49
  pass
50
50
 
51
- return {}
51
+ return {"engines": [], "default_engine_id": None}
52
52
 
53
53
  @classmethod
54
- def _save_engine_data(cls, engine_data: dict) -> None:
55
- """Save engine data to storage.
54
+ def _save_engines_data(cls, engines_data: dict) -> None:
55
+ """Save engines data to storage.
56
56
 
57
57
  Args:
58
- engine_data: Engine data to save
58
+ engines_data: Engines data structure to save
59
59
  """
60
60
  engine_data_dir = cls._get_engine_data_dir()
61
61
  engine_data_dir.mkdir(parents=True, exist_ok=True)
62
62
 
63
63
  engine_data_file = cls._get_engine_data_file()
64
64
  with engine_data_file.open("w") as f:
65
- json.dump(engine_data, f, indent=2)
65
+ json.dump(engines_data, f, indent=2)
66
+
67
+ @classmethod
68
+ def _get_selected_engine_id(cls) -> str | None:
69
+ """Get the selected engine ID from environment variable or default.
70
+
71
+ Returns:
72
+ str | None: The selected engine ID or None if not specified
73
+ """
74
+ return os.getenv("GTN_ENGINE_ID")
75
+
76
+ @classmethod
77
+ def _find_engine_by_id(cls, engines_data: dict, engine_id: str) -> dict | None:
78
+ """Find an engine by ID in the engines data.
79
+
80
+ Args:
81
+ engines_data: The engines data structure
82
+ engine_id: The engine ID to find
83
+
84
+ Returns:
85
+ dict | None: The engine data if found, None otherwise
86
+ """
87
+ for engine in engines_data.get("engines", []):
88
+ if engine.get("id") == engine_id:
89
+ return engine
90
+ return None
66
91
 
67
92
  @classmethod
68
93
  def get_engine_data(cls) -> dict:
69
- """Get the engine data, creating default if it doesn't exist.
94
+ """Get the current engine data, creating default if it doesn't exist.
70
95
 
71
96
  Returns:
72
- dict: The engine data
97
+ dict: The current engine data
73
98
  """
74
- engine_data = cls._load_engine_data()
99
+ engines_data = cls._load_engines_data()
100
+
101
+ # Determine which engine to use
102
+ selected_engine_id = cls._get_selected_engine_id()
75
103
 
76
- if not engine_data or "id" not in engine_data:
77
- # Create default engine data
104
+ if selected_engine_id:
105
+ # Use specified engine ID
106
+ engine_data = cls._find_engine_by_id(engines_data, selected_engine_id)
107
+ if engine_data:
108
+ return engine_data
109
+ # If specified engine not found, create it
110
+ engine_data = {
111
+ "id": selected_engine_id,
112
+ "name": generate_engine_name(),
113
+ "created_at": datetime.now(tz=UTC).isoformat(),
114
+ }
115
+ else:
116
+ # Use default engine (first one) or create new one
117
+ if engines_data.get("engines"):
118
+ default_id = engines_data.get("default_engine_id")
119
+ if default_id:
120
+ engine_data = cls._find_engine_by_id(engines_data, default_id)
121
+ if engine_data:
122
+ return engine_data
123
+ # Fall back to first engine
124
+ return engines_data["engines"][0]
125
+
126
+ # Create new engine
78
127
  engine_data = {
79
- "id": os.getenv("GTN_ENGINE_ID") or str(uuid.uuid4()),
128
+ "id": str(uuid.uuid4()),
80
129
  "name": generate_engine_name(),
81
130
  "created_at": datetime.now(tz=UTC).isoformat(),
82
131
  }
83
- cls._save_engine_data(engine_data)
84
132
 
133
+ # Add or update engine in the data structure
134
+ cls._add_or_update_engine(engine_data)
85
135
  return engine_data
86
136
 
137
+ @classmethod
138
+ def _add_or_update_engine(cls, engine_data: dict) -> None:
139
+ """Add or update an engine in the engines data structure.
140
+
141
+ Args:
142
+ engine_data: The engine data to add or update
143
+ """
144
+ engines_data = cls._load_engines_data()
145
+
146
+ # Find existing engine
147
+ engine_id = engine_data["id"]
148
+ existing_engine = cls._find_engine_by_id(engines_data, engine_id)
149
+
150
+ if existing_engine:
151
+ # Update existing engine
152
+ existing_engine.update(engine_data)
153
+ existing_engine["updated_at"] = datetime.now(tz=UTC).isoformat()
154
+ else:
155
+ # Add new engine
156
+ engines_data.setdefault("engines", []).append(engine_data)
157
+
158
+ # Set as default if it's the first engine
159
+ if not engines_data.get("default_engine_id") and len(engines_data["engines"]) == 1:
160
+ engines_data["default_engine_id"] = engine_id
161
+
162
+ cls._save_engines_data(engines_data)
163
+
87
164
  @classmethod
88
165
  def get_engine_id(cls) -> str:
89
166
  """Get the engine ID.
@@ -106,20 +183,57 @@ class EngineIdentity:
106
183
 
107
184
  @classmethod
108
185
  def set_engine_name(cls, engine_name: str) -> None:
109
- """Set and persist the engine name.
186
+ """Set and persist the current engine name.
110
187
 
111
188
  Args:
112
189
  engine_name: The new engine name to set
113
190
  """
114
- engine_data = cls._load_engine_data()
115
-
116
- # Ensure we have basic engine data
117
- if not engine_data or "id" not in engine_data:
118
- engine_data = cls.get_engine_data()
191
+ # Get current engine data
192
+ engine_data = cls.get_engine_data()
119
193
 
194
+ # Update the name
120
195
  engine_data["name"] = engine_name
121
196
  engine_data["updated_at"] = datetime.now(tz=UTC).isoformat()
122
- cls._save_engine_data(engine_data)
197
+
198
+ # Save updated engine data
199
+ cls._add_or_update_engine(engine_data)
200
+
201
+ @classmethod
202
+ def get_all_engines(cls) -> list[dict]:
203
+ """Get all registered engines.
204
+
205
+ Returns:
206
+ list[dict]: List of all engine data
207
+ """
208
+ engines_data = cls._load_engines_data()
209
+ return engines_data.get("engines", [])
210
+
211
+ @classmethod
212
+ def get_default_engine_id(cls) -> str | None:
213
+ """Get the default engine ID.
214
+
215
+ Returns:
216
+ str | None: The default engine ID or None if not set
217
+ """
218
+ engines_data = cls._load_engines_data()
219
+ return engines_data.get("default_engine_id")
220
+
221
+ @classmethod
222
+ def set_default_engine_id(cls, engine_id: str) -> None:
223
+ """Set the default engine ID.
224
+
225
+ Args:
226
+ engine_id: The engine ID to set as default
227
+ """
228
+ engines_data = cls._load_engines_data()
229
+
230
+ # Verify the engine exists
231
+ if cls._find_engine_by_id(engines_data, engine_id):
232
+ engines_data["default_engine_id"] = engine_id
233
+ cls._save_engines_data(engines_data)
234
+ else:
235
+ msg = f"Engine with ID {engine_id} not found"
236
+ raise ValueError(msg)
123
237
 
124
238
  @classmethod
125
239
  def get_engine_data_file_path(cls) -> Path:
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: griptape-nodes
3
- Version: 0.40.0
3
+ Version: 0.42.0
4
4
  Summary: Add your description here
5
5
  License-File: LICENSE
6
- Requires-Python: ~=3.12
6
+ Requires-Python: <3.13,>=3.12.0
7
7
  Requires-Dist: fastapi>=0.115.12
8
8
  Requires-Dist: griptape[drivers-prompt-amazon-bedrock,drivers-prompt-anthropic,drivers-prompt-cohere,drivers-prompt-ollama,drivers-web-scraper-trafilatura,drivers-web-search-duckduckgo,drivers-web-search-exa,loaders-image]>=1.7.1
9
9
  Requires-Dist: httpx<1.0.0,>=0.28.0
@@ -1,10 +1,10 @@
1
1
  griptape_nodes/__init__.py,sha256=49jcr4gyvTjpdZDKCek0UqtAMeMdJr-OL_Hx7Ira8CE,37026
2
2
  griptape_nodes/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  griptape_nodes/app/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
4
- griptape_nodes/app/__init__.py,sha256=x6FNnJwW9e1cUmsq64UhXWXnHOP-ivv2KT3kST1EmPM,435
5
- griptape_nodes/app/app.py,sha256=VmGUedjaLcFNu46nvXh2OJqlmLkcU7aYZJh72zW7em8,18876
6
- griptape_nodes/app/app_sessions.py,sha256=yu9v853CchkcudevPYV_Gqi6P1FBTj-GgszUNc6ZMOA,17701
7
- griptape_nodes/app/watch.py,sha256=Jh7sQoptOuVzEobyhHG5EThxOcb8wfkW0JOmYE-WDpE,1848
4
+ griptape_nodes/app/__init__.py,sha256=2wdMRsCWieR9md72tBX2UqJowD-WBLLN3VWPzpTIJqw,229
5
+ griptape_nodes/app/app.py,sha256=5RG03clRZWwZeFpeKc3hwxO8TTCbBHblWvZZnG9LPU4,18942
6
+ griptape_nodes/app/app_sessions.py,sha256=sgVIOEmxcQt0oErvfMciOaVWStPh-qNtPZXtXpw1Q-o,21852
7
+ griptape_nodes/app/watch.py,sha256=SkK9ajCEGswjXpujyIlW90YDgTpNDFyDM_jjAhS0t0Y,1988
8
8
  griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
9
9
  griptape_nodes/bootstrap/bootstrap_script.py,sha256=QLLu3wu1VGmoUU8SKGeyLGDOijKBLGAJYv1RlI9sub0,1312
10
10
  griptape_nodes/bootstrap/post_build_install_script.sh,sha256=t2ItVve_2Vk7jMFsfAfVHCAc5sFSDSQkmjglr1USZ7s,48
@@ -23,68 +23,69 @@ griptape_nodes/drivers/__init__.py,sha256=tHmiFQn6uJyFVhC2PrqHgRUH3d3yDsqMQpWqRa
23
23
  griptape_nodes/drivers/storage/__init__.py,sha256=_7p8vJt3YnnF6sD3Uxxw38c-gazuMIHSS-m3G6sa2Qk,208
24
24
  griptape_nodes/drivers/storage/base_storage_driver.py,sha256=di1tqC-o8tEeZ8h_asUxb5KgixwJbTlQLe_lUtqcunQ,1050
25
25
  griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py,sha256=zYQHzHxlE3TcOitytk9WpD3YTKTRyfrzW-H_vXpgTLQ,6083
26
- griptape_nodes/drivers/storage/local_storage_driver.py,sha256=PnKgnjkhmnzI5SOI3VKXTkwbb5G1lLs25pLTr022W_c,2196
26
+ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=fXtT6NEPeTZgS-mNsy66zd9Cdw17WddjAp4aQdR_oug,2257
27
27
  griptape_nodes/drivers/storage/storage_backend.py,sha256=3QBIwrgPc1krBIiPYLoK2swhIPDiKJnnucOEdyx7y3c,184
28
28
  griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
29
29
  griptape_nodes/exe_types/connections.py,sha256=_-VNzf6Kay62QzJlSX-LlHTUhz-CKF-UDsbZLJ0l6Wk,12435
30
30
  griptape_nodes/exe_types/core_types.py,sha256=gkWSehpB28kFwgKl8KNrW4MaxB2rcEEPTuOThCOg6ms,58259
31
- griptape_nodes/exe_types/flow.py,sha256=FAjs6vWEWbuoU5OvUGjs8BY_kEB7IWKvlJ-X5HXkoZ4,21095
31
+ griptape_nodes/exe_types/flow.py,sha256=pCeTrx8yrUgLw1U9yQxC7arzJjyP2vag-pG0QTKut-M,5716
32
32
  griptape_nodes/exe_types/node_types.py,sha256=MwrZCFPsKU3VV1GoG6jeuGyyLjkCQ_7EZHfiuKcm0hU,45514
33
33
  griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
34
34
  griptape_nodes/machines/__init__.py,sha256=v0jkwr-CFOLmfEYUQvX8BKQLOdvhSsA6toXkdHcPGUE,30
35
- griptape_nodes/machines/control_flow.py,sha256=LegXG4If6M5N6ZNlrQywLGQe-sjg_VKDeKPu5gmqbxU,8421
35
+ griptape_nodes/machines/control_flow.py,sha256=qOyf00hEas310kToQBKGOXrhmwcY5agWu8ct4i-0nnA,8643
36
36
  griptape_nodes/machines/fsm.py,sha256=JwNz32UmcajoADDMm_fL5MqDRNjr6t8CIUzck-7TFhE,1784
37
- griptape_nodes/machines/node_resolution.py,sha256=Ou29TWTDWr0m54oYYszBIcVILauK7hET4tTWGDJojM4,19929
37
+ griptape_nodes/machines/node_resolution.py,sha256=HfmREZKhJLCo2vR_6LsOpff5KTiRQ71O5iNrUY31eT4,20049
38
38
  griptape_nodes/node_library/__init__.py,sha256=U3FcSdmq6UW7qt6E3Up3NWKvUEn5_5lqL-u5qbzfxMQ,28
39
39
  griptape_nodes/node_library/advanced_node_library.py,sha256=B1ZaxuFIzQ6tx_3MLIxlsHuahthEC1Hw_t6K_ByIdzs,2104
40
40
  griptape_nodes/node_library/library_registry.py,sha256=fE1NF-9SeRPK_pWPQgfeDBsMzvxiAlShPBvi71DCG9Q,12099
41
- griptape_nodes/node_library/workflow_registry.py,sha256=WF4jsXOa8AvWykkLPgnwYo-n2PYT5c3fJgjxYCaHOps,4257
41
+ griptape_nodes/node_library/workflow_registry.py,sha256=EMqQgx7DaR3mEgBWQEgMHhgxYalaotda8Uo9wD8d9i4,4247
42
42
  griptape_nodes/retained_mode/__init__.py,sha256=X12DKL6KhLsiRTPIlrPj2h76_sJ0q0eH4r0kMQkodm0,29
43
- griptape_nodes/retained_mode/griptape_nodes.py,sha256=F4EdAFSBm3tZsiKl9k2d5HB0hiv06A1EZit55bmqJWU,37167
44
- griptape_nodes/retained_mode/retained_mode.py,sha256=HUKoiTtDYm61a1wipeLKk_1oRfkMeIjiWrzGQ6x61d0,54779
43
+ griptape_nodes/retained_mode/griptape_nodes.py,sha256=dOI8A_Dd2O9ndDUOXoHhhe9xjckbUDct9qsLURNMmQk,24040
44
+ griptape_nodes/retained_mode/retained_mode.py,sha256=2cjSD1F_ABpuL8km_nGpAn2h5TijeV77qr1ePH_BWZg,56272
45
45
  griptape_nodes/retained_mode/events/__init__.py,sha256=7B1C-c0jVvnShtHJ2lfX6BZPE0U1DgQwg1e4DorhKG0,22
46
- griptape_nodes/retained_mode/events/agent_events.py,sha256=Ftwv_6jobQZ3ZEOAIFwTCdbYke0vN0fN0ZTRWqppM3M,2235
47
- griptape_nodes/retained_mode/events/app_events.py,sha256=bke-50TIKkOPA-BXxP_BGqJBzbqAgKUlYFi-Zc6hMv8,3921
48
- griptape_nodes/retained_mode/events/arbitrary_python_events.py,sha256=9IJKVyzo9jqef2Dt3thoqnq4FWKTX5yG5SnOvXHvLns,797
49
- griptape_nodes/retained_mode/events/base_events.py,sha256=XtLnEvXK46Uph5oT3Y8KJN8KGFOrN0ntNE--ixf9Krs,20661
50
- griptape_nodes/retained_mode/events/config_events.py,sha256=cgx5Qe0wSHxpehHj7CDb4bF6UfUERD5oAMA0Eb3BSgk,2454
51
- griptape_nodes/retained_mode/events/connection_events.py,sha256=XbuzSchjNmM8SMD-QrnhEQxwyt5pQPmB6j46GGjFNRI,2261
52
- griptape_nodes/retained_mode/events/context_events.py,sha256=je81-kK-ORLUunvAM8r-2xtN4fIHlt0d2qoUZ3a-u0M,1042
53
- griptape_nodes/retained_mode/events/execution_events.py,sha256=ZYj87Us-iMaornesQRHbAeABftqNPfCdRevg1860ixM,5701
54
- griptape_nodes/retained_mode/events/flow_events.py,sha256=1BtdgefElLDRlVjELm1Dlcmn770z7Y0zA0Ml9hWcUN8,7967
46
+ griptape_nodes/retained_mode/events/agent_events.py,sha256=xyCtR-Hf1vv6Ft-z0At0ytIMYBRckYympxdByVZXrCE,4880
47
+ griptape_nodes/retained_mode/events/app_events.py,sha256=aKrXFOgNZZmQ_6fgdCIjzW5l5LUfNFlFhtS492hnqQM,8477
48
+ griptape_nodes/retained_mode/events/arbitrary_python_events.py,sha256=uhep1c1xjUc-YQO5nIStAE48PS6rFZLTDQIr_Qb3we8,1460
49
+ griptape_nodes/retained_mode/events/base_events.py,sha256=pSiePAzG7ddzHCtmX4C-56vByEUA4GgIDqkIa4yllFo,19756
50
+ griptape_nodes/retained_mode/events/config_events.py,sha256=9WhFx6mD7QF_h1ldFAPRE_iLtrQBAFEvA6_MzhGOomk,6129
51
+ griptape_nodes/retained_mode/events/connection_events.py,sha256=QjHAp0SeCbRSG-dF_nU_CPaOcSKItq2DWJ_FHWgF1b4,4744
52
+ griptape_nodes/retained_mode/events/context_events.py,sha256=-FIwjI0hJodDhfM4BF-3GTRycu80v1TlSSOX34oA9nA,2122
53
+ griptape_nodes/retained_mode/events/execution_events.py,sha256=z1RakAGJQrNUmU6SU6evXSldPdlSlw0gBm7_S15JaEo,9946
54
+ griptape_nodes/retained_mode/events/flow_events.py,sha256=BKEftgN6pIMCFpLF9yIwkcloIWVY6FSIwUX5a4fc5KU,14019
55
55
  griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=PQ0QRZAUBljSIGjB8QhYUeRmSrfmLsJ6XVcygJKi13I,1102
56
- griptape_nodes/retained_mode/events/library_events.py,sha256=hvLFc21wme55TfEUCPVTEI7-CkSotGmESDQGcuhs8es,10061
57
- griptape_nodes/retained_mode/events/logger_events.py,sha256=e5Xu9cVk4_V24dI-leqWbzWSf_c2wRHJpsEfJT9_p8M,325
58
- griptape_nodes/retained_mode/events/node_events.py,sha256=-rpsN0889umeQA8BRkV6cqhiyooK9j0Pz2dDlYFx9_A,14962
59
- griptape_nodes/retained_mode/events/object_events.py,sha256=ZNuRFw2zhrfAIWKwu_aumn-1-kedvvEoVUq82P6RyAs,1283
60
- griptape_nodes/retained_mode/events/os_events.py,sha256=QWhTJs9SzGGIuvFB2-3w8Bfhk5KcCZOuFfn1eeJvWdk,659
61
- griptape_nodes/retained_mode/events/parameter_events.py,sha256=2Ex4_9-GE-dzasP1DHutslzLMuF-tu4egHLHSsTEdp4,9495
56
+ griptape_nodes/retained_mode/events/library_events.py,sha256=xE-yOAmjIWcyNhR_3qNK9ucnbW-f_hyFoXPGgXnmlQQ,17628
57
+ griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
58
+ griptape_nodes/retained_mode/events/node_events.py,sha256=V9Kf0G2l2UQxu3kpnlWupC7vMYShkGpYrLe62v4e9AU,24526
59
+ griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
60
+ griptape_nodes/retained_mode/events/os_events.py,sha256=GrEfWKEM8s9t950KeAQKX9amAQI_fXst9vc9V66vBPA,1243
61
+ griptape_nodes/retained_mode/events/parameter_events.py,sha256=n5PCL_T5zxktX3hSyqpDseztJrT6_RjS9lu6AmNBDq0,18411
62
62
  griptape_nodes/retained_mode/events/payload_registry.py,sha256=q-wxUqp63vhNj-Pl1JGJHnBkhUefcCArPoMN3KBREEI,1691
63
- griptape_nodes/retained_mode/events/secrets_events.py,sha256=gK6RkIHEIyQJRtYI-REf3FmSXCRw5VrP5YJH8D8rmWY,1788
64
- griptape_nodes/retained_mode/events/static_file_events.py,sha256=ZKsLQUHL5tFVETd4it6pwdiLhbMjsGkRJQrUxmFGaDQ,2091
65
- griptape_nodes/retained_mode/events/validation_events.py,sha256=a3DwE1xmrmAZ9Y2HCAMHecyRl1Q5Ozy0cEOKgzeAQNE,1434
66
- griptape_nodes/retained_mode/events/workflow_events.py,sha256=GKn_tbC2VDqgwqrObCSwbMiFS23gc0iSGQxqFgTiDw0,4139
63
+ griptape_nodes/retained_mode/events/secrets_events.py,sha256=UniLR-fH7OO-caSGCPDCZYf8Z0drBKqoRcjvNY7Y3Hs,4021
64
+ griptape_nodes/retained_mode/events/static_file_events.py,sha256=c8kKkrxAPZxrE9fsldpWtweK1C4T-1-dHWw_76SRehM,3764
65
+ griptape_nodes/retained_mode/events/validation_events.py,sha256=H2yWoHp2t7QwGV_fDQXRy7JojYnK4k6SOAlEvRYST_Q,3062
66
+ griptape_nodes/retained_mode/events/workflow_events.py,sha256=6V8zsWnf8MbBZ2Oi36zaM_a7dZO5oOlq_iIxPL-g8Jk,11138
67
67
  griptape_nodes/retained_mode/managers/__init__.py,sha256=OTXysKusqYCQeAYwnVj4PbE3MxvAUTq9xOZT6vUE3JA,24
68
- griptape_nodes/retained_mode/managers/agent_manager.py,sha256=5jlFl_wPa9NiUTgnIJhT3ZZVXEGE4MsR0pn-IhADkS4,10235
68
+ griptape_nodes/retained_mode/managers/agent_manager.py,sha256=lSOyY2j2DE8qJh3OYCdqWnLKlXzywr5ItzzU7dfKwRM,10238
69
69
  griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=QnqI2_IkDpc9SHzbb-jwsyYkm91W0V9kLlxARUbbVUI,1777
70
70
  griptape_nodes/retained_mode/managers/config_manager.py,sha256=0fs-xd6vpetBGYrsm6sqPBhWb0qChMdtUcxco92qTqQ,25344
71
71
  griptape_nodes/retained_mode/managers/context_manager.py,sha256=DiGNh09TZ7rsLEcXqqB9Yrh2ietBy59LPF7GM0OBQS8,22930
72
- griptape_nodes/retained_mode/managers/event_manager.py,sha256=5Y8oKasS2bISu5qdDhX9YRy2LD7lyIsfd2FxpXOnZ6c,6726
73
- griptape_nodes/retained_mode/managers/flow_manager.py,sha256=WvFVcSSyEfUJvvcdMKLrrmMrbsVA2FFMxZiD5uxqUS0,71597
74
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=JQDPImFBXqQ-zFH-DpBurr_0nnO4oLR6-rHSTBVsLOA,87745
75
- griptape_nodes/retained_mode/managers/node_manager.py,sha256=4vUMhjuIZnd2s1isBhDnwLNdgfwkC50sRo9ERiXTWjU,127179
76
- griptape_nodes/retained_mode/managers/object_manager.py,sha256=mgNK8o-iYFzNl2IBzUKIqECiiqk5dI3cNNqirLam7vc,11828
72
+ griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=GBBz7HJBJVNyXLGRdAvqDgihMRB_YjWqdEwLMCnadUg,4409
73
+ griptape_nodes/retained_mode/managers/event_manager.py,sha256=rGoeGO0ATZd9w8Gm1RDHoODDYyJ-XqxiGJidYijH_QY,7201
74
+ griptape_nodes/retained_mode/managers/flow_manager.py,sha256=JDLedAGIfP_RZ5Qlj7C-0mYXlHvw8N4_Nt9I0bCetx0,106297
75
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=WnNqabpTvANic7ww0E_78zj8zsBMJxcW3eXMJ4Ma730,93627
76
+ griptape_nodes/retained_mode/managers/node_manager.py,sha256=ygWeAHQeZcP_PCrDgA5tK4yeUrnAtoXb_l2MHLSaXH0,127460
77
+ griptape_nodes/retained_mode/managers/object_manager.py,sha256=HAMyW2OnrbdYmOzRSqmvbpyKg6eO3wUEk6-2CP9EQcw,12243
77
78
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=6nHx1fADdj7nyt5dIrNNuSkR362XgR1AMVESI1UCF6o,19746
78
- griptape_nodes/retained_mode/managers/os_manager.py,sha256=jeWvm0X_ma40ZBJFqgU_RgNR2nSfDxCxGUEQxZyujmQ,5104
79
- griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=oRdTN__mgM5tQTxVKZ8e0R8BcKfL6_zMA-AKuFV9QE8,6038
80
- griptape_nodes/retained_mode/managers/settings.py,sha256=nzEziQ1_Ba_PtQYtOgF_Uq7w0eF6eZ93Sqbl36mqlhk,4094
79
+ griptape_nodes/retained_mode/managers/os_manager.py,sha256=-Uz74v5Ysw8JSqxGooG30bUP2kO4e-LNxpa8SqxUXdg,7463
80
+ griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=uGlj5MAL5kfShwE0yRn5ywuIcNGUP9qOq9SLt3vkTjI,6219
81
+ griptape_nodes/retained_mode/managers/session_manager.py,sha256=fLjtBvgGY3daq1vbpJPXq069n35Z-Zr5dF3B0XyD2JY,11817
82
+ griptape_nodes/retained_mode/managers/settings.py,sha256=oS-TDmz8IWIBK-OsjIbThNfinAOzaoJbDUSGlTOT_nw,4439
81
83
  griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=RbQHGeJgRa7tCGJwif0hGVMbEVkHgaUt4FB44McRxWA,7129
82
84
  griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=1lwwuof4C6Ho1xh59Re_ajmvcc2lUyxpO1-RkHfKBYc,4385
83
- griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=qvjRvvNFTrqQmiC6B4ifudzSbepua4serKi8W1In4G8,128750
85
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=jj7cM1s1E7PkY1uER2P3WozS1ZuIZDZFfPXRO_dT9Hk,131627
84
86
  griptape_nodes/retained_mode/utils/__init__.py,sha256=W5dvv8YwvVVq_8eVTgMd3Z_VB_Dtq1sIIVq8745QH_I,52
85
- griptape_nodes/retained_mode/utils/engine_identity.py,sha256=T28qJtpaS2JUmMxU7NRNws_zQxm5CIIgdujfAmodIMU,3817
87
+ griptape_nodes/retained_mode/utils/engine_identity.py,sha256=PZmdlYM69-B-6Z1F4iJfZyVm2twJY5cSGoiUJCMj0xU,7846
86
88
  griptape_nodes/retained_mode/utils/name_generator.py,sha256=IZLahtfP3XC79XApLdGoZ0IKKUkgiITpd16RK7NbyEs,2524
87
- griptape_nodes/retained_mode/utils/session_persistence.py,sha256=zhCeE7_5zHXBtNoVjEjwWSdLQbFQn_mI3Ybq5TkWjPA,3339
88
89
  griptape_nodes/traits/__init__.py,sha256=bTLXTiZTJz2z15RRLoPI4nvLnNW9FiLcKL_2pT4E10g,32
89
90
  griptape_nodes/traits/add_param_button.py,sha256=Xtc39SfvYY6JDjhxu2wmdeaHW2X4LkpNAQufSTCP3hY,655
90
91
  griptape_nodes/traits/button.py,sha256=rpQQ77ASKH3YJabc5WWw9DpEHQiMg1jx0i0sdkwH-SA,611
@@ -105,8 +106,8 @@ griptape_nodes/version_compatibility/__init__.py,sha256=JMz1sB7Zsj6pS1S5sdsPR0kn
105
106
  griptape_nodes/version_compatibility/versions/__init__.py,sha256=PWSxM28LPUdBdRPA98j4RUWvuZ4NqfX1day2VU6SqPw,74
106
107
  griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py,sha256=21iKlFpsmBW4WsAexSD0WMAJnsYmMq2sIbDeYC831fc,62
107
108
  griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py,sha256=KJeyhyn_iUaDx32FRi1-__yxw6rp9tG4eTBCimpurBM,5306
108
- griptape_nodes-0.40.0.dist-info/METADATA,sha256=khIpbSQkHxssHJ4PMubVl1E6PIybiJIXe_GcTFUdHlo,4102
109
- griptape_nodes-0.40.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
110
- griptape_nodes-0.40.0.dist-info/entry_points.txt,sha256=Q8V3Ydy7PNfJgTjNEVkPui25AwZ4HJ3kZCU3oh4mq-c,81
111
- griptape_nodes-0.40.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
112
- griptape_nodes-0.40.0.dist-info/RECORD,,
109
+ griptape_nodes-0.42.0.dist-info/METADATA,sha256=ApwIVvUYJC8oYo43PxlzKXcY8CKdQxVQoAJjNob8wP8,4110
110
+ griptape_nodes-0.42.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
111
+ griptape_nodes-0.42.0.dist-info/entry_points.txt,sha256=Q8V3Ydy7PNfJgTjNEVkPui25AwZ4HJ3kZCU3oh4mq-c,81
112
+ griptape_nodes-0.42.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
113
+ griptape_nodes-0.42.0.dist-info/RECORD,,
@@ -1,105 +0,0 @@
1
- """Manages session persistence using XDG state directory.
2
-
3
- Handles storing and retrieving active session information across engine restarts.
4
- """
5
-
6
- import json
7
- from datetime import UTC, datetime
8
- from pathlib import Path
9
-
10
- from xdg_base_dirs import xdg_state_home
11
-
12
-
13
- class SessionPersistence:
14
- """Manages session persistence for active session tracking."""
15
-
16
- _SESSION_STATE_FILE = "session.json"
17
-
18
- @classmethod
19
- def _get_session_state_dir(cls) -> Path:
20
- """Get the XDG state directory for session persistence."""
21
- return xdg_state_home() / "griptape_nodes"
22
-
23
- @classmethod
24
- def _get_session_state_file(cls) -> Path:
25
- """Get the path to the session state storage file."""
26
- return cls._get_session_state_dir() / cls._SESSION_STATE_FILE
27
-
28
- @classmethod
29
- def _load_session_data(cls) -> dict:
30
- """Load session data from storage.
31
-
32
- Returns:
33
- dict: Session data including id, timestamps
34
- """
35
- session_state_file = cls._get_session_state_file()
36
-
37
- if session_state_file.exists():
38
- try:
39
- with session_state_file.open("r") as f:
40
- data = json.load(f)
41
- if isinstance(data, dict):
42
- return data
43
- except (json.JSONDecodeError, OSError):
44
- # If file is corrupted, return empty dict
45
- pass
46
-
47
- return {}
48
-
49
- @classmethod
50
- def _save_session_data(cls, session_data: dict) -> None:
51
- """Save session data to storage.
52
-
53
- Args:
54
- session_data: Session data to save
55
- """
56
- session_state_dir = cls._get_session_state_dir()
57
- session_state_dir.mkdir(parents=True, exist_ok=True)
58
-
59
- session_state_file = cls._get_session_state_file()
60
- with session_state_file.open("w") as f:
61
- json.dump(session_data, f, indent=2)
62
-
63
- @classmethod
64
- def persist_session(cls, session_id: str) -> None:
65
- """Persist the active session ID to storage.
66
-
67
- Args:
68
- session_id: The session ID to persist
69
- """
70
- session_data = {
71
- "session_id": session_id,
72
- "started_at": datetime.now(tz=UTC).isoformat(),
73
- "last_updated": datetime.now(tz=UTC).isoformat(),
74
- }
75
- cls._save_session_data(session_data)
76
-
77
- @classmethod
78
- def get_persisted_session_id(cls) -> str | None:
79
- """Get the persisted session ID if it exists.
80
-
81
- Returns:
82
- str | None: The persisted session ID or None if no session is persisted
83
- """
84
- session_data = cls._load_session_data()
85
- return session_data.get("session_id")
86
-
87
- @classmethod
88
- def clear_persisted_session(cls) -> None:
89
- """Clear the persisted session data."""
90
- session_state_file = cls._get_session_state_file()
91
- if session_state_file.exists():
92
- try:
93
- session_state_file.unlink()
94
- except OSError:
95
- # If we can't delete the file, just clear its contents
96
- cls._save_session_data({})
97
-
98
- @classmethod
99
- def has_persisted_session(cls) -> bool:
100
- """Check if there is a persisted session.
101
-
102
- Returns:
103
- bool: True if there is a persisted session, False otherwise
104
- """
105
- return cls.get_persisted_session_id() is not None