glaip-sdk 0.0.19__py3-none-any.whl → 0.0.20__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. glaip_sdk/_version.py +2 -2
  2. glaip_sdk/branding.py +27 -2
  3. glaip_sdk/cli/auth.py +93 -28
  4. glaip_sdk/cli/commands/__init__.py +2 -2
  5. glaip_sdk/cli/commands/agents.py +108 -21
  6. glaip_sdk/cli/commands/configure.py +141 -90
  7. glaip_sdk/cli/commands/mcps.py +81 -29
  8. glaip_sdk/cli/commands/models.py +4 -3
  9. glaip_sdk/cli/commands/tools.py +27 -14
  10. glaip_sdk/cli/commands/update.py +66 -0
  11. glaip_sdk/cli/config.py +13 -2
  12. glaip_sdk/cli/display.py +35 -26
  13. glaip_sdk/cli/io.py +14 -5
  14. glaip_sdk/cli/main.py +185 -73
  15. glaip_sdk/cli/pager.py +2 -1
  16. glaip_sdk/cli/resolution.py +4 -1
  17. glaip_sdk/cli/slash/__init__.py +3 -4
  18. glaip_sdk/cli/slash/agent_session.py +88 -36
  19. glaip_sdk/cli/slash/prompt.py +20 -48
  20. glaip_sdk/cli/slash/session.py +440 -189
  21. glaip_sdk/cli/transcript/__init__.py +71 -0
  22. glaip_sdk/cli/transcript/cache.py +338 -0
  23. glaip_sdk/cli/transcript/capture.py +278 -0
  24. glaip_sdk/cli/transcript/export.py +38 -0
  25. glaip_sdk/cli/transcript/launcher.py +79 -0
  26. glaip_sdk/cli/transcript/viewer.py +624 -0
  27. glaip_sdk/cli/update_notifier.py +29 -5
  28. glaip_sdk/cli/utils.py +256 -74
  29. glaip_sdk/client/agents.py +3 -1
  30. glaip_sdk/client/run_rendering.py +2 -2
  31. glaip_sdk/icons.py +19 -0
  32. glaip_sdk/models.py +6 -0
  33. glaip_sdk/rich_components.py +29 -1
  34. glaip_sdk/utils/__init__.py +1 -1
  35. glaip_sdk/utils/client_utils.py +6 -4
  36. glaip_sdk/utils/display.py +61 -32
  37. glaip_sdk/utils/rendering/formatting.py +6 -5
  38. glaip_sdk/utils/rendering/renderer/base.py +213 -66
  39. glaip_sdk/utils/rendering/renderer/debug.py +73 -16
  40. glaip_sdk/utils/rendering/renderer/panels.py +27 -15
  41. glaip_sdk/utils/rendering/renderer/progress.py +61 -38
  42. glaip_sdk/utils/serialization.py +5 -2
  43. glaip_sdk/utils/validation.py +1 -2
  44. {glaip_sdk-0.0.19.dist-info → glaip_sdk-0.0.20.dist-info}/METADATA +1 -1
  45. glaip_sdk-0.0.20.dist-info/RECORD +80 -0
  46. glaip_sdk/utils/rich_utils.py +0 -29
  47. glaip_sdk-0.0.19.dist-info/RECORD +0 -73
  48. {glaip_sdk-0.0.19.dist-info → glaip_sdk-0.0.20.dist-info}/WHEEL +0 -0
  49. {glaip_sdk-0.0.19.dist-info → glaip_sdk-0.0.20.dist-info}/entry_points.txt +0 -0
@@ -5,25 +5,76 @@ Authors:
5
5
  """
6
6
 
7
7
  import json
8
- from datetime import datetime
9
- from time import monotonic
8
+ from datetime import datetime, timezone
10
9
  from typing import Any
11
10
 
12
11
  from rich.console import Console
13
12
  from rich.markdown import Markdown
14
13
 
14
+ from glaip_sdk.branding import PRIMARY, SUCCESS, WARNING
15
15
  from glaip_sdk.rich_components import AIPPanel
16
16
 
17
17
 
18
- def _calculate_relative_time(started_ts: float | None) -> tuple[float, str]:
19
- """Calculate relative time since start."""
20
- now_mono = monotonic()
18
+ def _coerce_datetime(value: Any) -> datetime | None:
19
+ """Attempt to coerce an arbitrary value to an aware datetime."""
20
+ if value is None:
21
+ return None
22
+
23
+ if isinstance(value, datetime):
24
+ return value if value.tzinfo else value.replace(tzinfo=timezone.utc)
25
+
26
+ if isinstance(value, str):
27
+ try:
28
+ normalised = value.replace("Z", "+00:00")
29
+ dt = datetime.fromisoformat(normalised)
30
+ except ValueError:
31
+ return None
32
+ return dt if dt.tzinfo else dt.replace(tzinfo=timezone.utc)
33
+
34
+ return None
35
+
36
+
37
+ def _parse_event_timestamp(
38
+ event: dict[str, Any], received_ts: datetime | None = None
39
+ ) -> datetime | None:
40
+ """Resolve the most accurate timestamp available for the event."""
41
+ if received_ts is not None:
42
+ return (
43
+ received_ts
44
+ if received_ts.tzinfo
45
+ else received_ts.replace(tzinfo=timezone.utc)
46
+ )
47
+
48
+ ts_value = event.get("timestamp") or (event.get("metadata") or {}).get("timestamp")
49
+ return _coerce_datetime(ts_value)
50
+
51
+
52
+ def _format_timestamp_for_display(dt: datetime) -> str:
53
+ """Format timestamp for panel title, including timezone offset."""
54
+ local_dt = dt.astimezone()
55
+ ts_ms = local_dt.strftime("%H:%M:%S.%f")[:-3]
56
+ offset = local_dt.strftime("%z")
57
+ # offset is always non-empty for timezone-aware datetimes
58
+ offset = f"{offset[:3]}:{offset[3:]}"
59
+ return f"{ts_ms} {offset}"
60
+
61
+
62
+ def _calculate_relative_time(
63
+ event_ts: datetime | None,
64
+ baseline_ts: datetime | None,
65
+ ) -> tuple[float, str]:
66
+ """Calculate relative time since start and format event timestamp."""
21
67
  rel = 0.0
22
- if started_ts is not None:
23
- rel = max(0.0, now_mono - started_ts)
24
68
 
25
- ts_full = datetime.now().strftime("%H:%M:%S.%f")
26
- ts_ms = ts_full[:-3] # trim to milliseconds
69
+ # Determine display timestamp - use event timestamp when present, otherwise current time
70
+ display_ts: datetime | None = event_ts
71
+ if display_ts is None:
72
+ display_ts = datetime.now(timezone.utc)
73
+
74
+ if event_ts is not None and baseline_ts is not None:
75
+ rel = max(0.0, (event_ts - baseline_ts).total_seconds())
76
+
77
+ ts_ms = _format_timestamp_for_display(display_ts)
27
78
 
28
79
  return rel, ts_ms
29
80
 
@@ -75,10 +126,10 @@ def _format_event_json(event: dict[str, Any]) -> str:
75
126
  def _get_border_color(sse_kind: str) -> str:
76
127
  """Get border color for event type."""
77
128
  border_map = {
78
- "agent_step": "blue",
79
- "content": "green",
80
- "final_response": "green",
81
- "status": "yellow",
129
+ "agent_step": PRIMARY,
130
+ "content": SUCCESS,
131
+ "final_response": SUCCESS,
132
+ "status": WARNING,
82
133
  "artifact": "grey42",
83
134
  }
84
135
  return border_map.get(sse_kind, "grey42")
@@ -91,18 +142,24 @@ def _create_debug_panel(title: str, event_json: str, border: str) -> AIPPanel:
91
142
 
92
143
 
93
144
  def render_debug_event(
94
- event: dict[str, Any], console: Console, started_ts: float | None = None
145
+ event: dict[str, Any],
146
+ console: Console,
147
+ *,
148
+ received_ts: datetime | None = None,
149
+ baseline_ts: datetime | None = None,
95
150
  ) -> None:
96
151
  """Render a debug panel for an SSE event.
97
152
 
98
153
  Args:
99
154
  event: The SSE event data
100
155
  console: Rich console to print to
101
- started_ts: Monotonic timestamp when streaming started
156
+ received_ts: Client-side receipt timestamp, if available
157
+ baseline_ts: Baseline event timestamp for elapsed timing
102
158
  """
103
159
  try:
104
160
  # Calculate timing information
105
- rel, ts_ms = _calculate_relative_time(started_ts)
161
+ event_ts = _parse_event_timestamp(event, received_ts)
162
+ rel, ts_ms = _calculate_relative_time(event_ts, baseline_ts)
106
163
 
107
164
  # Extract event metadata
108
165
  sse_kind, status_str = _get_event_metadata(event)
@@ -11,6 +11,7 @@ from rich.markdown import Markdown
11
11
  from rich.spinner import Spinner
12
12
  from rich.text import Text
13
13
 
14
+ from glaip_sdk.branding import INFO, PRIMARY, SUCCESS, WARNING
14
15
  from glaip_sdk.rich_components import AIPPanel
15
16
 
16
17
 
@@ -19,7 +20,7 @@ def _spinner_renderable(message: str = "Processing...") -> Align:
19
20
  spinner = Spinner(
20
21
  "dots",
21
22
  text=Text(f" {message}", style="dim"),
22
- style="cyan",
23
+ style=INFO,
23
24
  )
24
25
  return Align.left(spinner)
25
26
 
@@ -39,13 +40,13 @@ def create_main_panel(content: str, title: str, theme: str = "dark") -> AIPPanel
39
40
  return AIPPanel(
40
41
  Markdown(content, code_theme=("monokai" if theme == "dark" else "github")),
41
42
  title=title,
42
- border_style="green",
43
+ border_style=SUCCESS,
43
44
  )
44
45
  else:
45
46
  return AIPPanel(
46
47
  _spinner_renderable(),
47
48
  title=title,
48
- border_style="green",
49
+ border_style=SUCCESS,
49
50
  )
50
51
 
51
52
 
@@ -55,6 +56,8 @@ def create_tool_panel(
55
56
  status: str = "running",
56
57
  theme: str = "dark",
57
58
  is_delegation: bool = False,
59
+ *,
60
+ spinner_message: str | None = None,
58
61
  ) -> AIPPanel:
59
62
  """Create a tool execution panel.
60
63
 
@@ -64,22 +67,29 @@ def create_tool_panel(
64
67
  status: Tool execution status
65
68
  theme: Color theme
66
69
  is_delegation: Whether this is a delegation tool
70
+ spinner_message: Optional custom message to show alongside the spinner
67
71
 
68
72
  Returns:
69
73
  Rich Panel instance
70
74
  """
71
- mark = "✓" if status == "finished" else ""
72
- border_style = "magenta" if is_delegation else "blue"
75
+ mark = "✓" if status == "finished" else ""
76
+ border_style = WARNING if is_delegation else PRIMARY
73
77
 
74
- body_renderable = (
75
- Markdown(content, code_theme=("monokai" if theme == "dark" else "github"))
76
- if content
77
- else _spinner_renderable()
78
- )
78
+ if content:
79
+ body_renderable = Markdown(
80
+ content,
81
+ code_theme=("monokai" if theme == "dark" else "github"),
82
+ )
83
+ elif status == "running":
84
+ body_renderable = _spinner_renderable(spinner_message or f"{title} running...")
85
+ else:
86
+ body_renderable = Text("No output yet.", style="dim")
87
+
88
+ title_text = f"{title} {mark}".rstrip()
79
89
 
80
90
  return AIPPanel(
81
91
  body_renderable,
82
- title=f"{title} {mark}",
92
+ title=title_text,
83
93
  border_style=border_style,
84
94
  )
85
95
 
@@ -103,15 +113,17 @@ def create_context_panel(
103
113
  Returns:
104
114
  Rich Panel instance
105
115
  """
106
- mark = "✓" if status == "finished" else ""
107
- border_style = "magenta" if is_delegation else "cyan"
116
+ mark = "✓" if status == "finished" else ""
117
+ border_style = WARNING if is_delegation else INFO
118
+
119
+ title_text = f"{title} {mark}".rstrip()
108
120
 
109
121
  return AIPPanel(
110
122
  Markdown(
111
123
  content,
112
124
  code_theme=("monokai" if theme == "dark" else "github"),
113
125
  ),
114
- title=f"{title} {mark}",
126
+ title=title_text,
115
127
  border_style=border_style,
116
128
  )
117
129
 
@@ -132,6 +144,6 @@ def create_final_panel(
132
144
  return AIPPanel(
133
145
  Markdown(content, code_theme=("monokai" if theme == "dark" else "github")),
134
146
  title=title,
135
- border_style="green",
147
+ border_style=SUCCESS,
136
148
  padding=(0, 1),
137
149
  )
@@ -16,40 +16,52 @@ def get_spinner() -> str:
16
16
  return get_spinner_char()
17
17
 
18
18
 
19
+ def _resolve_elapsed_time(
20
+ started_at: float | None,
21
+ server_elapsed_time: float | None,
22
+ streaming_started_at: float | None,
23
+ ) -> float | None:
24
+ """Return the elapsed seconds using server data when available."""
25
+ if server_elapsed_time is not None and streaming_started_at is not None:
26
+ return server_elapsed_time
27
+ if started_at is None:
28
+ return None
29
+ try:
30
+ return monotonic() - started_at
31
+ except Exception:
32
+ return None
33
+
34
+
35
+ def _format_elapsed_suffix(elapsed: float) -> str:
36
+ """Return formatting suffix for elapsed timing."""
37
+ if elapsed >= 1:
38
+ return f"{elapsed:.2f}s"
39
+ elapsed_ms = int(elapsed * 1000)
40
+ return f"{elapsed_ms}ms" if elapsed_ms > 0 else "<1ms"
41
+
42
+
19
43
  def format_working_indicator(
20
44
  started_at: float | None,
21
45
  server_elapsed_time: float | None = None,
22
46
  streaming_started_at: float | None = None,
23
47
  ) -> str:
24
- """Format a working indicator with elapsed time.
48
+ """Format a working indicator with elapsed time."""
49
+ base_message = "Working..."
25
50
 
26
- Args:
27
- started_at: Timestamp when work started, or None
28
- server_elapsed_time: Server-reported elapsed time if available
29
- streaming_started_at: When streaming started
30
-
31
- Returns:
32
- Formatted working indicator string with elapsed time
33
- """
34
- chip = "Working..."
51
+ if started_at is None and (
52
+ server_elapsed_time is None or streaming_started_at is None
53
+ ):
54
+ return base_message
35
55
 
36
- # Use server timing if available (more accurate)
37
- if server_elapsed_time is not None and streaming_started_at is not None:
38
- elapsed = server_elapsed_time
39
- elif started_at:
40
- try:
41
- elapsed = monotonic() - started_at
42
- except Exception:
43
- return chip
44
- else:
45
- return chip
56
+ spinner_chip = f"{get_spinner_char()} {base_message}"
57
+ elapsed = _resolve_elapsed_time(
58
+ started_at, server_elapsed_time, streaming_started_at
59
+ )
60
+ if elapsed is None:
61
+ return spinner_chip
46
62
 
47
- if elapsed >= 1:
48
- chip = f"Working... ({elapsed:.2f}s)"
49
- else:
50
- elapsed_ms = int(elapsed * 1000)
51
- chip = f"Working... ({elapsed_ms}ms)" if elapsed_ms > 0 else "Working... (<1ms)"
52
- return chip
63
+ suffix = _format_elapsed_suffix(elapsed)
64
+ return f"{spinner_chip} ({suffix})"
53
65
 
54
66
 
55
67
  def format_elapsed_time(elapsed_seconds: float) -> str:
@@ -88,6 +100,24 @@ def is_delegation_tool(tool_name: str) -> bool:
88
100
  )
89
101
 
90
102
 
103
+ def _delegation_tool_title(tool_name: str) -> str | None:
104
+ """Return delegation-aware title or ``None`` when not applicable."""
105
+ if tool_name.startswith("delegate_to_"):
106
+ sub_agent_name = tool_name.replace("delegate_to_", "", 1)
107
+ return f"Sub-Agent: {sub_agent_name}"
108
+ if tool_name.startswith("delegate_"):
109
+ sub_agent_name = tool_name.replace("delegate_", "", 1)
110
+ return f"Sub-Agent: {sub_agent_name}"
111
+ return None
112
+
113
+
114
+ def _strip_path_and_extension(tool_name: str) -> str:
115
+ """Return tool name without path segments or extensions."""
116
+ filename = tool_name.rsplit("/", 1)[-1]
117
+ base_name = filename.split(".", 1)[0]
118
+ return base_name
119
+
120
+
91
121
  def format_tool_title(tool_name: str) -> str:
92
122
  """Format tool name for panel title display.
93
123
 
@@ -99,20 +129,13 @@ def format_tool_title(tool_name: str) -> str:
99
129
  """
100
130
  # Check if this is a delegation tool
101
131
  if is_delegation_tool(tool_name):
102
- # Extract the sub-agent name from delegation tool names
103
- if tool_name.startswith("delegate_to_"):
104
- sub_agent_name = tool_name.replace("delegate_to_", "")
105
- return f"Sub-Agent: {sub_agent_name}"
106
- elif tool_name.startswith("delegate_"):
107
- sub_agent_name = tool_name.replace("delegate_", "")
108
- return f"Sub-Agent: {sub_agent_name}"
132
+ delegation_title = _delegation_tool_title(tool_name)
133
+ if delegation_title:
134
+ return delegation_title
109
135
 
110
136
  # For regular tools, clean up the name
111
137
  # Remove file path prefixes if present
112
- if "/" in tool_name:
113
- tool_name = tool_name.split("/")[-1]
114
- if "." in tool_name:
115
- tool_name = tool_name.split(".")[0]
138
+ clean_name = _strip_path_and_extension(tool_name)
116
139
 
117
140
  # Convert snake_case to Title Case
118
- return tool_name.replace("_", " ").title()
141
+ return clean_name.replace("_", " ").title()
@@ -7,6 +7,7 @@ Authors:
7
7
  Raymond Christopher (raymond.christopher@gdplabs.id)
8
8
  """
9
9
 
10
+ import importlib
10
11
  import json
11
12
  from collections.abc import Callable, Iterable
12
13
  from pathlib import Path
@@ -385,8 +386,10 @@ def build_mcp_export_payload(
385
386
  Raises:
386
387
  ImportError: If required modules (auth helpers) are not available
387
388
  """
388
- # Import here to avoid circular dependency
389
- from glaip_sdk.cli.auth import prepare_authentication_export
389
+ auth_module = importlib.import_module("glaip_sdk.cli.auth")
390
+ prepare_authentication_export = getattr(
391
+ auth_module, "prepare_authentication_export"
392
+ )
390
393
 
391
394
  # Start with model dump (excludes None values automatically)
392
395
  payload = mcp.model_dump(exclude_none=True)
@@ -11,6 +11,7 @@ import re
11
11
  from pathlib import Path
12
12
  from typing import Any
13
13
 
14
+ from glaip_sdk.config.constants import DEFAULT_AGENT_RUN_TIMEOUT
14
15
  from glaip_sdk.utils.resource_refs import validate_name_format
15
16
 
16
17
  # Constants for validation
@@ -142,8 +143,6 @@ def coerce_timeout(value: Any) -> int:
142
143
  coerce_timeout("300") -> 300
143
144
  coerce_timeout(None) -> 300 # Uses DEFAULT_AGENT_RUN_TIMEOUT
144
145
  """
145
- from glaip_sdk.config.constants import DEFAULT_AGENT_RUN_TIMEOUT
146
-
147
146
  if value is None:
148
147
  return DEFAULT_AGENT_RUN_TIMEOUT
149
148
  elif isinstance(value, int):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: glaip-sdk
3
- Version: 0.0.19
3
+ Version: 0.0.20
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
@@ -0,0 +1,80 @@
1
+ glaip_sdk/__init__.py,sha256=-Itm_1dz4QwhIUmqagvCwwvSjKYKYJI3lZSHD2bwtko,366
2
+ glaip_sdk/_version.py,sha256=J-UdD2Nya3c8WAXCrTRY-2bWpKGvTYY_JIaubZ4OoEw,1999
3
+ glaip_sdk/branding.py,sha256=BvLcD-z1D8CnYhNSGs0B1LeIrXgG1bHJ-fr4AInNhwE,7356
4
+ glaip_sdk/cli/__init__.py,sha256=xCCfuF1Yc7mpCDcfhHZTX0vizvtrDSLeT8MJ3V7m5A0,156
5
+ glaip_sdk/cli/agent_config.py,sha256=VHjebw68wAdhGUzYdPH8qz10oADZPRgUQcPW6F7iHIU,2421
6
+ glaip_sdk/cli/auth.py,sha256=eMqMXss3v36yyimSgm4PN8uG85UvIFn1U_XOXUvcZmI,16026
7
+ glaip_sdk/cli/commands/__init__.py,sha256=N2go38u3C0MPxfDXk-K2zz93OnqSTpQyOE6dIC82lHg,191
8
+ glaip_sdk/cli/commands/agents.py,sha256=3v9oHuPaIXFGRuoJ5jt-_hL_U8BDg4vBO2C87s7qLK8,43770
9
+ glaip_sdk/cli/commands/configure.py,sha256=xpryuPXzuwfCKyolxRqh-WpzxIv7sBVp7ZUjlnNrkcQ,9338
10
+ glaip_sdk/cli/commands/mcps.py,sha256=miZgPIyqHEgFDGcvEVr53MHODABO4UuLJyqyNytz_1g,37855
11
+ glaip_sdk/cli/commands/models.py,sha256=EUC-_3QPAjtqId4WobWbQZVPjgQ9Eo_srcGIRlhhPq8,1790
12
+ glaip_sdk/cli/commands/tools.py,sha256=rWWgzyfLp_WOMYxU1XluombLkRzWQH8WrohlWc75piU,19212
13
+ glaip_sdk/cli/commands/update.py,sha256=nV0C08bHDYn5byFP_N8rzdKbDc5_tDKXC19L_HftJX8,1869
14
+ glaip_sdk/cli/config.py,sha256=vCanx4Pv_juPX4W9O-SL658-Bq49MqyCsawPtKscpJU,1313
15
+ glaip_sdk/cli/context.py,sha256=M4weRf8dmp5bMtPLRF3w1StnRB7Lo8FPFq2GQMv3Rv8,3617
16
+ glaip_sdk/cli/display.py,sha256=0iysRFznPpkShRHp6MEc0Obao14D9k_Tx1lKoraF5f4,11273
17
+ glaip_sdk/cli/io.py,sha256=V8tIo0rc6t0CHGPM3cwhmlZAvzh4UPnlemUsrSFFtg8,3675
18
+ glaip_sdk/cli/main.py,sha256=O1q9h0LRAVxW8cwsAEXEGy6NDCchVZQHe3OXGNAGS8M,17305
19
+ glaip_sdk/cli/masking.py,sha256=BOZjwUqxQf3LQlYgUMwq7UYgve8x4_1Qk04ixiJJPZ8,4399
20
+ glaip_sdk/cli/mcp_validators.py,sha256=SeDbgXkRuBXyDtCmUMpL-1Vh7fmGldz-shAaHhOqbCc,10125
21
+ glaip_sdk/cli/pager.py,sha256=HZpdmgKjj367k0aZXXO9hyo38qyvWl0fUCD_VSeqJfs,8083
22
+ glaip_sdk/cli/parsers/__init__.py,sha256=Ycd4HDfYmA7GUGFt0ndBPBo5uTbv15XsXnYUj-a89ug,183
23
+ glaip_sdk/cli/parsers/json_input.py,sha256=ZBhJNUR4bKDX3A5s9lRvuCicaztvQyP0lWuiNYMIO08,5721
24
+ glaip_sdk/cli/resolution.py,sha256=cRkz5u8TNzjD4ybOywtisUXPKV0V-jXqKB68nRUF3O4,2465
25
+ glaip_sdk/cli/rich_helpers.py,sha256=ByUOmK16IisoXWE7nEiI55BF1KWDrm6KCYAxqHu0XOU,825
26
+ glaip_sdk/cli/slash/__init__.py,sha256=3kAXgOAnXmWkDheNtRuWqCooyIDaNYZMLTrbdhMGz9w,738
27
+ glaip_sdk/cli/slash/agent_session.py,sha256=Q1WUOthWMc6PglFwN_LCg60Yi51nvzPdjVdeumo_I8Y,9491
28
+ glaip_sdk/cli/slash/prompt.py,sha256=JBwRvIJgK0MR2Wx0wt7XAqAKpVL2Etp28ifwtklIM9M,7669
29
+ glaip_sdk/cli/slash/session.py,sha256=OE7WNJzN-jJIlIa_ljyJ6XwdEWIzaoCun0RAJFOhW2s,41577
30
+ glaip_sdk/cli/transcript/__init__.py,sha256=zQNgAETJsj2tO3OmuINgXiCQCmh_ODzI6HQPPmxMXVs,1816
31
+ glaip_sdk/cli/transcript/cache.py,sha256=_YGv2M-tZASljGrzbJCgiV59KmIf0w-r6Qq0bqtkZqc,9860
32
+ glaip_sdk/cli/transcript/capture.py,sha256=EtSac3BBYGvcZTyCe9orPvKOZKZ8ooGBOlpKlmxAg_o,8325
33
+ glaip_sdk/cli/transcript/export.py,sha256=reCvrZVzli8_LzYe5ZNdaa-MwZ1ov2RjnDzKZWr_6-E,1117
34
+ glaip_sdk/cli/transcript/launcher.py,sha256=OBaTBcNywy8NbwfdYD4IIOlksXbLT_K3poGJDP6bNyE,2333
35
+ glaip_sdk/cli/transcript/viewer.py,sha256=9fpxCpHdFUtj6ct5GjDCIg1b5LDogS9QI6_rnKzjpoM,21405
36
+ glaip_sdk/cli/update_notifier.py,sha256=Zy4VJVGI4rfYFnMQ3J2IwXLKhDZ95ODSTXgfg7gdrxU,4175
37
+ glaip_sdk/cli/utils.py,sha256=SoJlnmu3xgGoGGmY9pTDp6Eei31qSzgpSTDJh1WZ-nY,41050
38
+ glaip_sdk/cli/validators.py,sha256=USbBgY86AwuDHO-Q_g8g7hu-ot4NgITBsWjTWIl62ms,5569
39
+ glaip_sdk/client/__init__.py,sha256=nYLXfBVTTWwKjP0e63iumPYO4k5FifwWaELQPaPIKIg,188
40
+ glaip_sdk/client/_agent_payloads.py,sha256=sYlMzrfAdd8KC37qxokLy2uDd3aOhzQirnv7UYlvwYc,16385
41
+ glaip_sdk/client/agents.py,sha256=nGXYIAkz3jDL2glNyoROGjiAUpLwXdeqYrnc4Qxl8o0,37628
42
+ glaip_sdk/client/base.py,sha256=OPRlAWhZ77rUK0MRGA83-zW5NVhxJ1RgdfcfGOYr8rI,16267
43
+ glaip_sdk/client/main.py,sha256=tELAA36rzthnNKTgwZ6lLPb3Au8Wh1mF8Kz-9N-YtCg,8652
44
+ glaip_sdk/client/mcps.py,sha256=-O-I15qjbwfSA69mouHY6g5_qgPWC4rM98VJLpOkh1A,8975
45
+ glaip_sdk/client/run_rendering.py,sha256=WCAkVfj7FzZluBSSspWgSg37uj8tVljGjzaSy1l3Hs8,9184
46
+ glaip_sdk/client/tools.py,sha256=rWxfNO30sS468513IoE5PfEaqNq6HBwmcHVh4FzhvYQ,17532
47
+ glaip_sdk/client/validators.py,sha256=NtPsWjQLjj25LiUnmR-WuS8lL5p4MVRaYT9UVRmj9bo,8809
48
+ glaip_sdk/config/constants.py,sha256=B9CSlYG8LYjQuo_vNpqy-eSks3ej37FMcvJMy6d_F4U,888
49
+ glaip_sdk/exceptions.py,sha256=ILquxC4QGPFR9eY6RpeXzkQsblfsvZMGFqz38ZjeW3E,2345
50
+ glaip_sdk/icons.py,sha256=G45gnd9XA68JCi6S9e37CFxJD5sl6UeCy135JlRAU2k,358
51
+ glaip_sdk/models.py,sha256=uXWsC5VdXSxPci8GRYOofZrIdsFgradayrIzJyhc7u8,9188
52
+ glaip_sdk/payload_schemas/__init__.py,sha256=fJamlkpS3IfS9xyKAQaUbnalvrtG5Ied69OUVAA3xvs,395
53
+ glaip_sdk/payload_schemas/agent.py,sha256=nlizuv2w4SVzmMJSE90rE6Ll0Hfpcr5hvPsW_NtXCV0,3204
54
+ glaip_sdk/rich_components.py,sha256=rU3CD55WZlwjY81usctfX-S0bmsQ2Yd4nWEXhueGv7U,2090
55
+ glaip_sdk/utils/__init__.py,sha256=HLL4AX31lWo9gJn1dL1S-IPs2q4yPxqeHVCLJfSYyx4,892
56
+ glaip_sdk/utils/agent_config.py,sha256=p3uK5qC0M5uQv9uY7-U8ej11Vh81fwKAPSsYcRoNdlk,7342
57
+ glaip_sdk/utils/client_utils.py,sha256=OATfWztkcGlGNnrrLdM7C5eyCT7EoBD4xCLrl4rdo2w,13976
58
+ glaip_sdk/utils/display.py,sha256=afHuUUKs6eQrCMh16r88kNufbEtOH6WQLT9yatPP610,4027
59
+ glaip_sdk/utils/general.py,sha256=V5hJrIpYDvDsldU_nChHpuvV2AwhFLUI7Qvcaihq_8A,2270
60
+ glaip_sdk/utils/import_export.py,sha256=jEhl5U6hWWMR1wo5AXpV-_jN_56DcWcemOa2UaFHapk,5217
61
+ glaip_sdk/utils/rendering/__init__.py,sha256=vXjwk5rPhhfPyD8S0DnV4GFFEtPJp4HCCg1Um9SXfs0,70
62
+ glaip_sdk/utils/rendering/formatting.py,sha256=NY4aYkCyhn38kbbTHtxizNHxAYMRkaxqIrPeVzRgYhM,7785
63
+ glaip_sdk/utils/rendering/models.py,sha256=AM9JbToyA3zrAzXQYjh6oxjBkgZDfWEbs5MmNKODnOY,2259
64
+ glaip_sdk/utils/rendering/renderer/__init__.py,sha256=EXwVBmGkSYcype4ocAXo69Z1kXu0gpNXmhH5LW0_B7A,2939
65
+ glaip_sdk/utils/rendering/renderer/base.py,sha256=YgVb4vTzmrLKfvaM2TBHGS-xVDgO9JbnWDADHfZ4OAo,50650
66
+ glaip_sdk/utils/rendering/renderer/config.py,sha256=-P35z9JO_1ypJXAqxJ1ybHraH4i-I1LPopeW3Lh7ACE,785
67
+ glaip_sdk/utils/rendering/renderer/console.py,sha256=4cLOw4Q1fkHkApuj6dWW8eYpeYdcT0t2SO5MbVt5UTc,1844
68
+ glaip_sdk/utils/rendering/renderer/debug.py,sha256=uVaBs33mfXo44lWm4Fi5LXcrlfVmT1_Kp_IXf09RzfI,5651
69
+ glaip_sdk/utils/rendering/renderer/panels.py,sha256=Bv_dpUKiKlL6r0_aZ2okY7Ov7pp5-MxFjjftTWG71L4,3790
70
+ glaip_sdk/utils/rendering/renderer/progress.py,sha256=RnnAnw5rFd24Ij0U8Qm2oFHud8mmzDQ9Fwg3QFrRJNg,4128
71
+ glaip_sdk/utils/rendering/renderer/stream.py,sha256=1RP5TIV7tqg07X9gPN053XeabFGVT4jPplxaoPU0L38,8601
72
+ glaip_sdk/utils/rendering/steps.py,sha256=V7xFoJM_B-nWT1wMdcXGN5ytCrDTxEzKcX_YCWyJqkk,9051
73
+ glaip_sdk/utils/resource_refs.py,sha256=0YzblJNfRhz9xhpaKE9aE68XEV-6_ssr0fIkiMVOka0,5489
74
+ glaip_sdk/utils/run_renderer.py,sha256=d_VMI6LbvHPUUeRmGqh5wK_lHqDEIAcym2iqpbtDad0,1365
75
+ glaip_sdk/utils/serialization.py,sha256=3Bwxw2M0qR59Rx0GS0hrnWZz46Ht-gpda9dva07Pr_A,12893
76
+ glaip_sdk/utils/validation.py,sha256=6jv1fExRllOK6sIvU7YX3a-Sf0AlFHar4KYiTC0Pzs4,6987
77
+ glaip_sdk-0.0.20.dist-info/METADATA,sha256=57YytJ1dpdDIwZ6j8Yq481HEfGoY6P6J1OrMrERY20w,5164
78
+ glaip_sdk-0.0.20.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
79
+ glaip_sdk-0.0.20.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
80
+ glaip_sdk-0.0.20.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- """Rich utility functions and availability checking.
2
-
3
- Authors:
4
- Raymond Christopher (raymond.christopher@gdplabs.id)
5
- """
6
-
7
-
8
- def _check_rich_available() -> bool:
9
- """Check if Rich is available by attempting imports."""
10
- try:
11
- import importlib.util
12
-
13
- # Check if rich modules are available without importing them
14
- if (
15
- importlib.util.find_spec("rich.console") is None
16
- or importlib.util.find_spec("rich.text") is None
17
- ):
18
- return False
19
-
20
- # Check if our rich components are available
21
- if importlib.util.find_spec("glaip_sdk.rich_components") is None:
22
- return False
23
-
24
- return True
25
- except Exception:
26
- return False
27
-
28
-
29
- RICH_AVAILABLE = _check_rich_available()
@@ -1,73 +0,0 @@
1
- glaip_sdk/__init__.py,sha256=-Itm_1dz4QwhIUmqagvCwwvSjKYKYJI3lZSHD2bwtko,366
2
- glaip_sdk/_version.py,sha256=tGkFWAVu2ry4Hy7j-u7ophGbPRX8y-ngBbXDhN1VBIQ,2007
3
- glaip_sdk/branding.py,sha256=RwXVIc_gMDayKsNN4HBqo8c1fodTMvGFNhPnEZxpRIQ,6410
4
- glaip_sdk/cli/__init__.py,sha256=xCCfuF1Yc7mpCDcfhHZTX0vizvtrDSLeT8MJ3V7m5A0,156
5
- glaip_sdk/cli/agent_config.py,sha256=VHjebw68wAdhGUzYdPH8qz10oADZPRgUQcPW6F7iHIU,2421
6
- glaip_sdk/cli/auth.py,sha256=eYdtGmJ3XgiO96hq_69GF6b3W-aRWZrDQ-6bHuaRX4M,13517
7
- glaip_sdk/cli/commands/__init__.py,sha256=x0CZlZbZHoHvuzfoTWIyEch6WmNnbPzxajrox6riYp0,173
8
- glaip_sdk/cli/commands/agents.py,sha256=FtWGhbl4QRlqxXFNMEnZUpw5mjQ0KPjY0_6o0hYyoaU,41251
9
- glaip_sdk/cli/commands/configure.py,sha256=h2GgBpnBWYHAhp3zqkAiy8QNgwPD_7pToZBZRpuMoNM,7869
10
- glaip_sdk/cli/commands/mcps.py,sha256=wqUbkQ6qUUhr6B0n2jJxPUkbxHwfsEnYvdLKew_qorM,36800
11
- glaip_sdk/cli/commands/models.py,sha256=G1ce-wZOfvMP6SMnIVuSQ89CF444Kz8Ja6nrNOQXCqU,1729
12
- glaip_sdk/cli/commands/tools.py,sha256=YfkB7HRBGcAOC6N-wXTV5Ch5XTXqjKTtyq-Cfb0-18c,18908
13
- glaip_sdk/cli/config.py,sha256=jCLJxTBAnOU6EJI6JjcpwUTEAWCJRoALbMrhOvvAofc,946
14
- glaip_sdk/cli/context.py,sha256=M4weRf8dmp5bMtPLRF3w1StnRB7Lo8FPFq2GQMv3Rv8,3617
15
- glaip_sdk/cli/display.py,sha256=fNb2aBEV4V76TaRQ-L6EO-1fwq71VlzekDzZRTYKEPA,10758
16
- glaip_sdk/cli/io.py,sha256=GPkw3pQMLBGoD5GH-KlbKpNRlVWFZOXHE17F7V3kQsI,3343
17
- glaip_sdk/cli/main.py,sha256=gIF4b2mtLrWktsVdYcoHO91S07twtfn1w4D4RCqAMfc,13499
18
- glaip_sdk/cli/masking.py,sha256=BOZjwUqxQf3LQlYgUMwq7UYgve8x4_1Qk04ixiJJPZ8,4399
19
- glaip_sdk/cli/mcp_validators.py,sha256=SeDbgXkRuBXyDtCmUMpL-1Vh7fmGldz-shAaHhOqbCc,10125
20
- glaip_sdk/cli/pager.py,sha256=n9ypOGPPSaseJlwPG1X38qSz1yV3pjRWunzA4xx5E7M,8052
21
- glaip_sdk/cli/parsers/__init__.py,sha256=Ycd4HDfYmA7GUGFt0ndBPBo5uTbv15XsXnYUj-a89ug,183
22
- glaip_sdk/cli/parsers/json_input.py,sha256=ZBhJNUR4bKDX3A5s9lRvuCicaztvQyP0lWuiNYMIO08,5721
23
- glaip_sdk/cli/resolution.py,sha256=jXUNpKKhs30n7Ke0uz1Hbny5DTo2_sxvchIhTbeBubE,2393
24
- glaip_sdk/cli/rich_helpers.py,sha256=ByUOmK16IisoXWE7nEiI55BF1KWDrm6KCYAxqHu0XOU,825
25
- glaip_sdk/cli/slash/__init__.py,sha256=Vdv6Y8bu-pA8dxDlyP4XrhudBPivztUozhLAz9vaLig,682
26
- glaip_sdk/cli/slash/agent_session.py,sha256=-woZkqH70YUSaEHDF9XpxP-cbh36Jx7yuJW7aA3JszI,7078
27
- glaip_sdk/cli/slash/prompt.py,sha256=Cfd6nL1T-F51WNuRCO09RxXfuJn0I1OyBi5dx3xKtaY,8407
28
- glaip_sdk/cli/slash/session.py,sha256=WZKAwkio1DMK72r6myR8Ou7weIS5JsQutbtVMox7ctc,32515
29
- glaip_sdk/cli/update_notifier.py,sha256=nfQ-jRQKn-nZyt7EhxNfZq9Z7nBrYjZJKAgAtuHffnw,3410
30
- glaip_sdk/cli/utils.py,sha256=pgbV0f5rdjAHeZ-ULCntH7HUG6FdFB9kODv0a9puB40,35503
31
- glaip_sdk/cli/validators.py,sha256=USbBgY86AwuDHO-Q_g8g7hu-ot4NgITBsWjTWIl62ms,5569
32
- glaip_sdk/client/__init__.py,sha256=nYLXfBVTTWwKjP0e63iumPYO4k5FifwWaELQPaPIKIg,188
33
- glaip_sdk/client/_agent_payloads.py,sha256=sYlMzrfAdd8KC37qxokLy2uDd3aOhzQirnv7UYlvwYc,16385
34
- glaip_sdk/client/agents.py,sha256=-ORfxYaoX6JkgGS9B7ZCQmr1o9H5KEr0GesbfeiSros,37594
35
- glaip_sdk/client/base.py,sha256=OPRlAWhZ77rUK0MRGA83-zW5NVhxJ1RgdfcfGOYr8rI,16267
36
- glaip_sdk/client/main.py,sha256=tELAA36rzthnNKTgwZ6lLPb3Au8Wh1mF8Kz-9N-YtCg,8652
37
- glaip_sdk/client/mcps.py,sha256=-O-I15qjbwfSA69mouHY6g5_qgPWC4rM98VJLpOkh1A,8975
38
- glaip_sdk/client/run_rendering.py,sha256=fXUj1FBw8n-nAzjI_zaG7-Ap_UXXe0z4tMdL7m2R7Ek,9213
39
- glaip_sdk/client/tools.py,sha256=rWxfNO30sS468513IoE5PfEaqNq6HBwmcHVh4FzhvYQ,17532
40
- glaip_sdk/client/validators.py,sha256=NtPsWjQLjj25LiUnmR-WuS8lL5p4MVRaYT9UVRmj9bo,8809
41
- glaip_sdk/config/constants.py,sha256=B9CSlYG8LYjQuo_vNpqy-eSks3ej37FMcvJMy6d_F4U,888
42
- glaip_sdk/exceptions.py,sha256=ILquxC4QGPFR9eY6RpeXzkQsblfsvZMGFqz38ZjeW3E,2345
43
- glaip_sdk/models.py,sha256=ofhnNOaKK0UK1mDiot73z8qS0-X2IKJXmm7YyOifGzg,8876
44
- glaip_sdk/payload_schemas/__init__.py,sha256=fJamlkpS3IfS9xyKAQaUbnalvrtG5Ied69OUVAA3xvs,395
45
- glaip_sdk/payload_schemas/agent.py,sha256=nlizuv2w4SVzmMJSE90rE6Ll0Hfpcr5hvPsW_NtXCV0,3204
46
- glaip_sdk/rich_components.py,sha256=veaps1hrSkC3nSVunAevvynSux8Cg3yFEDmbJk66p7w,1267
47
- glaip_sdk/utils/__init__.py,sha256=fmVGcUFa7G0CCfSMSqfNU2BqFl36G1gOFyDfTvtJfVw,926
48
- glaip_sdk/utils/agent_config.py,sha256=p3uK5qC0M5uQv9uY7-U8ej11Vh81fwKAPSsYcRoNdlk,7342
49
- glaip_sdk/utils/client_utils.py,sha256=x27kHQNOxvyVN5GLUiymi0eHzkXRKw-x3s0q0VkMvY4,13938
50
- glaip_sdk/utils/display.py,sha256=94s9lYF_8ra8jpeqOkbVrUm8oidtCE6OtucyxLQPKmU,3105
51
- glaip_sdk/utils/general.py,sha256=V5hJrIpYDvDsldU_nChHpuvV2AwhFLUI7Qvcaihq_8A,2270
52
- glaip_sdk/utils/import_export.py,sha256=jEhl5U6hWWMR1wo5AXpV-_jN_56DcWcemOa2UaFHapk,5217
53
- glaip_sdk/utils/rendering/__init__.py,sha256=vXjwk5rPhhfPyD8S0DnV4GFFEtPJp4HCCg1Um9SXfs0,70
54
- glaip_sdk/utils/rendering/formatting.py,sha256=mS4xvbNy1NSH4nXm8mKj03jEXMNinxfbtVJGYf3sXlk,7770
55
- glaip_sdk/utils/rendering/models.py,sha256=AM9JbToyA3zrAzXQYjh6oxjBkgZDfWEbs5MmNKODnOY,2259
56
- glaip_sdk/utils/rendering/renderer/__init__.py,sha256=EXwVBmGkSYcype4ocAXo69Z1kXu0gpNXmhH5LW0_B7A,2939
57
- glaip_sdk/utils/rendering/renderer/base.py,sha256=Tk-N0Fpi4kyuJYb-YaYEAytpho2vcWBKdDmzqIK_Pto,45543
58
- glaip_sdk/utils/rendering/renderer/config.py,sha256=-P35z9JO_1ypJXAqxJ1ybHraH4i-I1LPopeW3Lh7ACE,785
59
- glaip_sdk/utils/rendering/renderer/console.py,sha256=4cLOw4Q1fkHkApuj6dWW8eYpeYdcT0t2SO5MbVt5UTc,1844
60
- glaip_sdk/utils/rendering/renderer/debug.py,sha256=FEYxAu4ZB0CjrJKevqQ2TKDgElA2cf6GqZXCNm12sNQ,3721
61
- glaip_sdk/utils/rendering/renderer/panels.py,sha256=N0Z6UZt3FUTxakRzHdOef1i3UnMR_Zr_TAvw0_MRpnQ,3363
62
- glaip_sdk/utils/rendering/renderer/progress.py,sha256=i4HG_iNwtK4c3Gf2sviLCiOJ-5ydX4t-YE5dgtLOxNI,3438
63
- glaip_sdk/utils/rendering/renderer/stream.py,sha256=1RP5TIV7tqg07X9gPN053XeabFGVT4jPplxaoPU0L38,8601
64
- glaip_sdk/utils/rendering/steps.py,sha256=V7xFoJM_B-nWT1wMdcXGN5ytCrDTxEzKcX_YCWyJqkk,9051
65
- glaip_sdk/utils/resource_refs.py,sha256=0YzblJNfRhz9xhpaKE9aE68XEV-6_ssr0fIkiMVOka0,5489
66
- glaip_sdk/utils/rich_utils.py,sha256=-Ij-1bIJvnVAi6DrfftchIlMcvOTjVmSE0Qqax0EY_s,763
67
- glaip_sdk/utils/run_renderer.py,sha256=d_VMI6LbvHPUUeRmGqh5wK_lHqDEIAcym2iqpbtDad0,1365
68
- glaip_sdk/utils/serialization.py,sha256=AFbucakFaCtQDfcgsm2gHZ1iZDA8OaJSZUsS6FhWFR0,12820
69
- glaip_sdk/utils/validation.py,sha256=QNORcdyvuliEs4EH2_mkDgmoyT9utgl7YNhaf45SEf8,6992
70
- glaip_sdk-0.0.19.dist-info/METADATA,sha256=CxTXRqseeY6CsuhudOT_ddbxuK5WLfkkM6oSaaMSxdY,5164
71
- glaip_sdk-0.0.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
72
- glaip_sdk-0.0.19.dist-info/entry_points.txt,sha256=EGs8NO8J1fdFMWA3CsF7sKBEvtHb_fujdCoNPhfMouE,47
73
- glaip_sdk-0.0.19.dist-info/RECORD,,