glaip-sdk 0.0.9__py3-none-any.whl → 0.0.11__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.
glaip_sdk/models.py CHANGED
@@ -179,8 +179,6 @@ class MCP(BaseModel):
179
179
  name: str
180
180
  description: str | None = None
181
181
  config: dict[str, Any] | None = None
182
- framework: str | None = None
183
- version: str | None = None
184
182
  transport: str | None = None # "sse" or "http"
185
183
  authentication: dict[str, Any] | None = None
186
184
  metadata: dict[str, Any] | None = None
@@ -57,13 +57,9 @@ def convert_export_to_import_format(
57
57
  """
58
58
  import_data = data.copy()
59
59
 
60
- # Convert tools from dicts to IDs
61
- if "tools" in import_data and isinstance(import_data["tools"], list):
62
- import_data["tools"] = extract_ids_from_export(import_data["tools"])
63
-
64
- # Convert agents from dicts to IDs
65
- if "agents" in import_data and isinstance(import_data["agents"], list):
66
- import_data["agents"] = extract_ids_from_export(import_data["agents"])
60
+ for key in ["tools", "agents", "mcps"]:
61
+ if key in import_data and isinstance(import_data[key], list):
62
+ import_data[key] = extract_ids_from_export(import_data[key])
67
63
 
68
64
  return import_data
69
65
 
@@ -310,56 +310,115 @@ class RichStreamRenderer:
310
310
 
311
311
  def _ensure_live(self) -> None:
312
312
  """Ensure live display is updated."""
313
- # Lazily create Live if needed
314
- # Rich's Live expects the console to maintain a _live_stack list. When tests
315
- # or callers provide a lightweight console double (e.g. unittest.mock.Mock),
316
- # the attribute might be missing or replaced with another type which breaks
317
- # the background refresh thread. Normal Rich consoles always expose
318
- # _live_stack as a list, so we defensively initialise it if needed.
319
- live_stack = getattr(self.console, "_live_stack", None)
320
- if not isinstance(live_stack, list):
321
- try:
322
- self.console._live_stack = [] # type: ignore[attr-defined]
323
- except Exception:
324
- # If the console forbids attribute assignment we simply skip the
325
- # live update for this cycle and fall back to buffered printing.
326
- logger.debug(
327
- "Console missing _live_stack; skipping live UI initialisation",
328
- exc_info=True,
329
- )
330
- return
331
-
332
- if self.live is None and self.cfg.live:
333
- try:
334
- self.live = Live(
335
- console=self.console,
336
- refresh_per_second=1 / self.cfg.refresh_debounce,
337
- transient=not self.cfg.persist_live,
338
- )
339
- self.live.start()
340
- except Exception:
341
- self.live = None
313
+ if not self._ensure_live_stack():
314
+ return
315
+
316
+ self._start_live_if_needed()
342
317
 
343
318
  if self.live:
344
- panels = [self._render_main_panel()]
345
- steps_renderable = self._render_steps_text()
346
- panels.append(
347
- AIPPanel(
348
- steps_renderable,
349
- title="Steps",
350
- border_style="blue",
351
- )
319
+ self._refresh_live_panels()
320
+
321
+ def _ensure_live_stack(self) -> bool:
322
+ """Guarantee the console exposes the internal live stack Rich expects."""
323
+ live_stack = getattr(self.console, "_live_stack", None)
324
+ if isinstance(live_stack, list):
325
+ return True
326
+
327
+ try:
328
+ self.console._live_stack = [] # type: ignore[attr-defined]
329
+ return True
330
+ except Exception:
331
+ # If the console forbids attribute assignment we simply skip the live
332
+ # update for this cycle and fall back to buffered printing.
333
+ logger.debug(
334
+ "Console missing _live_stack; skipping live UI initialisation",
335
+ exc_info=True,
336
+ )
337
+ return False
338
+
339
+ def _start_live_if_needed(self) -> None:
340
+ """Create and start a Live instance when configuration allows."""
341
+ if self.live is not None or not self.cfg.live:
342
+ return
343
+
344
+ try:
345
+ self.live = Live(
346
+ console=self.console,
347
+ refresh_per_second=1 / self.cfg.refresh_debounce,
348
+ transient=not self.cfg.persist_live,
352
349
  )
353
- panels.extend(self._render_tool_panels())
354
- self.live.update(Group(*panels))
350
+ self.live.start()
351
+ except Exception:
352
+ self.live = None
353
+
354
+ def _refresh_live_panels(self) -> None:
355
+ """Render panels and push them to the active Live display."""
356
+ if not self.live:
357
+ return
358
+
359
+ main_panel = self._render_main_panel()
360
+ steps_renderable = self._render_steps_text()
361
+ steps_panel = AIPPanel(
362
+ steps_renderable,
363
+ title="Steps",
364
+ border_style="blue",
365
+ )
366
+ tool_panels = self._render_tool_panels()
367
+ panels = self._build_live_panels(main_panel, steps_panel, tool_panels)
368
+
369
+ self.live.update(Group(*panels))
370
+
371
+ def _build_live_panels(
372
+ self,
373
+ main_panel: Any,
374
+ steps_panel: Any,
375
+ tool_panels: list[Any],
376
+ ) -> list[Any]:
377
+ """Assemble the panel order for the live display."""
378
+ if self.verbose:
379
+ return [main_panel, steps_panel, *tool_panels]
380
+
381
+ panels: list[Any] = [steps_panel]
382
+ if tool_panels:
383
+ panels.extend(tool_panels)
384
+ panels.append(main_panel)
385
+ return panels
355
386
 
356
387
  def _render_main_panel(self) -> Any:
357
388
  """Render the main content panel."""
358
389
  body = "".join(self.state.buffer).strip()
390
+ if not self.verbose:
391
+ final_content = (self.state.final_text or "").strip()
392
+ if final_content:
393
+ return create_final_panel(
394
+ final_content,
395
+ title="Final Result",
396
+ theme=self.cfg.theme,
397
+ )
359
398
  # Dynamic title with spinner + elapsed/hints
360
399
  title = self._format_enhanced_main_title()
361
400
  return create_main_panel(body, title, self.cfg.theme)
362
401
 
402
+ def apply_verbosity(self, verbose: bool) -> None:
403
+ """Update verbose behaviour at runtime."""
404
+
405
+ if self.verbose == verbose:
406
+ return
407
+
408
+ self.verbose = verbose
409
+ self.cfg.style = "debug" if verbose else "pretty"
410
+
411
+ desired_live = not verbose
412
+ if desired_live != self.cfg.live:
413
+ self.cfg.live = desired_live
414
+ if not desired_live:
415
+ self._shutdown_live()
416
+ else:
417
+ self._ensure_live()
418
+
419
+ if self.cfg.live:
420
+ self._ensure_live()
421
+
363
422
  def _maybe_insert_thinking_gap(
364
423
  self, task_id: str | None, context_id: str | None
365
424
  ) -> None:
@@ -668,15 +727,16 @@ class RichStreamRenderer:
668
727
 
669
728
  def _clamp_snapshot_body(self, body_text: str) -> str:
670
729
  """Clamp snapshot body to configured limits."""
671
- max_lines = int(self.cfg.snapshot_max_lines or 0) or 60
730
+ max_lines = int(self.cfg.snapshot_max_lines or 0)
672
731
  lines = body_text.splitlines()
673
- if len(lines) > max_lines:
732
+ if max_lines > 0 and len(lines) > max_lines:
674
733
  lines = lines[:max_lines] + ["… (truncated)"]
675
- body_text = "\n".join(lines)
734
+ body_text = "\n".join(lines)
676
735
 
677
- max_chars = int(self.cfg.snapshot_max_chars or 0) or 4000
678
- if len(body_text) > max_chars:
679
- body_text = body_text[: max_chars - 12] + "\n… (truncated)"
736
+ max_chars = int(self.cfg.snapshot_max_chars or 0)
737
+ if max_chars > 0 and len(body_text) > max_chars:
738
+ suffix = "\n… (truncated)"
739
+ body_text = body_text[: max_chars - len(suffix)] + suffix
680
740
 
681
741
  return body_text
682
742
 
@@ -29,5 +29,5 @@ class RendererConfig:
29
29
 
30
30
  # Scrollback/append options
31
31
  append_finished_snapshots: bool = False
32
- snapshot_max_chars: int = 4000
33
- snapshot_max_lines: int = 60
32
+ snapshot_max_chars: int = 12000
33
+ snapshot_max_lines: int = 200
@@ -10,10 +10,15 @@ Authors:
10
10
  import json
11
11
  from collections.abc import Callable, Iterable
12
12
  from pathlib import Path
13
- from typing import Any
13
+ from typing import TYPE_CHECKING, Any
14
14
 
15
15
  import yaml
16
16
 
17
+ if TYPE_CHECKING: # pragma: no cover - type-only imports
18
+ from rich.console import Console
19
+
20
+ from glaip_sdk.models import MCP
21
+
17
22
 
18
23
  def read_json(file_path: Path) -> dict[str, Any]:
19
24
  """Read data from JSON file.
@@ -132,7 +137,8 @@ def load_resource_from_file(file_path: Path) -> dict[str, Any]:
132
137
  return read_json(file_path)
133
138
  else:
134
139
  raise ValueError(
135
- f"Unsupported file format: {file_path.suffix}. Only JSON and YAML files are supported."
140
+ f"Unsupported file format: {file_path.suffix}. "
141
+ f"Only JSON and YAML files are supported."
136
142
  )
137
143
 
138
144
 
@@ -305,6 +311,91 @@ def _should_include_attribute(key: str, value: Any) -> bool:
305
311
  return True
306
312
 
307
313
 
314
+ def strip_empty_fields(data: dict[str, Any]) -> dict[str, Any]:
315
+ """Recursively remove None values and empty dictionaries from a dictionary.
316
+
317
+ Args:
318
+ data: Dictionary to clean
319
+
320
+ Returns:
321
+ Cleaned dictionary with None values and empty dicts removed
322
+ """
323
+ if not isinstance(data, dict):
324
+ return data
325
+
326
+ cleaned = {}
327
+ for key, value in data.items():
328
+ if value is None:
329
+ continue
330
+ if isinstance(value, dict):
331
+ nested = strip_empty_fields(value)
332
+ if nested: # Only include non-empty dicts
333
+ cleaned[key] = nested
334
+ else:
335
+ cleaned[key] = value
336
+
337
+ return cleaned
338
+
339
+
340
+ def build_mcp_export_payload(
341
+ mcp: "MCP",
342
+ *,
343
+ prompt_for_secrets: bool,
344
+ placeholder: str,
345
+ console: "Console",
346
+ ) -> dict[str, Any]:
347
+ """Build MCP export payload with authentication secret handling.
348
+
349
+ This function prepares an MCP resource for export by:
350
+ 1. Starting from model_dump(exclude_none=True) for API alignment
351
+ 2. Cleaning internal fields (_client, empty metadata)
352
+ 3. Processing authentication with secret capture/placeholder logic
353
+ 4. Removing empty fields recursively
354
+
355
+ Args:
356
+ mcp: MCP model instance to export
357
+ prompt_for_secrets: Whether to interactively prompt for missing secrets
358
+ placeholder: Placeholder text for missing secrets
359
+ console: Rich Console instance for user interaction
360
+
361
+ Returns:
362
+ Dictionary ready for export (JSON/YAML serialization)
363
+
364
+ Raises:
365
+ ImportError: If required modules (auth helpers) are not available
366
+ """
367
+ # Import here to avoid circular dependency
368
+ from glaip_sdk.cli.auth import prepare_authentication_export
369
+
370
+ # Start with model dump (excludes None values automatically)
371
+ payload = mcp.model_dump(exclude_none=True)
372
+
373
+ # Remove internal/CLI fields
374
+ payload.pop("_client", None)
375
+
376
+ # Remove empty metadata dict
377
+ if "metadata" in payload and not payload["metadata"]:
378
+ payload.pop("metadata")
379
+
380
+ # Process authentication section
381
+ if "authentication" in payload:
382
+ processed_auth = prepare_authentication_export(
383
+ payload["authentication"],
384
+ prompt_for_secrets=prompt_for_secrets,
385
+ placeholder=placeholder,
386
+ console=console,
387
+ )
388
+ if processed_auth:
389
+ payload["authentication"] = processed_auth
390
+ else:
391
+ payload.pop("authentication")
392
+
393
+ # Apply final cleanup to remove any remaining empty fields
394
+ payload = strip_empty_fields(payload)
395
+
396
+ return payload
397
+
398
+
308
399
  def validate_json_string(json_str: str) -> dict[str, Any]:
309
400
  """Validate JSON string and return parsed data.
310
401
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: glaip-sdk
3
- Version: 0.0.9
3
+ Version: 0.0.11
4
4
  Summary: Python SDK for GL AIP (GDP Labs AI Agent Package) - Simplified CLI Design
5
5
  License: MIT
6
6
  Author: Raymond Christopher
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Requires-Dist: click (>=8.2.0,<8.3.0)
15
15
  Requires-Dist: httpx (>=0.28.1)
16
+ Requires-Dist: packaging (>=23.2)
16
17
  Requires-Dist: pydantic (>=2.0.0)
17
18
  Requires-Dist: python-dotenv (>=1.1.1,<2.0.0)
18
19
  Requires-Dist: pyyaml (>=6.0.0)
@@ -1,23 +1,25 @@
1
1
  glaip_sdk/__init__.py,sha256=FD-oTyFUKsTB9xTuGiqvkhuFXfeZ-TspjkeXERglha8,370
2
2
  glaip_sdk/_version.py,sha256=tGkFWAVu2ry4Hy7j-u7ophGbPRX8y-ngBbXDhN1VBIQ,2007
3
- glaip_sdk/branding.py,sha256=_TiQtiwH3ZSWaQhooWPHioriL0goTiYANeN6DT8lQX8,5398
3
+ glaip_sdk/branding.py,sha256=xsHL7nRAWuwJrAvCi2fZhaPD-AWvdcLNoTVmlw4gZKc,5604
4
4
  glaip_sdk/cli/__init__.py,sha256=xCCfuF1Yc7mpCDcfhHZTX0vizvtrDSLeT8MJ3V7m5A0,156
5
5
  glaip_sdk/cli/agent_config.py,sha256=VHjebw68wAdhGUzYdPH8qz10oADZPRgUQcPW6F7iHIU,2421
6
+ glaip_sdk/cli/auth.py,sha256=eYdtGmJ3XgiO96hq_69GF6b3W-aRWZrDQ-6bHuaRX4M,13517
6
7
  glaip_sdk/cli/commands/__init__.py,sha256=x0CZlZbZHoHvuzfoTWIyEch6WmNnbPzxajrox6riYp0,173
7
- glaip_sdk/cli/commands/agents.py,sha256=1xGSoH6C9hSaGglXf4pnloqX5gJQIPsgHhkliiWQQcY,39988
8
+ glaip_sdk/cli/commands/agents.py,sha256=97dzowjHgk5knyHuI-0z2ojvqNlkebNN1-ikGEoS5sc,40623
8
9
  glaip_sdk/cli/commands/configure.py,sha256=eRDzsaKV4fl2lJt8ieS4g2-xRnaa02eAAPW8xBf-tqA,7507
9
- glaip_sdk/cli/commands/mcps.py,sha256=fRCRQMAnogT76lHUn_nuqkge_x75Fj023CDRgdoj0kQ,14343
10
+ glaip_sdk/cli/commands/mcps.py,sha256=a2p8KfPYv4YaC9qiC7LEyh8oPsbLAwXv4dsnwxZ_juI,19752
10
11
  glaip_sdk/cli/commands/models.py,sha256=Ra3-50BPScNs0Q-j4b7U4iK0hNooucEyVgHpQ11-pt8,1700
11
12
  glaip_sdk/cli/commands/tools.py,sha256=MOM9Db3HGL1stF-WvL5cZXjw-iZo2qc-oyKQHy6VwIM,18690
12
13
  glaip_sdk/cli/display.py,sha256=jE20swoRKzpYUmc0jgbeonaXKeE9x95hfjWAEdnBYRc,8727
13
14
  glaip_sdk/cli/io.py,sha256=GPkw3pQMLBGoD5GH-KlbKpNRlVWFZOXHE17F7V3kQsI,3343
14
- glaip_sdk/cli/main.py,sha256=uWuntvFl0hQSLfNa1rXb-J2zUK_msf3vrSbbrqBcEc4,12692
15
+ glaip_sdk/cli/main.py,sha256=3Bl8u9t1MekzaNrAZqsx4TukbzzFdi6Wss6jvTDos00,12930
15
16
  glaip_sdk/cli/resolution.py,sha256=BOw2NchReLKewAwBAZLWw_3_bI7u3tfzQEO7kQbIiGE,2067
16
17
  glaip_sdk/cli/slash/__init__.py,sha256=Vdv6Y8bu-pA8dxDlyP4XrhudBPivztUozhLAz9vaLig,682
17
- glaip_sdk/cli/slash/agent_session.py,sha256=JFIFBxB4xzigqHtpLGbl2fgg7RHNwy3e-kUMPMK9MdM,5006
18
- glaip_sdk/cli/slash/prompt.py,sha256=QFWYgNt5AhBRYGGyUkH30ToZE7B6LS-eZGzoyibYrK8,6064
19
- glaip_sdk/cli/slash/session.py,sha256=GtnnBqV79KtFJHeLfCKKnCXJ6SU1AmeXquPjy72T20E,24215
20
- glaip_sdk/cli/utils.py,sha256=S7aa4-v808BEZGvEhKn8N8HQr2slSpvV-TtWw3j15S8,41779
18
+ glaip_sdk/cli/slash/agent_session.py,sha256=pDOwGXNHuyJIulrGYu1pacyF3oxHWeDQY-Uv92h2qVg,6859
19
+ glaip_sdk/cli/slash/prompt.py,sha256=Pr5SSTOKFssRsi-AujOm5_BCW_f5MxgLwJ3CCji1ogM,7356
20
+ glaip_sdk/cli/slash/session.py,sha256=U5UEL6eIvNkIJcSz04Uf8Ql0EptmLJukqHxDCAJ-nOQ,31097
21
+ glaip_sdk/cli/update_notifier.py,sha256=uVbjZJnW4znTzx4AkqsDO4NfXiF-mtQiypTkJByAVuM,3236
22
+ glaip_sdk/cli/utils.py,sha256=98n1tovTUSqS5BIUl4cz6zGoRSSJiXFGJW8oD0xIm2g,42537
21
23
  glaip_sdk/cli/validators.py,sha256=USbBgY86AwuDHO-Q_g8g7hu-ot4NgITBsWjTWIl62ms,5569
22
24
  glaip_sdk/client/__init__.py,sha256=nYLXfBVTTWwKjP0e63iumPYO4k5FifwWaELQPaPIKIg,188
23
25
  glaip_sdk/client/agents.py,sha256=FSKubF40wptMNIheC3_iawiX2CRbhTcNLFiz4qkPC6k,34659
@@ -26,22 +28,22 @@ glaip_sdk/client/main.py,sha256=LlvYHP7-Hy7Eq1ep1kfk337K-Oue5SdKWJpqYfX9eXY,7993
26
28
  glaip_sdk/client/mcps.py,sha256=yxwrAtztElYDEGhp2EHRpeYUxNsOlTLTqtw9jSKJmcI,8936
27
29
  glaip_sdk/client/tools.py,sha256=n8DIiOOf1YU_j9JK3Bx2-rDnkpckPi0MI9Ok2s1kwa4,16634
28
30
  glaip_sdk/client/validators.py,sha256=NtPsWjQLjj25LiUnmR-WuS8lL5p4MVRaYT9UVRmj9bo,8809
29
- glaip_sdk/config/constants.py,sha256=NgmPqJmpK1wgEds7T-_B6CDUBsvcsmIy27ms-Z8GFgY,902
30
- glaip_sdk/exceptions.py,sha256=QTVtwxRHMN4e8gGn0icXphZvdugiRvcSrlMYylwGsDc,1993
31
- glaip_sdk/models.py,sha256=Ry_Ihd6FuC0JGb0Obd5T3A22AOp2r9xStQisfE8uo8c,8822
31
+ glaip_sdk/config/constants.py,sha256=ysEobMiXlLZGIOEaqTdHpPF8kmg5nbLn7BIcBvTCuHM,819
32
+ glaip_sdk/exceptions.py,sha256=DJgaIcvGA09qIX10-ypYgQQ5_k5N3qknmiIFP3p4Z7E,1872
33
+ glaip_sdk/models.py,sha256=0Y65LXpLqUY3IYVPIzP7jm8gdZUMw-EKRKGC1ZOLOcA,8758
32
34
  glaip_sdk/rich_components.py,sha256=pmJd-81OQE8bC9UOXtga5rsax4zphKlzCZ1JoWbbQzQ,803
33
35
  glaip_sdk/utils/__init__.py,sha256=fmVGcUFa7G0CCfSMSqfNU2BqFl36G1gOFyDfTvtJfVw,926
34
36
  glaip_sdk/utils/agent_config.py,sha256=b7_J5DELyk0b_XEoi7tsxbS3wqzAKbMa-3_C-65pPIY,6791
35
37
  glaip_sdk/utils/client_utils.py,sha256=M6rZloMKyONaZfI0RtU5tnkibwrIJL5Udw4wPMKkJcw,13588
36
38
  glaip_sdk/utils/display.py,sha256=94s9lYF_8ra8jpeqOkbVrUm8oidtCE6OtucyxLQPKmU,3105
37
39
  glaip_sdk/utils/general.py,sha256=V5hJrIpYDvDsldU_nChHpuvV2AwhFLUI7Qvcaihq_8A,2270
38
- glaip_sdk/utils/import_export.py,sha256=Wxt2QuWI7JexSkkcBOdTgeYs1nly35yppaTNeF28XJo,5400
40
+ glaip_sdk/utils/import_export.py,sha256=az_0jCpMB7I6N5HygS2uc62-W6ddm4buEwm6gTsalhY,5203
39
41
  glaip_sdk/utils/rendering/__init__.py,sha256=vXjwk5rPhhfPyD8S0DnV4GFFEtPJp4HCCg1Um9SXfs0,70
40
42
  glaip_sdk/utils/rendering/formatting.py,sha256=_k8tkcobctmHvdygMljZF7-ALGXpD9-hHF1CNtM2KMU,7201
41
43
  glaip_sdk/utils/rendering/models.py,sha256=SS34_00FaoGuSYn-viBkAtIbq7cJNwwPjpxnvyeUmxI,1567
42
44
  glaip_sdk/utils/rendering/renderer/__init__.py,sha256=EXwVBmGkSYcype4ocAXo69Z1kXu0gpNXmhH5LW0_B7A,2939
43
- glaip_sdk/utils/rendering/renderer/base.py,sha256=HfIeq-izi3WprbKX_qxNeQRrpernFtoCvgQqrIyVYSU,40950
44
- glaip_sdk/utils/rendering/renderer/config.py,sha256=E4ER8TJJbqr1hcWjkwG7XROqLuccQy4EL99CbuLvSXE,783
45
+ glaip_sdk/utils/rendering/renderer/base.py,sha256=A_f8r3hWDVrQjzUR5CYzQMekPRIdG-l7Wjh9Hx492Xk,42425
46
+ glaip_sdk/utils/rendering/renderer/config.py,sha256=-P35z9JO_1ypJXAqxJ1ybHraH4i-I1LPopeW3Lh7ACE,785
45
47
  glaip_sdk/utils/rendering/renderer/console.py,sha256=4cLOw4Q1fkHkApuj6dWW8eYpeYdcT0t2SO5MbVt5UTc,1844
46
48
  glaip_sdk/utils/rendering/renderer/debug.py,sha256=FEYxAu4ZB0CjrJKevqQ2TKDgElA2cf6GqZXCNm12sNQ,3721
47
49
  glaip_sdk/utils/rendering/renderer/panels.py,sha256=05u6SjU53iP9VD0YHTNruzD7sO6qYCp-P5dTTSdSZmU,3364
@@ -51,9 +53,9 @@ glaip_sdk/utils/rendering/steps.py,sha256=4zdeyKxMbUzCal4-yv8yf18144cs5wwXaxhe6m
51
53
  glaip_sdk/utils/resource_refs.py,sha256=0YzblJNfRhz9xhpaKE9aE68XEV-6_ssr0fIkiMVOka0,5489
52
54
  glaip_sdk/utils/rich_utils.py,sha256=-Ij-1bIJvnVAi6DrfftchIlMcvOTjVmSE0Qqax0EY_s,763
53
55
  glaip_sdk/utils/run_renderer.py,sha256=d_VMI6LbvHPUUeRmGqh5wK_lHqDEIAcym2iqpbtDad0,1365
54
- glaip_sdk/utils/serialization.py,sha256=cUE6PxqTsfJuEEmsk_Li3QmaDavTIPotEA-BQ-v5exY,9043
56
+ glaip_sdk/utils/serialization.py,sha256=T1yt_8G2DCFpcxx7XnqFl5slksRXfBCUuLQJTreGYEQ,11806
55
57
  glaip_sdk/utils/validation.py,sha256=QNORcdyvuliEs4EH2_mkDgmoyT9utgl7YNhaf45SEf8,6992
56
- glaip_sdk-0.0.9.dist-info/METADATA,sha256=f2-GNqMR8cLgyQnA4f7TCPZv1ETZE4S8LSpQaPD6GrE,4949
57
- glaip_sdk-0.0.9.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
58
- glaip_sdk-0.0.9.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
59
- glaip_sdk-0.0.9.dist-info/RECORD,,
58
+ glaip_sdk-0.0.11.dist-info/METADATA,sha256=Z8hxLQAn8fWQtisQyZAi6QgOCSxDpEWw4gLbTBMDrxU,4984
59
+ glaip_sdk-0.0.11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
60
+ glaip_sdk-0.0.11.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
61
+ glaip_sdk-0.0.11.dist-info/RECORD,,