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/account_store.py +522 -0
- glaip_sdk/cli/auth.py +251 -13
- glaip_sdk/cli/commands/accounts.py +414 -0
- glaip_sdk/cli/commands/agents.py +8 -3
- glaip_sdk/cli/commands/common_config.py +65 -0
- glaip_sdk/cli/commands/configure.py +153 -88
- glaip_sdk/cli/commands/transcripts.py +1 -1
- glaip_sdk/cli/config.py +31 -3
- glaip_sdk/cli/display.py +1 -1
- glaip_sdk/cli/hints.py +0 -1
- glaip_sdk/cli/main.py +180 -79
- glaip_sdk/cli/masking.py +14 -1
- glaip_sdk/cli/slash/agent_session.py +1 -1
- glaip_sdk/cli/slash/remote_runs_controller.py +1 -1
- glaip_sdk/cli/slash/session.py +11 -9
- glaip_sdk/cli/slash/tui/remote_runs_app.py +2 -3
- glaip_sdk/cli/transcript/capture.py +11 -17
- glaip_sdk/cli/utils.py +185 -76
- {glaip_sdk-0.4.0.dist-info → glaip_sdk-0.5.1.dist-info}/METADATA +1 -1
- {glaip_sdk-0.4.0.dist-info → glaip_sdk-0.5.1.dist-info}/RECORD +22 -19
- {glaip_sdk-0.4.0.dist-info → glaip_sdk-0.5.1.dist-info}/WHEEL +0 -0
- {glaip_sdk-0.4.0.dist-info → glaip_sdk-0.5.1.dist-info}/entry_points.txt +0 -0
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
|
|
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
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
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
|
|
579
|
-
configure_hint = command_hint("
|
|
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
|
-
|
|
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=
|
|
588
|
-
api_key=
|
|
589
|
-
timeout=float(
|
|
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
|
|
797
|
-
|
|
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
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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
|
-
|
|
828
|
-
|
|
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
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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
|
-
|
|
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
|
|
866
|
-
"""
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
"""
|
|
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(
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
@@ -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=
|
|
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/
|
|
9
|
-
glaip_sdk/cli/commands/
|
|
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=
|
|
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=
|
|
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=
|
|
19
|
-
glaip_sdk/cli/hints.py,sha256=
|
|
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=
|
|
22
|
-
glaip_sdk/cli/masking.py,sha256=
|
|
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=
|
|
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=
|
|
33
|
-
glaip_sdk/cli/slash/session.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
108
|
-
glaip_sdk-0.
|
|
109
|
-
glaip_sdk-0.
|
|
110
|
-
glaip_sdk-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|