glaip-sdk 0.4.0__py3-none-any.whl → 0.5.1__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/cli/utils.py CHANGED
@@ -12,6 +12,7 @@ import importlib
12
12
  import json
13
13
  import logging
14
14
  import os
15
+ import re
15
16
  import sys
16
17
  from collections.abc import Callable, Iterable
17
18
  from contextlib import AbstractContextManager, contextmanager, nullcontext
@@ -30,6 +31,7 @@ from glaip_sdk.branding import (
30
31
  SUCCESS_STYLE,
31
32
  WARNING_STYLE,
32
33
  )
34
+ from glaip_sdk.cli import display as cli_display
33
35
  from glaip_sdk.cli import masking, pager
34
36
  from glaip_sdk.cli.config import load_config
35
37
  from glaip_sdk.cli.constants import LITERAL_STRING_THRESHOLD, TABLE_SORT_ENABLED
@@ -40,7 +42,6 @@ from glaip_sdk.cli.context import (
40
42
  from glaip_sdk.cli.context import (
41
43
  detect_export_format as _detect_export_format,
42
44
  )
43
- from glaip_sdk.cli import display as cli_display
44
45
  from glaip_sdk.cli.hints import command_hint
45
46
  from glaip_sdk.cli.io import export_resource_to_file_with_validation
46
47
  from glaip_sdk.cli.rich_helpers import markup_text, print_markup
@@ -548,45 +549,48 @@ _spinner_stop = stop_spinner
548
549
 
549
550
 
550
551
  def get_client(ctx: Any) -> Client: # pragma: no cover
551
- """Get configured client from context, env, and config file (ctx > env > file)."""
552
+ """Get configured client from context and account store (ctx > account)."""
553
+ # Import here to avoid circular import
554
+ from glaip_sdk.cli.auth import resolve_credentials # noqa: PLC0415
555
+
552
556
  module = importlib.import_module("glaip_sdk")
553
557
  client_class = cast("type[Client]", module.Client)
554
- file_config = load_config() or {}
555
558
  context_config_obj = getattr(ctx, "obj", None)
556
559
  context_config = context_config_obj or {}
557
560
 
558
- raw_timeout = os.getenv("AIP_TIMEOUT", "0") or "0"
559
- try:
560
- timeout_value = float(raw_timeout)
561
- except ValueError:
562
- timeout_value = None
563
-
564
- env_config = {
565
- "api_url": os.getenv("AIP_API_URL"),
566
- "api_key": os.getenv("AIP_API_KEY"),
567
- "timeout": timeout_value if timeout_value else None,
568
- }
569
- env_config = {k: v for k, v in env_config.items() if v not in (None, "", 0)}
570
-
571
- # Merge config sources: context > env > file
572
- config = {
573
- **file_config,
574
- **env_config,
575
- **{k: v for k, v in context_config.items() if v is not None},
576
- }
561
+ account_name = context_config.get("account_name")
562
+ api_url, api_key, _ = resolve_credentials(
563
+ account_name=account_name,
564
+ api_url=context_config.get("api_url"),
565
+ api_key=context_config.get("api_key"),
566
+ )
577
567
 
578
- if not config.get("api_url") or not config.get("api_key"):
579
- configure_hint = command_hint("configure", slash_command="login", ctx=ctx)
580
- actions = []
568
+ if not api_url or not api_key:
569
+ configure_hint = command_hint("accounts add", slash_command="login", ctx=ctx)
570
+ actions: list[str] = []
581
571
  if configure_hint:
582
- actions.append(f"Run `{configure_hint}`")
583
- actions.append("set AIP_* env vars")
572
+ actions.append(f"Run `{configure_hint}` to add an account profile")
573
+ else:
574
+ actions.append("add an account with 'aip accounts add'")
584
575
  raise click.ClickException(f"Missing api_url/api_key. {' or '.join(actions)}.")
585
576
 
577
+ # Get timeout from context or config
578
+ timeout = context_config.get("timeout")
579
+ if timeout is None:
580
+ raw_timeout = os.getenv("AIP_TIMEOUT", "0") or "0"
581
+ try:
582
+ timeout = float(raw_timeout) if raw_timeout != "0" else None
583
+ except ValueError:
584
+ timeout = None
585
+ if timeout is None:
586
+ # Fallback to legacy config
587
+ file_config = load_config() or {}
588
+ timeout = file_config.get("timeout")
589
+
586
590
  return client_class(
587
- api_url=config.get("api_url"),
588
- api_key=config.get("api_key"),
589
- timeout=float(config.get("timeout") or 30.0),
591
+ api_url=api_url,
592
+ api_key=api_key,
593
+ timeout=float(timeout or 30.0),
590
594
  )
591
595
 
592
596
 
@@ -784,56 +788,60 @@ class _FuzzyCompleter:
784
788
  self.words = words
785
789
 
786
790
  def get_completions(self, document: Any, _complete_event: Any) -> Any: # pragma: no cover
787
- """Get fuzzy completions for the current word.
791
+ """Get fuzzy completions for the current word, ranked by score.
788
792
 
789
793
  Args:
790
794
  document: Document object from prompt_toolkit.
791
795
  _complete_event: Completion event (unused).
792
796
 
793
797
  Yields:
794
- Completion objects matching the current word.
798
+ Completion objects matching the current word, in ranked order.
795
799
  """
796
- word = document.get_word_before_cursor()
797
- if not word:
800
+ # Get the entire buffer text (not just word before cursor)
801
+ buffer_text = document.text_before_cursor
802
+ if not buffer_text or not isinstance(buffer_text, str):
798
803
  return
799
804
 
800
- word_lower = word.lower()
801
- for label in self.words:
802
- label_lower = label.lower()
803
- if self._fuzzy_match(word_lower, label_lower):
804
- yield Completion(label, start_position=-len(word))
805
-
806
- def _fuzzy_match(self, search: str, target: str) -> bool: # pragma: no cover
807
- """True fuzzy matching: checks if all characters in search appear in order in target."""
808
- if not search:
809
- return True
810
-
811
- search_idx = 0
812
- for char in target:
813
- if search_idx < len(search) and search[search_idx] == char:
814
- search_idx += 1
815
- if search_idx == len(search):
816
- return True
817
- return False
805
+ # Rank labels by fuzzy score
806
+ ranked_labels = _rank_labels(self.words, buffer_text)
807
+
808
+ # Yield ranked completions
809
+ for label in ranked_labels:
810
+ # Replace entire buffer text, not just the word before cursor
811
+ # This prevents concatenation issues with hyphenated names
812
+ yield Completion(label, start_position=-len(buffer_text))
818
813
 
819
814
 
820
815
  def _perform_fuzzy_search(answer: str, labels: list[str], by_label: dict[str, dict[str, Any]]) -> dict[str, Any] | None:
821
- """Perform fuzzy search fallback and return best match."""
816
+ """Perform fuzzy search fallback and return best match.
817
+
818
+ Returns:
819
+ Selected resource dict or None if cancelled/no match.
820
+ """
822
821
  # Exact label match
823
822
  if answer in by_label:
824
823
  return by_label[answer]
825
824
 
826
- # Fuzzy search fallback
827
- best_match = None
828
- best_score = -1
829
-
825
+ # Fuzzy search fallback using ranked labels
826
+ # Check if query actually matches anything before ranking
827
+ query_lower = answer.lower()
828
+ has_match = False
830
829
  for label in labels:
831
- score = _fuzzy_score(answer.lower(), label.lower())
832
- if score > best_score:
833
- best_score = score
834
- best_match = label
830
+ if _fuzzy_score(query_lower, label.lower()) >= 0:
831
+ has_match = True
832
+ break
833
+
834
+ if not has_match:
835
+ return None
835
836
 
836
- return by_label[best_match] if best_match and best_score > 0 else None
837
+ ranked_labels = _rank_labels(labels, answer)
838
+ if ranked_labels:
839
+ # Return the top-ranked match
840
+ best_match = ranked_labels[0]
841
+ if best_match in by_label:
842
+ return by_label[best_match]
843
+
844
+ return None
837
845
 
838
846
 
839
847
  def _fuzzy_pick(
@@ -862,33 +870,61 @@ def _fuzzy_pick(
862
870
  return _perform_fuzzy_search(answer, labels, by_label) if answer else None
863
871
 
864
872
 
865
- def _is_fuzzy_match(search: str, target: str) -> bool:
866
- """Check if search string is a fuzzy match for target."""
873
+ def _strip_spaces_for_matching(value: str) -> str:
874
+ """Remove whitespace from a query for consistent fuzzy matching."""
875
+ return re.sub(r"\s+", "", value)
876
+
877
+
878
+ def _is_fuzzy_match(search: Any, target: str) -> bool:
879
+ """Case-insensitive fuzzy match with optional spaces."""
880
+ # Ensure search is a string
881
+ if not isinstance(search, str):
882
+ return False
883
+
867
884
  if not search:
868
885
  return True
869
886
 
887
+ # Strip spaces from search query - treat them as optional separators
888
+ # This allows "test agent" to match "test-agent", "test_agent", etc.
889
+ search_no_spaces = _strip_spaces_for_matching(search).lower()
890
+ if not search_no_spaces:
891
+ # If search is only spaces, match everything
892
+ return True
893
+
870
894
  search_idx = 0
871
- for char in target:
872
- if search_idx < len(search) and search[search_idx] == char:
895
+ for char in target.lower():
896
+ if search_idx < len(search_no_spaces) and search_no_spaces[search_idx] == char:
873
897
  search_idx += 1
874
- if search_idx == len(search):
898
+ if search_idx == len(search_no_spaces):
875
899
  return True
876
900
  return False
877
901
 
878
902
 
879
903
  def _calculate_exact_match_bonus(search: str, target: str) -> int:
880
- """Calculate bonus for exact substring matches."""
881
- return 100 if search.lower() in target.lower() else 0
904
+ """Calculate bonus for exact substring matches.
905
+
906
+ Spaces in search are treated as optional separators (stripped before matching).
907
+ """
908
+ # Strip spaces from search - treat them as optional separators
909
+ search_no_spaces = _strip_spaces_for_matching(search).lower()
910
+ if not search_no_spaces:
911
+ return 0
912
+ return 100 if search_no_spaces in target.lower() else 0
882
913
 
883
914
 
884
915
  def _calculate_consecutive_bonus(search: str, target: str) -> int:
885
- """Calculate bonus for consecutive character matches."""
916
+ """Case-insensitive consecutive-character bonus."""
917
+ # Strip spaces from search - treat them as optional separators
918
+ search_no_spaces = _strip_spaces_for_matching(search).lower()
919
+ if not search_no_spaces:
920
+ return 0
921
+
886
922
  consecutive = 0
887
923
  max_consecutive = 0
888
924
  search_idx = 0
889
925
 
890
- for char in target:
891
- if search_idx < len(search) and search[search_idx] == char:
926
+ for char in target.lower():
927
+ if search_idx < len(search_no_spaces) and search_no_spaces[search_idx] == char:
892
928
  consecutive += 1
893
929
  max_consecutive = max(max_consecutive, consecutive)
894
930
  search_idx += 1
@@ -899,16 +935,31 @@ def _calculate_consecutive_bonus(search: str, target: str) -> int:
899
935
 
900
936
 
901
937
  def _calculate_length_bonus(search: str, target: str) -> int:
902
- """Calculate bonus for shorter search terms."""
903
- return (len(target) - len(search)) * 2
938
+ """Calculate bonus for shorter search terms.
939
+
940
+ Spaces in search are treated as optional separators (stripped before calculation).
941
+ """
942
+ # Strip spaces from search - treat them as optional separators
943
+ search_no_spaces = _strip_spaces_for_matching(search)
944
+ if not search_no_spaces:
945
+ return 0
946
+ return max(0, (len(target) - len(search_no_spaces)) * 2)
904
947
 
905
948
 
906
- def _fuzzy_score(search: str, target: str) -> int:
949
+ def _fuzzy_score(search: Any, target: str) -> int:
907
950
  """Calculate fuzzy match score.
908
951
 
909
952
  Higher score = better match.
910
953
  Returns -1 if no match possible.
954
+
955
+ Args:
956
+ search: Search string (or any type - non-strings return -1)
957
+ target: Target string to match against
911
958
  """
959
+ # Ensure search is a string first
960
+ if not isinstance(search, str):
961
+ return -1
962
+
912
963
  if not search:
913
964
  return 0
914
965
 
@@ -924,6 +975,59 @@ def _fuzzy_score(search: str, target: str) -> int:
924
975
  return score
925
976
 
926
977
 
978
+ def _extract_id_suffix(label: str) -> str:
979
+ """Extract ID suffix from label for tie-breaking.
980
+
981
+ Args:
982
+ label: Display label (e.g., "name • [abc123...]")
983
+
984
+ Returns:
985
+ ID suffix string (e.g., "abc123") or empty string if not found
986
+ """
987
+ # Look for pattern like "[abc123...]" or "[abc123]"
988
+ match = re.search(r"\[([^\]]+)\]", label)
989
+ return match.group(1) if match else ""
990
+
991
+
992
+ def _rank_labels(labels: list[str], query: Any) -> list[str]:
993
+ """Rank labels by fuzzy score with deterministic tie-breaks.
994
+
995
+ Args:
996
+ labels: List of display labels to rank
997
+ query: Search query string (or any type - non-strings return sorted labels)
998
+
999
+ Returns:
1000
+ Labels sorted by fuzzy score (descending), then case-insensitive label,
1001
+ then id suffix for deterministic ordering.
1002
+ """
1003
+ if not query:
1004
+ # No query: sort by case-insensitive label, then id suffix
1005
+ return sorted(labels, key=lambda lbl: (lbl.lower(), _extract_id_suffix(lbl)))
1006
+
1007
+ # Ensure query is a string
1008
+ if not isinstance(query, str):
1009
+ return sorted(labels, key=lambda lbl: (lbl.lower(), _extract_id_suffix(lbl)))
1010
+
1011
+ query_lower = query.lower()
1012
+
1013
+ # Calculate scores and create tuples for sorting
1014
+ scored_labels = []
1015
+ for label in labels:
1016
+ label_lower = label.lower()
1017
+ score = _fuzzy_score(query_lower, label_lower)
1018
+ if score >= 0: # Only include matches
1019
+ scored_labels.append((score, label_lower, _extract_id_suffix(label), label))
1020
+
1021
+ if not scored_labels:
1022
+ # No fuzzy matches: fall back to deterministic label sorting
1023
+ return sorted(labels, key=lambda lbl: (lbl.lower(), _extract_id_suffix(lbl)))
1024
+
1025
+ # Sort by: score (desc), label (case-insensitive), id suffix, original label
1026
+ scored_labels.sort(key=lambda x: (-x[0], x[1], x[2], x[3]))
1027
+
1028
+ return [label for _score, _label_lower, _id_suffix, label in scored_labels]
1029
+
1030
+
927
1031
  # ----------------------- Structured renderer helpers -------------------- #
928
1032
 
929
1033
 
@@ -1169,7 +1273,12 @@ def _print_selection_tip(title: str) -> None:
1169
1273
 
1170
1274
 
1171
1275
  def _handle_fuzzy_pick_selection(rows: list[dict[str, Any]], columns: list[tuple], title: str) -> bool:
1172
- """Handle fuzzy picker selection, returns True if selection was made."""
1276
+ """Handle fuzzy picker selection.
1277
+
1278
+ Returns:
1279
+ True if a resource was selected and displayed,
1280
+ False if cancelled/no selection.
1281
+ """
1173
1282
  picked = _try_fuzzy_pick(rows, columns, title)
1174
1283
  if picked is None:
1175
1284
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: glaip-sdk
3
- Version: 0.4.0
3
+ Version: 0.5.1
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
@@ -2,24 +2,27 @@ glaip_sdk/__init__.py,sha256=7ICOkPeiwQGkadqxIgJXOYPHcJOHYRIF_GU0xkjOtSE,366
2
2
  glaip_sdk/_version.py,sha256=5CHGCxx_36fgmMWuEx6jJ2CzzM-i9eBFyQWFwBi23XE,2259
3
3
  glaip_sdk/branding.py,sha256=tLqYCIHMkUf8p2smpuAGNptwaKUN38G4mlh0A0DOl_w,7823
4
4
  glaip_sdk/cli/__init__.py,sha256=xCCfuF1Yc7mpCDcfhHZTX0vizvtrDSLeT8MJ3V7m5A0,156
5
+ glaip_sdk/cli/account_store.py,sha256=NXuAVPaJS_32Aw1VTaZCNwIID-gADw4F_UMieoWmg3g,17336
5
6
  glaip_sdk/cli/agent_config.py,sha256=YAbFKrTNTRqNA6b0i0Q3pH-01rhHDRi5v8dxSFwGSwM,2401
6
- glaip_sdk/cli/auth.py,sha256=wvzJJXKzOeRaGfuWSv7_VJMba-vbvID0Q5jRYpALOBg,15891
7
+ glaip_sdk/cli/auth.py,sha256=9hfjZyd4cx2_mImqykJ1sWQsuVTR2gy6D4hFqAQNKL4,24129
7
8
  glaip_sdk/cli/commands/__init__.py,sha256=6Z3ASXDut0lAbUX_umBFtxPzzFyqoiZfVeTahThFu1A,219
8
- glaip_sdk/cli/commands/agents.py,sha256=RTfL-Hj-ORbbsJoRZMJD_MM-zO6P765GPZzZvGxUpYE,47686
9
- glaip_sdk/cli/commands/configure.py,sha256=urq9Wdnd2JbHSY2KJMCy0-4rBMhQLYsdlWL_YMVgVu8,11420
9
+ glaip_sdk/cli/commands/accounts.py,sha256=VCG-JZGY86DlWO5bAfDZ70RuyKQ5q-Rh4U0iM8NwO6M,13755
10
+ glaip_sdk/cli/commands/agents.py,sha256=y89okY-a5sM_QCS3F3C66DF7yhhHFbUJ7ZzIl2DUEck,47880
11
+ glaip_sdk/cli/commands/common_config.py,sha256=IY13gPkeifXxSdpzRFUvfRin8J7s38p6Y7TYjdGw7w4,2474
12
+ glaip_sdk/cli/commands/configure.py,sha256=8vfgtNEMK2lnEk3i6H1ZevsjxnYA6jAj4evhWmsHi6w,14494
10
13
  glaip_sdk/cli/commands/mcps.py,sha256=tttqQnfM89iI9Pm94u8YRhiHMQNYNouecFX0brsT4cQ,42551
11
14
  glaip_sdk/cli/commands/models.py,sha256=vfcGprK5CHprQ0CNpNzQlNNTELvdgKC7JxTG_ijOwmE,2009
12
15
  glaip_sdk/cli/commands/tools.py,sha256=7_RMTuTI1Guu7psClovbyt2umfk4rkp7jSW19GXKA44,18440
13
- glaip_sdk/cli/commands/transcripts.py,sha256=4kI6FoaL9K5ch10tKr7vdT10UPdFi5f5ANZhCDytyss,26377
16
+ glaip_sdk/cli/commands/transcripts.py,sha256=ofxZLus1xLB061NxrLo1J6LPEb2VIxJTjmz7hLKgPmc,26377
14
17
  glaip_sdk/cli/commands/update.py,sha256=rIZo_x-tvpvcwpQLpwYwso1ix6qTHuNNTL4egmn5fEM,1812
15
- glaip_sdk/cli/config.py,sha256=2NZxFyt8jc6CMRUbuxx7sq_wsfTJXmwQGn09hhYHGnE,1341
18
+ glaip_sdk/cli/config.py,sha256=_UU7pljAhgzwKLx7Yqp2_ibiInR-dHuykC_UWL51BHc,2310
16
19
  glaip_sdk/cli/constants.py,sha256=zqcVtzfj6huW97gbCmhkFqntge1H-c1vnkGqTazADgU,895
17
20
  glaip_sdk/cli/context.py,sha256=--Y5vc6lgoAV7cRoUAr9UxSQaLmkMg29FolA7EwoRqM,3803
18
- glaip_sdk/cli/display.py,sha256=845_VGCFeQJfvwyLtAIj4E6Rs-alFNmTQXOOWpF-F5U,12137
19
- glaip_sdk/cli/hints.py,sha256=ZnBvQFgODCmKwRPNIjFswi7XAFsKOyVgFBroxI4jvq4,1597
21
+ glaip_sdk/cli/display.py,sha256=ojgWdGeD5KUnGOmWNqqK4JP-1EaWHWX--DWze3BmIz0,12137
22
+ glaip_sdk/cli/hints.py,sha256=ca4krG103IS43s5BSLr0-N7uRMpte1_LY4nAXVvgDxo,1596
20
23
  glaip_sdk/cli/io.py,sha256=ChP6CRKbtuENsNomNEaMDfPDU0iqO-WuVvl4_y7F2io,3871
21
- glaip_sdk/cli/main.py,sha256=lPX7IoUuQshAXQQPtdOl563H6VhLWvxCwW9tsFLoJqM,16967
22
- glaip_sdk/cli/masking.py,sha256=QRtUeHBVCJG02EXLxnPzfhRmD-leMxWf6QKxh4TCax0,3666
24
+ glaip_sdk/cli/main.py,sha256=vWbx7nQBX2ZeMkNFFY2PA2Hr5vyr6-lOyx2ixzJeay0,20974
25
+ glaip_sdk/cli/masking.py,sha256=2lrXQ-pfL7N-vNEQRT1s4Xq3JPDPDT8RC61OdaTtkkc,4060
23
26
  glaip_sdk/cli/mcp_validators.py,sha256=cwbz7p_p7_9xVuuF96OBQOdmEgo5UObU6iWWQ2X03PI,10047
24
27
  glaip_sdk/cli/pager.py,sha256=XygkAB6UW3bte7I4KmK7-PUGCJiq2Pv-4-MfyXAmXCw,7925
25
28
  glaip_sdk/cli/parsers/__init__.py,sha256=NzLrSH6GOdNoewXtKNpB6GwrauA8rb_IGYV6cz5Hn3o,113
@@ -27,21 +30,21 @@ glaip_sdk/cli/parsers/json_input.py,sha256=kxoxeIlgfsaH2jhe6apZAgSxAtwlpSINLTMRs
27
30
  glaip_sdk/cli/resolution.py,sha256=K-VaEHm9SYY_qfb9538VNHykL4_2N6F8iQqI1zMx_64,2402
28
31
  glaip_sdk/cli/rich_helpers.py,sha256=kO47N8e506rxrN6Oc9mbAWN3Qb536oQPWZy1s9A616g,819
29
32
  glaip_sdk/cli/slash/__init__.py,sha256=J9TPL2UcNTkW8eifG6nRmAEGHhyEgdYMYk4cHaaObC0,386
30
- glaip_sdk/cli/slash/agent_session.py,sha256=F11RYVBGs86Ox2zW7czXSBjojPx9jMAdgAiSxWdZl6k,11304
33
+ glaip_sdk/cli/slash/agent_session.py,sha256=9r1xNRk5mk6rfJXV6KIf2Yo4B4hjknimd9fkxH1LO3c,11304
31
34
  glaip_sdk/cli/slash/prompt.py,sha256=2urqR3QqN3O09lHmKKSEbhsIdlS4B7hm9O8AP_VwCSU,8034
32
- glaip_sdk/cli/slash/remote_runs_controller.py,sha256=1kdnrH6HNlblqpRtTJVlWzWUeFPlmd6Ef_IDkqZ01CI,21354
33
- glaip_sdk/cli/slash/session.py,sha256=GB6rMHw5-5zl61XI1ShjtIKe6MOi3zc8biXJxPaw9do,57448
35
+ glaip_sdk/cli/slash/remote_runs_controller.py,sha256=Ok6CezIeF1CPGQ8-QN3TRx5kGGEACOrgyPwH_BRRCyI,21354
36
+ glaip_sdk/cli/slash/session.py,sha256=GvdpLri_TzuaWDEWHdfAIbdOjMf7MUGewxpEtW_5hPk,57642
34
37
  glaip_sdk/cli/slash/tui/__init__.py,sha256=ljBAeAFY2qNDkbJrZh5NgXxjwUlsv9-UxgKNIv0AF1Q,274
35
- glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=MRAY8AeUML8dUaC9eHyDK1gwEa6H12bI1XgcO8w21MI,24763
38
+ glaip_sdk/cli/slash/tui/remote_runs_app.py,sha256=YAtBtgjtzIy5y2NVOQexZX783DJpqFUkwAVYkVn1tSo,24762
36
39
  glaip_sdk/cli/transcript/__init__.py,sha256=yiYHyNtebMCu3BXu56Xm5RBC2tDc865q8UGPnoe6QRs,920
37
40
  glaip_sdk/cli/transcript/cache.py,sha256=Wi1uln6HP1U6F-MRTrfnxi9bn6XJTxwWXhREIRPoMqQ,17439
38
- glaip_sdk/cli/transcript/capture.py,sha256=5Zmg0HXPs01-M8v37pNl_JmdMR6WGk7NxIvXVq-bFaI,10343
41
+ glaip_sdk/cli/transcript/capture.py,sha256=t8j_62cC6rhb51oCluZd17N04vcXqyjkhPRcRd3ZcmM,10291
39
42
  glaip_sdk/cli/transcript/export.py,sha256=reCvrZVzli8_LzYe5ZNdaa-MwZ1ov2RjnDzKZWr_6-E,1117
40
43
  glaip_sdk/cli/transcript/history.py,sha256=2FBjawxP8CX9gRPMUMP8bDjG50BGM2j2zk6IfHvAMH4,26211
41
44
  glaip_sdk/cli/transcript/launcher.py,sha256=z5ivkPXDQJpATIqtRLUK8jH3p3WIZ72PvOPqYRDMJvw,2327
42
45
  glaip_sdk/cli/transcript/viewer.py,sha256=ar1SzRkhKIf3_DgFz1EG1RZGDmd2w2wogAe038DLL_M,13037
43
46
  glaip_sdk/cli/update_notifier.py,sha256=qv-GfwTYZdrhlSbC_71I1AvKY9cV4QVBmtees16S2Xg,9807
44
- glaip_sdk/cli/utils.py,sha256=rrkASWWpJMKrPPgV8UjrZdE3tsyH2rrCDQsyE0KBu6Y,53342
47
+ glaip_sdk/cli/utils.py,sha256=iPtt4xAqtCW-dwQ-JWVwoPVPAm-P1R8C-1kih6ZIYXU,57255
45
48
  glaip_sdk/cli/validators.py,sha256=d-kq4y7HWMo6Gc7wLXWUsCt8JwFvJX_roZqRm1Nko1I,5622
46
49
  glaip_sdk/client/__init__.py,sha256=F-eE_dRSzA0cc1it06oi0tZetZBHmSUjWSHGhJMLCls,263
47
50
  glaip_sdk/client/_agent_payloads.py,sha256=VfBHoijuoqUOixGBf2SA2vlQIXQmBsjB3sXHZhXYiec,17681
@@ -104,7 +107,7 @@ glaip_sdk/utils/resource_refs.py,sha256=vF34kyAtFBLnaKnQVrsr2st1JiSxVbIZ4yq0DelJ
104
107
  glaip_sdk/utils/run_renderer.py,sha256=d_VMI6LbvHPUUeRmGqh5wK_lHqDEIAcym2iqpbtDad0,1365
105
108
  glaip_sdk/utils/serialization.py,sha256=z-qpvWLSBrGK3wbUclcA1UIKLXJedTnMSwPdq-FF4lo,13308
106
109
  glaip_sdk/utils/validation.py,sha256=Vt8oSnn7OM6ns5vjOl5FwGIMWBPb0yI6RD5XL_L5_4M,6826
107
- glaip_sdk-0.4.0.dist-info/METADATA,sha256=3-W1vIpTHWJPyrCo9XrN1V-XSv_1cJRkctTVpIQiNdU,7053
108
- glaip_sdk-0.4.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
109
- glaip_sdk-0.4.0.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
110
- glaip_sdk-0.4.0.dist-info/RECORD,,
110
+ glaip_sdk-0.5.1.dist-info/METADATA,sha256=jxEyfPZqz2g7nLHnFidlNnMPkljgrLyKVYk3qVnThLE,7053
111
+ glaip_sdk-0.5.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
112
+ glaip_sdk-0.5.1.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
113
+ glaip_sdk-0.5.1.dist-info/RECORD,,